基于Labview的声卡开发教程-陈映纯_第1页
基于Labview的声卡开发教程-陈映纯_第2页
基于Labview的声卡开发教程-陈映纯_第3页
基于Labview的声卡开发教程-陈映纯_第4页
基于Labview的声卡开发教程-陈映纯_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于LabVIEW的声卡数据采集系统的开发教程在虚拟仪器系统中,信号的输入环节一般采用数据采集卡实现。商用的数据采集卡具有完整的数据采集电路和计算机借口电路,但一般比较昂贵,计算机自带声卡是一个优秀的数据采集系统,它具有A/D和D/A转换功能,不仅价格低廉,而且兼容性好、性能稳定、通用性强,软件特别是驱动程序升级方便。如被测对象的频率在音频范围内,同时对采样频率要求不是太高,则可考虑利用声卡构建一个数据采集系统。从数据采集的角度看声卡1.1声卡的作用从数据采集的角度来看,声卡是一种音频范围内的数据采集卡,是计算机与外部的模拟量环境联系的重要途径。声卡的主要功能包括录制与播放、编辑和处理、MID

2、I接口三个部分。1.2声卡的硬件结构图1是一个声卡的硬件结构示意图。一般声卡有45个对外接口。图1 声卡的硬件结构示意图声卡一般有Line In 和Mic In 两个信号输入,其中Line In为双通道输入,Mic In仅作为单通道输入。后者可以接入较弱信号,幅值大约为0.020.2V。声音传感器(采用通用的麦克风)信号可通过这个插孔连接到声卡。若由Mic In 输入,由于有前置放大器,容易引入噪声且会导致信号过负荷,故推荐使用Line In ,其噪声干扰小且动态特性良好,可接入幅值约不超过1.5V的信号。另外,输出接口有2个,分别是Wave Out和SPK Out。Wave Out(或Lin

3、e Out)给出的信号没有经过放大,需要外接功率放大器,例如可以接到有源音箱;SPK Out给出的信号是通过功率放大的信号,可以直接接到喇叭上。这些接口可以用来作为双通道信号发生器的输出。1.3声卡的工作原理声音的本质是一种波,表现为振幅、频率、相位等物理量的连续性变化。声卡作为语音信号与计算机的通用接口,其主要功能就是将所获取的模拟音频信号转换为数字信号,经过DSP音效芯片的处理,将该数字信号转换为模拟信号输出。输入时,麦克风或线路输入(Line In)获取的音频信号通过A/D转换器转换成数字信号,送到计算机进行播放、录音等各种处理;输出时,计算机通过总线将数字化的声音信号以PCM(脉冲编码

4、调制)方式送到D/A转换器,变成模拟的音频信号,进而通过功率放大器或线路输出(Line Out)送到音箱等设备转换为声波。1.4声卡的配置及硬件连接使用声卡采集数据之前,首先要检查Line In 和Mic In的设置。如图2,打开“音量控制”面板,在“选项”的下拉菜单中选择“属性”,得到如图3的对话框,在此对话框上选择“录音”,并配置列表中的选项即可。可以通过控制线路输入的音量来调节输入的信号的幅度。图2 音量控制面板图3 音量控制面板属性更改及录音控制面板声卡测量信号的引入应采用音频电缆或屏蔽电缆以降低噪声干扰。若输入信号电平高于声卡所规定的最大输入电平,则应该在声卡输入插孔和被测信号之间配

5、置一个衰减器,将被测信号衰减至不大于声卡最大允许输入电平。一般采用两种连接线:a.一条一头是3.5mm的插孔,另一头是鳄鱼夹的连接线;b.一条双头为3.5mm插孔的音频连接线。我们也可以使用坏的立体耳机做一个双通道的输入线,剪去耳机,保留线和插头即可。声卡的主要技术参数2.1采样位数采样位数可以理解为声卡处理声音的 HYPERLINK /view/194157.htm t _blank 解析度。这个数值越大,解析度就越高,录制和回放的声音就越真实。我们首先要知道:电脑中的声音文件是用数字0和1来表示的。所以在电脑上录音的本质就是把模拟声音信号转换成数字信号。反之,在播放时则是把数字信号还原成模

6、拟声音信号输出。声卡的位是指声卡在采集和播放声音文件时所使用数字声音信号的二进制位数。声卡的位客观地反映了数字声音信号对输入声音信号描述的准确程度。8位代表2的8次方256,16位则代表2的16次方64。比较一下,一段相同的音乐信息,16位声卡能把它分为64个精度单位进行处理,而8位声卡只能处理256个精度单位,造成了较大的信号损失,最终的采样效果自然是无法相提并论的。位数越高,在定域内能表示的声波振幅的数目越多,记录的音质也就越高。2.2采样频率每秒钟采集声音样本的数量。采集频率越高,记录的声音波形就越准确,保真度就越高。但采样数据量相应变大,要求的存储空间也越多。目前,声卡的最高采样频率是

7、44.1KHz,有些能达96KHz。一般将采样频率设为4挡,分别是44.1KHz、22.05KHz、11.025KHz、8KHz。2.3缓冲区与一般数据采集卡不同,声卡面临的D/A和A/D任务通常是连续的。为了在一个简洁的结构下较好地完成某个任务,声卡缓冲区的设计有其独到之处。为了节省CPU资源,计算机的CPU采用了缓冲区的工作方式。在这种工作方式下,声卡的A/D、D/A都是对某一缓冲区进行操作。一般声卡使用的缓冲区长度的默认值是8192字节(老师,我们现在的声卡还是这个字节吗?),也可以设置成8192字节或其整数倍大小的缓冲区,这样可以较好地保证声卡与CPU的协调工作。声卡一般只对20Hz2

8、0KHz的音频信号有较好的响应,这个频率响应范围已经满足了音频信号测量的要求。2.4基准电压(老师,这是新加的!)声卡不提供基准电压,因此无论是A/D还是D/A,在使用时,都需要用户参照基准电压进行标定。目前一般的声卡最高采样频率可达96KHz;采样位数可达13位甚至32位;声道数为2,即立体声双声道,可同时采集两路信号;每路输入信号的最高频率可达22.05KHz,输出16为的数字音频信号,而16位数字系统的信噪比可达96dB。LabVIEW中有关声卡的控件介绍 利用声卡作为声音信号的DAQ卡,可以方便快捷地穿件一个采集声音信号的VI。与声音信号相关的函数节点位于程序框图下【函数】选版下【编程

9、】函数选版的【图形与声音】函数子选版的【声音】函数选版的各子选版,如图4所示图 4 LabVIEW中声卡控件下面主要介绍【声音】/【输入】控件选板中相关控件的作用。配置声音输入 配置声音输入设备(声卡)参数,用于获取数据并且将数据传送至缓冲区。启动声音输入采集 开始从设备上采集数据,只有停止声音输入采集已经被调用时,才需要使用该VIs。声音输入清零 停止声音采集,清除缓冲区,返回到任务的默认状态,并且释放与任务有关的资源。配置声音输出 用于配置声音输出设备的参数,使用“写入声音输出”VI将声音写入设备。写入声音输出 将数据写入声音输出设备,如要连续写入,必须使用配置声音输出VI配置设备,必须手

10、动选择所需多态实例。声音输出清零 将任务返回到默认的未配置状态,并清空与任务相关的资源,任务变为无效。此外,还有众多的声音文件的打开和关闭等函数节点,在此不一一介绍,读者可参考LabVIEW帮助窗口进行了解。另外在程序框图下【Express】下【输入】下的【声音采集】及【输出】下的【播放波形】也是与声音信号相关的函数节点,如图5所示。图 5 LabVIEW中Express下的声卡控件应用程序举例4.1声音的基本采集利用声卡采集声音信号,其程序的基本实现过程如图6所示。图6 声卡采集程序流程图4.1.1 VIs声音采集本案例通过采集由Line In 输入的声音信号,练习声音采集的过程。操作步骤1

11、 执行【开始】/【程序】/National Instruments LabVIEW8.5】命令,进入LabVIEW8.5的七栋界面。2 在启动界面下,执行【文件】/【新建VI】菜单命令,创建一个新的VI,切换到前面板设计窗口下,移动光标到前面板设计区,打开【空间】/【新式】/【图形显示控件】控件选板,选择一个“波形图”控件,放置到前面板设计区,编辑其标签为“声音信号波形”并调整它的大小,如图7所示。图7 波形图标签编辑3 切换到程序框图设计窗口下,打开【函数】/【编程】/【图形与声音】/【声音】/【输入】函数选板,在程序框图设计区放置一个“配置声音输入”节点、一个“启动声音输入采集”节点、一个

12、“读取声音输入”节点、一个“停止声音输入采集”节点、一个“声音输入清零”节点,如图8所示。图8 声音输入控件4 移动光标到各节点上。可以在“即时帮助”窗口中看到各节点的端口及解释。如“配置声音输入”节点,如图9所示。图9 “配置声音输入”节点5 分别移动光标到“配置声音输入”节点的“设备ID”、“声音格式”、“采样模式”的输入端口上,单击鼠标右键,从弹出右键快捷菜单中,执行【创建】/【输入控件】菜单命令,通过端口创建相应的输入节点,如图10所示。图10 “配置声音输入”节点设置6 移动光标到“声音输入清零”节点的“错误输出”端口上,单击鼠标右键,从弹出的右键快捷菜单中执行【创建】/【显示控件】

13、菜单命令,创建相应的显示节点,如图11所示图11 “声音输入清零”节点设置7 打开【函数】/【编程】/【结构】函数选板,选择“While循环”节点,放置到程序框图设计区,在“While循环”的循环条件端口创建一个输入控件,移动光标到“While循环”的循环条件节点的输入端,单击鼠标右键,从弹出的右键快捷菜单中执行【创建】/【输入控件】菜单命令,创建相应的输入节点,并按图12所示,完成程序框图的设计。图12 程序框图的设计8 切换设计界面到前面板,可以看到与程序框图设计区节点相对应的控件对象,调整它们的大小和位置,美化界面。9 单击工具栏上程序运行按钮,并对着传声器输入语音或一段音乐,即可在波形

14、图空间中查看声音信号的波形,其中的一个运行界面如图13所示。图13 程序运行界面Express VIs声音信号采集本案例通过将采集到的声音信号显示在波形图中来学习“Expree输入”中“声音采集”函数的应用。在练习的过程中,注意比较与“编程”中“声音输入”函数的异同。操作步骤1 创建一个新的VI,切换到前面板设计窗口下,在前面板设计区放置一个“波形图”,编辑其标签为“声音信号波形”并调整它的大小。2 切换到程序框图设计窗口下,打开【Express】/【输入】函数选板,在程序框图设计区放置一个“声音采集”函数节点,并按图14所示设置各参数值。图14 配置声音采集设置面板3 移动光标到“声音采集”

15、节点上,可以看到各端口的解释,根据节点的输入端“采样率”、“设备”、“通道数量”、“分辨率”及“持续时间”端口,创建相应的输入控件,如图15所示图15 Express中声音采集控件及其设置4 在程序框图设计区放置一个“While循环”节点,并按图16完成程序框图的设计。图16 程序框图设计5 切换到前面板设计窗口下,调整各空间的大小和位置,并设置输入控件的输入参数,然后单击前面板工具栏上程序运行按钮,开始运行程序,并对着传声器输入语音或一段音乐,即可在波形图空间中查看声音信号的波形,其中的一个运行界面如图17所示。图17 程序运行界面4.2双踪示波器图18、19是一个用声卡实现的双踪示波器,它

16、可以实现测试信号波形、单频测量等。图18 用声卡实现的双踪示波器界面图19 双踪示波器程序框图设计以上程序框图通过不同的条件结构实现不同的控制。在程序设计中,利用【函数】/【Express】/【信号操作】函数面板中 “拆分信号”节点,如图20所示。 图 20 “拆分信号”节点由于由Line In 采集到的声音信号,其左右声道的声音信号是并接的,利用“拆分信号”节点,可以实现不同声道信号分离的目的,以达到对不同声道信号进行不同操作如增益、幅度改变等。由于直接由“读取声音输入”节点输入的声音实则是动态数据,要对采集到的信号进行增益等的控制,必须进行数据类型的转化,在本设计中,采用“从动态数据转换”

17、节点实现目的,如图21所示。图21 “从动态数据转换”节点4.3基本信号发生器图22是一个用声卡实现的基本信号发生器,它可以产生正弦波、矩形波等,并实现频率、幅值等的控制。图22 基本信号发生器界面图23为基本信号发生器的程序框图设计图23 基本信号发生器程序框图设计在本程序的设计中,首先应该注意到,采用程序框图设计窗口下【函数】/【编程】/【图形与声音】/【声音】/【输出】控件面板的相应节点控件,并跟“输入”控件相类似地进行设置。为实现在运行界面当中选择产生不同的波形,我们利用到前面板设计窗口下【空间】/【新式】/【下拉列表与枚举】空间选板中的“枚举”控件,如图24所示。图24 【枚举】控件

18、 移动光标到前面板设置的“枚举”控件上,单击鼠标右键,执行弹出的快捷菜单【属性】命令,打开【枚举属性】对话框,切换到“编辑项”选项卡,按图25所示对枚举项进行编辑。图25 【枚举属性】编辑项的编辑在程序框图设计区,将“枚举”节点作为【条件结构】的条件,两个节点连接后,可以看到条件结构的“条件选择标签”的条件选择变为“正弦波”、“方波”,且“正弦波”为默认条件,如图26所示。图26 “条件结构”的连接移动光标到条件结构的“选择器标签”上,单击鼠标右键,从弹出的右键快捷菜单中,执行【为每个值添加分支】菜单命令,命令执行后,从条件结构的“选择器标签”中可以看到,可选条件变为如图27所示。图27 条件

19、结构的“选择器标签”在程序设计窗口下,选择【函数】/【编程】/【波形】/【模拟波形】/【波形生成】控件面板中的“正弦波形”、“方波波形”等节点,放置在条件结构内,完成频率、幅度、相位等相应控件的创建,便可以实现产生不同波形的需要。4.4简易频谱分析仪 本案例通过对采集到的声音信号进行功率谱分析,练习声音信号的采集和分析过程。图28 简易频谱分析仪运行界面在程序的前面板可以定性观察和定量读取通道0和通道1的幅值和相位,同时可以实现将所采集到的频谱进行保存。图29 简易频谱分析仪程序框图设计本例只是简单介绍了声音信号采集和分析的过程,用户可以在此基础上设计一个功能强大的声音信号分析仪。【参考文献】

20、1侯国屏,王坤.LabVIEW7.1编程与虚拟仪器设计M.北京:清华大学出版社,2005.2 邓焱,王磊.LabVIEW7.1测试技术与仪器应用.北京:机械工业出版社,2004.3 杨乐平,李海涛.LabVIEW程序设计与应用(第2版).北京.电子工业出版社.2005.4 岂兴明,周建兴.LabVIEW8.2中文版入门与典型实例(修订版).北京.人民邮电出版社.2010.5 刘刚,王立香.LabVIEW8.20中文版编程及应用.北京.电子工业出版社.2008.6 马海瑞,周爱军.基于声卡的LabVIEW数据采集与分析系统设计.微计算机信息(测控自动化).2005.第21卷第9-1期.7 陈晓玲

21、,师学明.基于LabVIEW的声卡虚拟仪器性能测试与实验.实验室研究与探索,第29卷,第1期.2010.8 刘凤,刘志华.基于声卡的数据采集系统研究.计算机与现代化.2010.第7期.9 李宗莲,乜国荃.基本LabVIEW的虚拟示波器的设计与实现.研究与开发.2009.05.10 郭艳清,路向阳.基本LabVIEW的虚拟示波器设计.电子工程师.2008.第34卷第4期.11 吴先球,刘朝辉.LabVIEW环境下基于声卡的虚拟示波器软件设计.计算机应用与软件.2007.05.第24卷第3期.12 马海瑞,田树森.基于声卡的LabVIEW虚拟信号发生器设计.国外电子测量技术.13 陈东方,吴国红.

22、一个基于声卡的LabVIEW虚拟示波器.传感器与仪器仪表.1008-0570(2008)09-1-0189-02.14 黄夫海,李岩.基于声卡的虚拟信号发生器和频谱分析仪.计算机与网络.附录资料:不需要的可以自行删除 C语言曲线函数像素函数putpixel() 画像素点函数 getpixel()返回像素色函数 直线和线型函数line() 画线函数 lineto() 画线函数 linerel() 相对画线函数 setlinestyle() 设置线型函数 getlinesettings() 获取线型设置函数 setwritemode() 设置画线模式函数 多边形函数HYPERLINK /view/

23、553113.htmrectangle() 画矩形函数 bar() 画条函数 bar3d() 画条块函数 drawpoly() 画多边形函数 圆、弧和曲线函数getaspectratio()获取纵横比函数 circle()画圆函数 arc() 画圆弧函数 ellipse()画HYPERLINK /view/36981.htm椭圆弧函数 fillellipse() 画椭圆区函数 pieslice() 画扇区函数 sector() 画椭圆扇区函数 getarccoords()获取圆弧坐标函数 填充函数setfillstyle() 设置填充图样和颜色函数 setfillpattern() 设置用户图

24、样函数 floodfill() 填充闭域函数 fillpoly() 填充多边形函数 getfillsettings() 获取填充设置函数 getfillpattern() 获取用户图样设置函数 图像函数imagesize() 图像存储大小函数 getimage() 保存图像函数 putimage() 输出图像函数 图形和图像函数对许多图形HYPERLINK /view/330120.htm应用程序,直线和HYPERLINK /view/400.htm曲线是非常有用的。但对有些图形只能靠操作单个像素才能画出。当然如果没有画像素的功能,就无法操作直线和曲线的函数。而且通过大规模使用像素功能,整个图

25、形就可以保存、写、擦除和与屏幕上的原有图形进行叠加。 (一) 像素函数putpixel() 画像素点函数功能: 函数putpixel() 在图形模式下屏幕上画一个像素点。 用法: 函数调用方式为void putpixel(int x,int y,int color); 说明: 参数x,y为像素点的坐标,color是该像素点的颜色,它可以是颜色符号名,也可以是整型色彩值。 此函数相应的HYPERLINK /view/668911.htm头文件是graphics.h 返回值: 无 例: 在屏幕上(6,8)处画一个红色像素点: putpixel(6,8,RED); getpixel()返回像素色函数

26、功能: 函数getpixel()返回像素点颜色值。 用法: 该函数调用方式为int getpixel(int x,int y); 说明: 参数x,y为像素点坐标。 函数的返回值可以不反映实际彩色值,这取决于HYPERLINK /view/1120949.htm调色板的设置情况(参见setpalette()函数)。 这个函数相应的头文件为graphics.h 返回值: 返回一个像素点色彩值。 例: 把屏幕上(8,6)点的像素颜色值赋给变量color。 color=getpixel(8,6); (二) 直线和线型函数有三个画直线的函数,即line(),lineto(),linerel()。这些直线

27、使用整型坐标,并相对于当前图形视口,但不一定受视口限制,如果视口裁剪标志clip为真,那么直线将受到视口边缘截断;如果clip为假,即使终点坐标或新的当前位置在图形视口或屏幕极限之外,直线截断到屏幕极限。 有两种线宽及几种线型可供选择,也可以自己定义线图样。下面分别介绍直线和线型函数。 line() 画线函数功能: 函数line()使用当前绘图色、线型及线宽,在给定的两点间画一直线。 用法: 该函数调用方式为void line(int startx,int starty,int endx,int endy); 说明: 参数startx,starty为起点坐标,endx,endy为终点坐标,函数

28、调用前后,图形状态下屏幕光标(一般不可见)当前位置不改变。 此函数相应的头文件为graphics.h 返回值: 无 例: 见函数60.linerel()中的实例。 lineto() 画线函数功能: 函数lineto()使用当前绘图色、线型及线宽,从当前位置画一直线到指定位置。 用法: 此函数调用方式为void lineto(int x,int y); 说明: 参数x,y为指定点的坐标,函数调用后,当前位置改变到指定点(x,y)。 该函数对应的头文件为graphics.h 返回值: 无 例: 见函数60.linerel()中的实例。 linerel() 相对画线函数功能: 函数linerel()

29、 使用当前绘图色、线型及线宽,从当前位置开始,按指定的水平和垂直偏移距离画一直线。 用法: 这个函数调用方式为void linerel(int dx,int dy); 说明: 参数dx,dy分别是水平偏移距离和垂直偏移距离。 函数调用后,当前位置变为增加偏移距离后的位置,例如,原来的位置是(8,6),调用函数linerel(10,18)后,当前位置为(18,24)。 返回值:无 例: 下面的程序为画线函数调用实例: #i nclude void main() int driver,mode; driver=DETECT; mode=0; initgraph(&driver,&mode,); s

30、etcolor(15); line(66,66,88,88); lineto(100,100); linerel(36,64); getch(); restorecrtmode(); setlinestyle() 设置线型函数功能: setlinestyle() 为画线函数设置当前线型,包括线型、线图样和线宽。 用法: setlinestyle() 函数调用方式为void setlinestyle(int stly,unsigned pattern,int wigth); 说明: 参数style为线型取值,也可以用相应名称表示,如表1-10中所示。 参数pattern用于自定义线图样,它是16

31、位(bit)字,只有当style=USERBIT_LINE(值为1)时,pattern的值才有意义,使用用户自定义线图样,与图样中“1”位对应的像素显示,因此,pattern=0 xFFFF,则画实线;pattern=0 x9999,则画每隔两个像素交替显示的虚线,如果要画长虚线,那么pattern的值可为0 xFF00和0 xF00F,当style不为USERBIT_LINE值时,虽然pattern的值不起作用,但扔须为它提供一个值,一般取为0。 参数wigth用来设定线宽,其取值见表1-11,表中给出了两个值,即1和3,实际上,线宽取值为2也是可以接受的。 若用非法参数调用setlines

32、tyle()函数,那么graphresult()会返回错误代码,并且当前线型继续有效。 Turbo C提供的线型与线宽定义在头文件graphics.h中,表1-10和1-11分别列出了参数的取值与含义。 表1-10 线型 名称取值含义SOLID_LINE0实线DOTTED_LINE1点线CENTER_LINE2中心线DASHED_LINE3虚线USERBIT_LINE4用户自定义线型表1-11 线宽 名 称取 值说 明NORM_WIDTH(常宽)1一个像素宽(缺省值)THICK_WIDTH(加宽)3三个像素宽这个函数的头文件是graphics.h 返回值: 无 例: 下面的程序显示了BC中所提

33、供的线型图样: #i nclude void main() int driver,mode;i; driver=DETECT; mode=0; initgraph(&driver,&mode,); for(i=0;i4;i+) setlinestyle(i,0,1); line(i*50,200,i*50+60,200) ; getch(); restorecrtmode(); getlinesettings() 获取线型设置函数功能: 函数getlinesettings() 用当前设置的线型、线图样和线宽填 写linesettingstype型结构。 用法: 函数调用方式为void getl

34、inesettings(struct linesettingstype *info); 说明: 此函数调用执行后,当前的线型、线图样和线宽值被装入info指向的结构里,从而可从该结构中获得线型设置。 linesettingstype型结构定义如下: struct linesettingstype int linestyle; unsigned upattern; int thickness; ; 其中linestyle用于存放线型,线型值为表1-10中的各值之一。 upattern用为装入用户自定义线图样,这是16位字,每一位等于一个像素,如果哪个位被设置,那么该像素打开,否则关闭。 thic

35、kness为线宽值存放的变量,可参见表1-11。 getlinesettings()函数对应的头文件为graphics.h 返回值: 返回的线型设置存放在info指向的结构中。 例: 把当前线型的设置写入info结构: struct linesettingstype info; getlinesettings(&info); setwritemode() 设置画线模式函数功能: 函数setwritemode() 设置画线模式 用法: 函数调用方式为 void setwritemode()(int mode); 说明: 参数mode只有两个取值0和1,若mode为0,则新画的线将覆盖屏幕上原有的

36、图形,此为缺省画线输出模式。如果mode为1,那么新画的像素点与原有图形的像素点先进行异或(XOR)运算,然后输出到屏幕上,使用这种画线输出模式,第二次画同一图形时,将擦除该图形。调用setwritemode()设置的画线输出模式只影响函数line(),lineto(),linerel(),recangle()和drawpoly()。 setwritemode()函数对应的头文件是graphics.h 返回值: 无 例: 设置画线输出模式为0: setwritemode(0); (三)、多边形函数对多边形,无疑可用画直线函数来画出它,但直接提供画多边形的函数会给用户很大方便。最常见的多边形有矩

37、形、矩形块(或称条形)、多边形和多边形块,我们还把长方形条块也放到这里一起考虑,虽然它不是多边形,但它的特例就是矩形(块)。下面直接介绍画多边形的函数。 rectangle() 画矩形函数功能: 函数rectangle() 用当前绘图色、线型及线宽,画一个给定左上角与右下角的矩形(正方形或长方形)。 用法: 此函数调用方式为void rectangle(int left,int top,int right,int bottom); 说明: 参数left,top是左上角点坐标,right,bottom是右下角点坐标。如果有一个以上角点不在当前图形视口内,且裁剪标志clip设置的是真(1),那么调

38、用该函数后,只有在图形视口内的矩形部分才被画出。 这个函数对应的头文件为graphics.h 返回值: 无 例: 下面的程序画一些矩形实例: #i nclude void main() int driver,mode; driver=DETECT; mode=0; initgraph(&driver,&mode,); rectangle(80,80,220,200); rectangle(140,99,180,300); rectangle(6,6,88,88); rectangle(168,72,260,360); getch(); restorecrtmode(); bar() 画条函数功

39、能: 函数bar()用当前填充图样和填充色(注意不是给图色)画出一个指定上左上角与右下角的实心长条形(长方块或正方块),但没有四条边线)。 用法: bar()函数调用方式为void bar(int left,int top,int right,int bottom); 说明: 参数left,topright,bottom分别为左上角坐标与右下角坐标,它们和调用函数rectangle()的情形相同,调用此函数前,可用setfillstyle()或setfillpattern()设置当前填充图样和填充色。 注意此函数只画没有边线的条形,如果要画有边线的的条形,可调用下面的函数bar3d()来画,并

40、将深度参数设为0,同时topflag参数要设置为真,否则该条形无顶边线。 这 应的头文件为graphics.h 返回值: 无 例: 见函数bar3d()中的实例。 bar3d() 画条块函数功能: 函数bar3d() 使用当前绘图色、线型及线宽画出三维长方形条块,并用当前填充图样和填 充色填充该三维条块的表面。 用法: 此函数调用方式为void bar3d(int left,int top,int right,int bottom,int depth,int topflag); 说明: 参数left,top,right,bottom分另为左上角与右下角坐标,这与bar()函数中的一样。参数de

41、pth为条块的深度,以像素为单位,通常按宽度的四分之一计算。深度方向通过屏显纵横比调节为约45度(即这时x/y比设置为1:1)。 参数topflag相当于一个HYPERLINK /view/46060.htm布尔参数,如果设置为1(真)那么条块上放一顶面;若设置为0(假),则三维条形就没有顶面,这样可使多个三维条形叠加在一起。 要使图形更加美观,可利用函数floodfill()或setfillpattern()来选择填充图样和填充色(参见本小节(五)填充函数 )。 bar3d()函数对应的头文件为graphics.h 返回值: 无 例: 下面的程序画一个条形和条块: #i nclude voi

42、d main() int driver,mode; driver=DETECT; mode=0; initgraph(&driver,&mode,); setfillstyle(SOLID-FILL,GREEN); bar(60,80,220,160); setfillstyle(SOLID-FILL,RED); bar3d(260,180,360,240,20,1); getch(); restorecrtmode(); drawpoly() 画多边形函数功能: 函数drawpoly() 用当前绘图色、线型及线宽,画一个给定若干点所定义的多边形。 用法: 此函数调用方式为void drawp

43、oly(int pnumber,int *points); 说明: 参数pnumber为多边形的顶点数;参数points指向整型HYPERLINK /view/209670.htm数组,该数组中是多边形所有顶点(x,y)坐标值,即一系列整数对,x坐标值在前。显然整型数组的维数至少为顶点数的2倍,在定义了多边形所有顶点的数组polypoints时,顶点数目可通过计算sizeof(polypoints)除以2倍的sizeof(int)得到,这里除以2倍的原因是每个顶点有两个整数坐标值。另外有一点要注意,画一个n个顶点的闭合图形,顶点数必须等于n+1,并且最后一点(第n+1)点坐标必须等于第一点的坐

44、标。 drawpoly()函数对应的头文件为grpahics.h 返回值: 无 例: 下面的程序画一个封闭星形图与一个不封闭星形图: #i nclude void main() int driver,mode; static int polypoints118=100,100,110,120,100,130,120,125,140,140,130,120, 140,110,120,115,100,100; static int polypoints218=180,100,210,120,200,130,220,125,240,140,230,120, 240,110,220,115,220,1

45、10; driver=DETECT; mode=0; initgraph(&driver,&mode,); drawpoly(9,polypoints1); drawpoly(9,polypoints2); getch(); restorecrtmode(); (四)、 圆、弧和曲线函数在一个屏幕上画得很圆的图形到另一个屏幕上可能被压扁或拉长,这是因为每一种显示卡与之相应的显示模式都有一个纵横比。纵横比是指像素的水平方向大小与垂直方向大小的比值。如VGA显示卡由于偈素基本上是正方形,所以纵横比为1.000。 为了保证几何图形基本按预计情况显示在屏幕上,用屏显的纵横比来计算和纠正不同硬件及显示卡

46、产生的畸变。计算纵横比所需要的水平方向和垂直方向的比例系数可调用函数getaspectratio()获得。 getaspectratio()获取纵横比函数功能: 函数getaspectratio()返回x方向和y方向的比例系数,用这两个整型值可计算某一特定屏显的纵横比。 用法: 此函数调用方式为void getaspectratio(int xasp,int yasp); 说明: 参数xasp指向的变量存放返回的x方向比例系数;参数yasp指向的变量存放返回的y方向比例系数。通常y方向比例系数为10 000, x方向比例系数不大于10 000(这是因为大多数屏幕像素高比宽长)。 注意纵横比自动

47、用作下面函数arc(),circle()和pieslice()中的标尺因子,使屏幕上圆或弧正常显示。但用ellipse()函数画椭圆必须调用本函数获取纵横比作为标尺因子,否则不予调整。纵横比可用于其它几何图形,目的是校正和显示图形。 getaspectratio()函数对应的头文件为graphics.h 返回值: 返回x与y方向比例系数分别存放在xasp和yasp所指向的变量中。 例: 下面的程序显示纵横比: int xasp,yasp; float aspectratio; getaspectratio(&xasp,&yasp); aspectratio=xasp/yasp; printf(

48、aspect ratio: %f,aspectratio); circle()画圆函数功能: 函数circle()使用当前绘图色并以实线画一个完整的圆。 用法:该函数调用方式为void circle(int x,int y,int radius); 说明: 参数x,y为圆心坐标,radius为圆半径,用像素个素表示。注意,调用circle()函数画圆时不用当前线型。 不同于ellipse()函数,只用单个半径radius参数调用circle()函数,故屏显纵横比可以自动调节,以产生正确的显示图。 此函数对应的头文件为graphics.h 返回值: 无 例: 画六个同心圆,圆心在(100,100

49、)。 #i nclude void main() int driver,mode; driver=DETECT; mode=0; initgraph(&driver,&mode,); circle(100,100,10); circle(100,100,20); circle(100,100,30); circle(100,100,40); circle(100,100,50); circle(100,100,60); getch(); restorecrtmode(); arc() 画圆弧函数功能: 函数arc()使用当前绘图色并以实线画一圆弧。 用法: 函数调用方式为void arc(in

50、t x,int y,int startangle,int endangle,int radius); 说明: 参数x,y为圆心坐标,startangle与endangle分别为起始角与终止角,radius为半径。圆心坐标和半径以像素个数给出,起始角和终止角以度为单位,0度位于右边,90度位于顶部,180度位于左边,底部是270度。同往常一样,360度与0度重合。角度按逆时针方向增加,但并不要求终止角一定比起始角大。例如指定300度和90度分别为起始角和终止角,与指定300度和450度分别为起始角和终止角可画出相同的弧。大于360度可作为参数,它将被化到0度360度范围里。函数arc()能画封闭

51、圆,只要取起始角为0度,终止角为360度即可。此函数中,屏显纵横比可自动调节。 arc()函数对应的头文件为graphics.h 返回值: 无 例: 以(200,200)为圆心,100为半径,从0度到120度画圆弧: #i ncludegraphics.h void main() int driver,mode; driver=DETECT; mode=0; initgraph(&driver,&mode,); setcolor(WHITE); arc(200,200,0,120,100); getch(); restorecrtmode(); graphics.h头文件的内容:/* grap

52、hics.h Definitions for Graphics Package. Copyright (c) Borland International 1987,1988 All Rights Reserved. */ #if _STDC_ #define _Cdecl #else #define _Cdecl cdecl #endif #if !defined(_GRAPHX_DEF_) #define _GRAPHX_DEF_ enum graphics_errors /* graphresult error return codes */ grOk = 0, grNoInitGraph

53、 = -1, grNotDetected = -2, grFileNotFound = -3, grInvalidDriver = -4, grNoLoadMem = -5, grNoScanMem = -6, grNoFloodMem = -7, grFontNotFound = -8, grNoFontMem = -9, grInvalidMode = -10, grError = -11, /* generic error */ grIOerror = -12, grInvalidFont = -13, grInvalidFontNum = -14, grInvalidVersion =

54、 -18 ; enum graphics_drivers /* define graphics drivers */ DETECT, /* requests autodetection */ CGA, MCGA, EGA, EGA64, EGAMONO, IBM8514, /* 1 - 6 */ HERCMONO, ATT400, VGA, PC3270, /* 7 - 10 */ CURRENT_DRIVER = -1 ; enum graphics_modes /* graphics modes for each driver */ CGAC0 = 0, /* 320 x200 palet

55、te 0; 1 page */ CGAC1 = 1, /* 320 x200 palette 1; 1 page */ CGAC2 = 2, /* 320 x200 palette 2: 1 page */ CGAC3 = 3, /* 320 x200 palette 3; 1 page */ CGAHI = 4, /* 640 x200 1 page */ MCGAC0 = 0, /* 320 x200 palette 0; 1 page */ MCGAC1 = 1, /* 320 x200 palette 1; 1 page */ MCGAC2 = 2, /* 320 x200 palet

56、te 2; 1 page */ MCGAC3 = 3, /* 320 x200 palette 3; 1 page */ MCGAMED = 4, /* 640 x200 1 page */ MCGAHI = 5, /* 640 x480 1 page */ EGALO = 0, /* 640 x200 16 color 4 pages */ EGAHI = 1, /* 640 x350 16 color 2 pages */ EGA64LO = 0, /* 640 x200 16 color 1 page */ EGA64HI = 1, /* 640 x350 4 color 1 page

57、*/ EGAMONOHI = 0, /* 640 x350 64K on card, 1 256K on card, 4 pages */ HERCMONOHI = 0, /* 720 x348 2 pages */ ATT400C0 = 0, /* 320 x200 palette 0; 1 page */ ATT400C1 = 1, /* 320 x200 palette 1; 1 page */ ATT400C2 = 2, /* 320 x200 palette 2; 1 page */ ATT400C3 = 3, /* 320 x200 palette 3; 1 page */ ATT

58、400MED = 4, /* 640 x200 1 page */ ATT400HI = 5, /* 640 x400 1 page */ VGALO = 0, /* 640 x200 16 color 4 pages */ VGAMED = 1, /* 640 x350 16 color 2 pages */ VGAHI = 2, /* 640 x480 16 color 1 page */ PC3270HI = 0, /* 720 x350 1 page */ IBM8514LO = 0, /* 640 x480 256 colors */ IBM8514HI = 1 /*1024x768

59、 256 colors */ ; /* Colors for setpalette and setallpalette */ #if !defined(_COLORS) #define _COLORS enum COLORS BLACK, /* dark colors */ BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY, DARKGRAY, /* light colors */ LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE ; #endif e

60、num CGA_COLORS CGA_LIGHTGREEN = 1, /* Palette C0 Color Names */ CGA_LIGHTRED = 2, CGA_YELLOW = 3, CGA_LIGHTCYAN = 1, /* Palette C1 Color Names */ CGA_LIGHTMAGENTA = 2, CGA_WHITE = 3, CGA_GREEN = 1, /* Palette C2 Color Names */ CGA_RED = 2, CGA_BROWN = 3, CGA_CYAN = 1, /* Palette C3 Color Names */ CG

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论