




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、长沙理工大学通信原理课程设计报告学 院 专 业 班 级 学 号 学生姓名 指导教师 课程成绩 完成日期 2016年1月8日 课程设计成绩评定学 院 专 业 班 级 学 号 学生姓名 指导教师 课程成绩 完成日期 2016年1月8日 指导教师对学生在课程设计中的评价评分项目优良中及格不及格课程设计中的创造性成果学生掌握课程内容的程度课程设计完成情况课程设计动手能力文字表达学习态度规范要求课程设计论文的质量指导教师对课程设计的评定意见综合成绩 指导教师签字 2016年1月8日课程设计任务书城南学院 通信工程专业 课程名称通信原理课程设计时间2015/2016学年第一学期1719周学生姓名指导老师题
2、 目基于MATLAB的ASK调制解调实现主要内容:利用MATLAB集成环境下的M文件,编写程序来实现ASK的调制解调,要求采样频率为360HZ,并绘制出解调前后的时域和频域波形及叠加噪声时解调前后的时频波形,根据运行结果和波形来分析该解调过程的正确性及信道对信号传输的影响。要求:1)熟悉MATLAB中M文件的使用方法,并在掌握ASK调制解调原理的基础上,编写出ASK调制解调程序。2)绘制出ASK信号解调前后在时域和频域中的波形,并观察解调前后频谱有何变化以加深对ASK信号解调原理的理解。3)对信号叠加噪声,并进行解调,绘制出解调前后信号的时频波形,改变噪声功率进行解调,分析噪声对信号传输造成的
3、影响。 4)在老师的指导下,要求独立完成课程设计的全部内容,并按要求编写课程设计学年论文,能正确阐述和分析设计和实验结果。应当提交的文件:(1)课程设计学年论文。(2)课程设计附件。第 页 共 18 页 庄维 基于MATLAB的ASK调制解调实现基于MATLAB的ASK调制解调实现 学生姓名: 指导老师:摘 要 MATLAB是美国MathWorks公司生产的一个为科学和工程计算专门设计的交互式大型软件,本课程设计主要内容是利用MATLAB集成环境下的M文件,编写程序来实现ASK的调制解调,要求采样频率为360HZ,并绘制出解调前后的时域和频域波形及叠加噪声时解调前后的时频波形,根据运行结果和波
4、形来分析该解调过程的正确性及信道对信号传输的影响。目的是熟悉MATLAB中M文件的使用方法,并在掌握ASK调制解调原理的基础上,编写出2ASK调制解调程序,绘制出ASK信号解调前后在时域和频域中的波形,观察解调前后频谱有何变化以及对信号叠加噪声后的变化。最终得到随着输入信号噪声的增加增大,误码越严重的结论,加深对ASK信号解调原理的理解。关键词 ASK调制解调;时域谱;频域谱;高斯白噪声;信噪比1 引 言通信原理是通信工程专业的一门重要的专业课,是通信工程专业后续专业课的基础,掌握通信原理课程的知识不仅可以打下一个坚实的专业基础,还能提高处理通信系统问题能力和素质。通过本课程设计的ASK振幅键
5、控调制解调,可以进一步理解数字通信的基础理论,有助于加深对通信原理的理解。1.1课程设计目的通过设计基于MATLAB的ASK调制解调实现,让我深入理解和掌握二进制ASK调制解调以及噪声对信号传输的影响1。在通信原理理论知识的基础上加深对ASK调制解调设计原理及实现方法的理解。使我对通信信号波形及频谱有深刻的认识。不仅加强了对课本知识的了解,而且还涉及到了MATLAB编程语言和软件的使用,以及基本的操作常识2。掌握调制解调函数的应用,增强了我动手实践的能力。1.2课程设计要求根据所给的题目,查阅有关资料,掌握数字带通调制技术以及通信原理。学会MATLAB中M文件的编写方法,能应用MATLAB软件
6、中调制解调函数,掌握ASK调制解调原理,根据原理编写出ASK调制解调程序。绘制出ASK信号解调前后在时域和频域中的波形,观察解调前后频谱的变化理解ASK信号解调原理。对二进制基带信号叠加噪声后解调,绘制出解调前后信号的时频波形,然后改变噪声功率进行解调,记录并分析分析噪声对信号传输造成的影响。 根据要求独立完成课程设计学年论文,能正确阐述和分析设计结果并得出结论。1.3课程设计步骤产生数字基带信号并绘制时域谱和频域谱;设置载波频率并绘制其时域谱和频域谱;对信号进行数字调制并绘制时域谱和频域谱;对已调信号进行解调并绘制时域谱和频域谱; 对已调信号加入高斯小噪声并绘制时域谱和频域谱;对加小噪声信号
7、进行解调并绘制时域谱和频域谱;对已调信号加入高斯大噪声并绘制时域谱和频域谱;对加大噪声信号进行解调并绘制时域谱和频域谱;比较当信噪比不同时,误码率大小。2 ASK调制解调原理2.1 ASK调制原理ASK指的是振幅键控方式。这种调制方式是根据信号的不同,调节正弦波的幅度。幅度键控可以通过乘法器和开关电路来实现。载波在数字信号1或0的控制下通或断,在信号为1的状态载波接通,此时传输信道上有载波出现;在信号为0的状态下,载波被关断,此时传输信道上无载波传送。那么在接收端我们就可以根据载波的有无还原出数字信号的1和0。对于二进制幅度键控信号的频带宽度为二进制基带信号宽度的两倍。幅移键控法(ASK)的载
8、波幅度是随着调制信号而变化的,其最简单的形式是,载波在二进制调制信号控制下通断, 此时又可称作开关键控法(OOK)。二进制幅度键控记作2ASK。2ASK是利用代表数字信息“0”或“1”的基带矩形脉冲去键控一个连续的载波,使载波时断时续地输出。有载波输出时表示发送“1”,无载波输出时表示发送“0”。2ASK信号可表示为式中,为载波角频率,s(t)为单极性NRZ矩形脉冲序列其中,g(t)是持续时间、高度为1的矩形脉冲,常称为门函数;为二进制数字 2ASK/OOK信号的产生方法通常有两种:模拟调制(相乘器法)和键控法。本模拟幅度调制的方法用乘法器实现。相应的调制如图2-1和图2-2:乘法器图2-1模
9、拟相乘法图2-2键控/开关法2.2 ASK解调原理2ASK/OOK信号有两种基本的解调方法:非相干解调(包络检波法)和相干解调(同步检测法)。本课程设计要求的是相干解调,如图2-3:带通滤波器相乘器低通滤波器抽样判决器定时脉冲输出图2-3相干解调3 仿真实现过程3.1 ASK信号的产生图3-1二进制基带信号时域谱和频域谱先将源程序创建M文件,自定义路径;编写语句x=ceil(rand(1,100000)-0.5) 生成一段随机的二进制基带信号,其中rand产生随机矩阵,ceil为取整函数;再编写语句FFT1=fft(x,128); FFT1=abs(FFT1)对随机序列进行傅里叶变换并取绝对值
10、。其时域谱和频域谱如图3-1。3.2载波信号波形图3-2载波信号时域谱和频域谱在调制解调系统中,载波信号的频率一般要大于信号源的频率。信号源频率为12 Hz,所以将载波频率设置为36 Hz,编写正弦函数carry=cos(2*pi*Fc*t)并进行频域转换FFT2=fft(carry,256); FFT2=abs(FFT2)。其时域谱和频域谱如图3-2。3.3 ASK调制解调实现编写数字带通调制函数y=dmod(x,Fc,Fd,Fs,ask,2)进行2ASK调制,其中x为输入信号,Fc为载波频率,Fd为码速率,Fs为采样频率,Fs/Fd必须是一个正整数。再进行频域转换FFT3=fft(y,25
11、6); FFT3=abs(FFT3),其时域谱和频域谱如图3-3:图3-3已调信号时域谱和频域谱图3-4解调信号解调时域谱和频域谱编写数字带通调制函数z=ddemod(y,Fc,Fd,Fs,ask,2)进行2ASK解调,其中x为输入信号,Fc为载波频率,Fd为码速率,Fs为采样频率。再进行频域转换FFT4=fft(z,64); FFT4=abs(FFT4),由于调制到解调的信道中没有加入噪声,所以调制前信号(即原始信号)与调制后信号相同,其时域谱和频域谱如图3-4。3.4叠加噪声的ASK调制解调图3-5叠加小噪声调制信号时域谱和频域谱图3-6叠加大噪声调制信号时域谱和频域谱由于信道中的噪声是叠
12、加在信号上的,噪声始终是存在的,通常称它为加性噪声或加性干扰。对已调信号y分别叠加高斯小噪声(信噪比为6)和大噪声(信噪比为-2)则编写Ynt1=awgn(y,6);Ynt2=awgn(y,-2)并进行频域转换,其时域谱和频域谱分别如图3-5和图3-6。图3-7叠加小噪声解调信号时域谱和频域谱图3-8叠加大噪声解调信号时域谱和频域谱对小噪声Ynt1和大噪声信号Ynt2分别解调,编写数字带通调制函数z1=ddemod(Ynt1,Fc,Fd,Fs,ask,2);z2=ddemod(Ynt2,Fc,Fd,Fs,ask,2);并进行频域转换,其时域谱和频域谱如分别如图3-7和图3-8。3.5误差分析图
13、3-9叠加叠加小噪声大噪声的误差数和误差率图3-10误差数和误差率误码率是衡量一个数字通信系统性能的重要指标。在信道高斯白噪声的干扰下,二进制2ASK数字调制误码率取决于解调器输入信噪比,编写误码率函数br,Pe1=symerr(x,z1);br,Pe2=symerr(x,z2),其中br为符号误差数,Pe1为符号误差率。绘制如图3-9。调用函数semilogy(SNR,Pe);绘制信噪比与误码率的关系曲线如图3-10,由此可得出:与无噪声时(误码率为零)相比较,当信噪比较大时,噪声小误码率低;反之,信噪比较小时噪声大误码率高。4 遇到的问题及解决办法在本次课程设计运用了MATLAB集成环境下
14、的M文件实现ASK的调制解调,在编写过程中遇到了各种不同的问题,通过自己的探索和老师同学的帮助才得以解决,总结如下:产生二进制随机序列时没有只有0和1的情况并且显示的是三角波。解答办法:采用ceil取整函数,可以0和1的序列,并用stairs方波画图函数使方波显示出来。序列是0时的调制波形反向,而不是振幅为零。解决办法:在调制后的函数基础上编写循环判断语句,把一个序列周期作为一次循环,序列为0时调制函数赋值为零,使反向波形消失。绘制信噪比与误码率的关系曲线时错误。解决办法:把调用数字调制函数dmod用于加入噪声,即Ynt3=awgn(y,SNR(i),而调制后的函数基础上编写循环判断语句只用来
15、显示已调波形。5 结束语课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。本次课程设计中让我对信号的ASK的调制解调过程有了很深刻的理解,掌握了ASK的设计的设计思路和设计流程,它可以我使我更容易理解通信原理,提高了对通信系统的分析能力和解决能力,能有机会对通信的原理进行模拟仿真,对于我们专业的人来说尤为重要。经过三周时间的基于Matlab的ASK调制解调课程设计,我最大的收获是基本的掌握了的Matlab中函数的使用,在此期间我利用了通信原理和MATLAB的相关书籍,及其网络资源,在老师和同学的帮助下才得以完成
16、任务,让我意识到数字信号处理的重要性。同时,在这次课程设计中,我也遇到了许多的困难,从及时发现到解决问题,不断地改进自己的方法,以实际操作为基础,以理论为准则,不断完善,不断创新,提高效率,可以为我以后从事通信类职业提供宝贵的经验;我才能设计其他不同的课题,才能达到举一反三的地步,以增强我的实践动手能力,让我受益匪浅。该设计虽然如期完成,其功能基本上可以满足处理的需要。由于我的能力有限,如果有不尽人意的地方,需要将来再做进一步的改善。参考文献1 樊昌信,曹丽娜. 通信原理. 北京:国防工业出版社,2012.2黄文梅,熊桂林,杨勇. 信号分析与处理MATLAB语言及应用. 长沙:国防科技大学出版
17、社,2000.3 唐向宏岳恒立,郑雪峰. MATLAB及在电子信息类课程中的应用. 北京:电子工业出版社,2006,8.4 邓华. MATLAB通信仿真及应用实例详解. 人民邮电出版社,2003.=附录:ASK调制解调程序清单%程序名称:ASK.m %程序功能:ASK解调解调%程序作者:庄维%最后修改时间:2016-1-8程序代码clc; %清除命令工作窗里的内容clear;%清除内存空间变量%产生二进制随机序列x=ceil(rand(1,100000)-0.5)%产生二进制随机序列并取大于x 的最小整数figure(1)%窗口1,包含时域谱和频域谱subplot(2,1,1)%分块图函数su
18、bplot,图形窗口分成2块子窗口的第1个图像stairs(x);%第2个图像xlabel(时间 t);%x轴标注ylabel(序列值);%y轴标注title(二进制随机序列);%添加图像标题axis(1 21 -1 2)%控制坐标轴的范围grid on%图像中添加栅格%对随机序列进行频谱分析FFT1=fft(x,128); %对随机序列进行傅里叶变换FFT1=abs(FFT1);%对傅里叶变换取绝对值figure(1)subplot(2,1,2)%第2个图像plot(FFT1);xlabel(频率 f);ylabel(幅度 FFT1);title(随机序列频谱);axis(0 128 0 5
19、0)grid on%载波信号t=1/360:1/360:20; %载波时间范围Fc=36;%载波频率carry=cos(2*pi*Fc*t); %正弦载波信号figure(2)%窗口2,包含时域谱和频域谱subplot(2,1,1)plot(carry);xlabel(时间 t);ylabel(幅度 carry);title(载波信号); axis(1 600 -2 2)grid on%对载波信号进行频谱分析FFT2=fft(carry,256); %对载波信号进行傅里叶变换FFT2=abs(FFT2);%对傅里叶变换取绝对值figure(2)subplot(2,1,2)plot(FFT2);
20、xlabel(频率 f);ylabel(幅度 FFT2);title(载波信号频谱); axis(0 256 0 100)grid on%ASK的调制Fd=12;%Fd为码速率,Fs为采样频率Fs=360;y=dmod(x,Fc,Fd,Fs,ask,2);%调用数字带通调制函数dmod进行2ASK调制for i=1:20 if x(i)=0 yy(30*(i-1)+1:30*i)=0; else yy(30*(i-1)+1:30*i)=y(30*(i-1)+1:30*i); end end%对20个随机码元进行判别,若码元为0则该码元周期内调制信号为零figure(3)subplot(2,1,
21、1)plot(yy);xlabel(时间 t);ylabel(幅度 y);title(已调信号);axis(1 600 -2 2)grid on%对已调信号进行频谱分析FFT3=fft(y,256); %对已调信号进行傅里叶变换FFT3=abs(FFT3);%对傅里叶变换取绝对值figure(3)subplot(2,1,2)plot(FFT3);xlabel(频率 f);ylabel(幅度 FFT3);title(已调信号频谱); axis(0 256 0 50)grid on%ASK的解调z=ddemod(y,Fc,Fd,Fs,ask,2); %调用数字带通调制函数dmod进行2ASK解调f
22、igure(4)%对傅里叶变换取绝对值subplot(2,1,1)stairs(z);xlabel(时间 t);ylabel(幅度 z);title(解调信号);axis(1 21 -1 2)grid on%对解调信号进行频谱分析FFT4=fft(z,64); %对解调信号进行傅里叶变换FFT4=abs(FFT4);%对傅里叶变换取绝对值figure(4)subplot(2,1,2)plot(FFT4);xlabel(频率 f);ylabel(幅度 FFT4);title(解调信号频谱); axis(0 64 0 50)grid on%加入高斯小噪声,SNR为6Ynt1=awgn(y,6);%
23、加入高斯小噪声,信噪比为6figure(5)subplot(2,1,1) plot(Ynt1);xlabel(时间 t);ylabel(幅度 Ynt1);title(加小噪声信号);axis(1 600 -2 2)grid on%对加小噪声信号进行频谱分析FFT5=fft(Ynt1,256); %对加入小噪声的调制信号进行傅里叶变换FFT5=abs(FFT5);%对傅里叶变换取绝对值figure(5)subplot(2,1,2) plot(FFT5);xlabel(频率 f);ylabel(幅度 FFT5);title(加小噪声信号频谱) axis(0 256 0 50)grid on%ASK
24、加小噪声信号的解调及误码率z1=ddemod(Ynt1,Fc,Fd,Fs,ask,2); %调用数字带通调制函数dmod对加小噪声信号进行解调br,Pe1=symerr(x,z1)%对解调后加小噪声信号误码分析,br为符号误差数,Pe1为符号误差率figure(6)subplot(2,1,1)stairs(z1);xlabel(时间 t);ylabel(幅度 z1);title(加小噪声解调信号);axis(1 21 -1 2)grid on%对加小噪声解调信号进行频谱分析FFT6=fft(z1,64); %对加入小噪声的解调信号进行傅里叶变换FFT6=abs(FFT6);%对傅里叶变换取绝对
25、值figure(6)subplot(2,1,2)plot(FFT6);xlabel(频率 f);ylabel(幅度 FFT6);title(加小噪声解调信号频谱); axis(0 64 0 50)grid on%加入高斯大噪声,SNR为-2Ynt2=awgn(y,3);%加入高斯大噪声,信噪比为-2figure(7)subplot(2,1,1) plot(Ynt2);xlabel(时间 t);ylabel(幅度 Ynt2);title(加大噪声信号);axis(1 600 -2 2)grid on%对加大噪声信号进行频谱分析FFT7=fft(Ynt2,256); %对加入大噪声的调制信号进行傅
26、里叶变换FFT7=abs(FFT7);%对傅里叶变换取绝对值figure(7)subplot(2,1,2) plot(FFT7);xlabel(频率 f);ylabel(幅度 FFT5);title(加大噪声信号频谱) axis(0 256 0 50)grid on%ASK加大噪声信号的解调及误码率z2=ddemod(Ynt2,Fc,Fd,Fs,ask,2); %调用数字带通调制函数dmod对加大噪声信号进行解调br,Pe2=symerr(x,z2)%对解调后加大噪声信号误码分析,br为符号误差数,Pe1为符号误差率figure(8)subplot(2,1,1)stairs(z2);xlabe
27、l(时间 t);ylabel(幅度 z2);title(加大噪声解调信号);axis(1 21 -1 2)grid on%对加大噪声解调信号进行频谱分析FFT8=fft(z2,64); %对加入大噪声的解调信号进行傅里叶变换FFT8=abs(FFT8);%对傅里叶变换取绝对值figure(8)subplot(2,1,2)plot(FFT8);xlabel(频率 f);ylabel(幅度 FFT6);title(加大噪声解调信号频谱); axis(0 64 0 50)grid on%误码分析SNR=-10:10for i=1:length(SNR); Ynt3=awgn(y,SNR(i);%加入
28、高斯小噪声,信噪比从-10dB到10dBZ=ddemod(Ynt3,Fc,Fd,Fs,ask,2);%调用数字带通解调函数ddemod对加噪声信号进行解调 br, Pe(i)=symerr(x,Z);%对解调后加大噪声信号误码分析,br为符号误差数,Pe(i)为符号误差率endfigure(9)semilogy(SNR,Pe);% 调用semilogy函数绘制信噪比与误码率的关系曲线xlabel(信噪比 SNR(r/dB);ylabel(误码率 Pe);title(信噪比与误码率的关系);axis(-10 10 0 1)grid on附录资料:不需要的可以自行删除 C语言图形模式速成第一节 图
29、形模式的初始化Turbo C 提供了非常丰富的图形函数,所有图形函数的原型均在graphics. h 中,本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。另外,使用图形函数时要确保有显示器图形驱动程序*.BGI,同时将集成开发环境options/Linker中的Graphics lib选为on,只有这样才能保证正确使用图形函数。 不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器,在不同模式下也有不同分辨率。因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式
30、(80列,25行字符模式),此时所有图形函数均不能工作。设置屏幕为图形模式,可用下列图形初始化函数:void far initgraph(int far *gdriver, int far *gmode,char *path);其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见graphics. h。图形驱动程序由Turbo C出版商提供,文件扩展名为.BGI。 根据不同的图形适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序EGAVGA.BGI。#include std
31、io.h#include graphics.hint main()int gdriver, gmode;gdriver=VGA;gmode=VGAHI;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(100, 100, 300, 250, 50, 1); /*画一长方体*/getch();closegraph();return 0;有时编程者并不知道所用的图形显示器适配器种类,或者需要将编写的程序用于不同图形驱动器,Turbo C 提供了一个自动检测显示器硬件的函数,其调用格式为:void far detectgraph(int *gdriver,
32、*gmode);其中gdriver和gmode的意义与上面相同。 自动进行硬件测试后进行图形初始化:#include stdio.h#include graphics.hint main()int gdriver, gmode;detectgraph(&gdriver, &gmode); /*自动测试硬件*/printf(the graphics driver is %d, mode is %dn,gdriver,gmode); /*输出测试结果*/getch();initgraph(&gdriver, &gmode, C:TC2.0BGI);/* 根据测试结果初始化图形*/bar3d(100
33、, 100, 300, 250, 50, 1); /*画一长方体*/getch();closegraph();return 0;上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置,但Turbo C提供了一种更简单的方法, 即用gdriver=DETECT 语句后再跟initgraph()函数就行了。采用这种方法后,上例可改为:#include stdio.h#include graphics.hint main()int gdriver=DETECT, gmode;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(50, 50, 1
34、50, 30, 50, 1);getch();closegraph();return 0;另外,Turbo C 提供了退出图形状态的函数closegraph(),其调用格式为:void far closegraph(void);第二节 屏幕颜色的设置和清屏函数对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。在Turbo C中分别用下面两个函数: 设置背景色: void far setbkcolor(int color);设置作图色: void far setcolor(int color);其中color 为图形方式下颜色的规定数值,对EGA,VGA显示器适配器,有关颜色的符号
35、常数及数值见graphics.h。清除图形屏幕内容但不清除图形背景使用清屏函数,其调用格式如下: voide far cleardevice(void);#include stdio.h#include graphics.hint main()int gdriver, gmode, i,aa;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI); /*图形初始化*/setbkcolor(0); /*设置图形背景*/cleardevice();for(i=0; i=15; i+)setcolor(i); /*设置不同作图色*/circle(
36、320, 240, 20+i*10); /*画半径不同的圆*/getch();for(i=0; i=15; i+)setbkcolor(i); /*设置不同背景色*/cleardevice();circle(320, 240, 20+i*10);getch();aa=getmaxcolor();printf(maxcolor=%d,aa);getch();closegraph();return 0;另外,TURBO C也提供了几个获得现行颜色设置情况的函数。 int far getbkcolor(void); 返回现行背景颜色值。int far getcolor(void); 返回现行作图颜色
37、值。int far getmaxcolor(void); 返回最高可用的颜色值。第三节 基本画图函数基本图形函数包括画点,线以及其它一些基本图形的函数。本节对这些函数作一全面的介绍。 、画点. 画点函数 void far putpixel(int x, int y, int color); 该函数表示有指定的象元画一个按color 所确定颜色的点。对于颜色color的值可从表3中获得而对x, y是指图形象元的坐标。在图形模式下,是按象元来定义坐标的。对VGA适配器,它的最高分辨率为640 x480,其中640为整个屏幕从左到右所有象元的个数,480为整个屏幕从上到下所有象元的个数。屏幕的左上角
38、坐标为(0,0),右下角坐标为(639, 479),水平方向从左到右为x 轴正向,垂直方向从上到下为y轴正向。TURBO C的图形函数都是相对于图形屏幕坐标,即象元来说的。关于点的另外一个函数是: int far getpixel(int x, int y); 它获得当前点(x, y)的颜色值。 II、有关坐标位置的函数 int far getmaxx(void);返回x轴的最大值。int far getmaxy(void);返回y轴的最大值。int far getx(void); 返回游标在x轴的位置。void far gety(void); 返回游标有y轴的位置。void far move
39、to(int x, int y); 移动游标到(x, y)点,不是画点,在移动过程中亦画点。void far moverel(int dx, int dy); 移动游标从现行位置(x, y)移动到(x+dx, y+dy)的位置,移动过程中不画点。、画线I. 画线函数TURBO C提供了一系列画线函数: void far line(int x0, int y0, int x1, int y1); 画一条从点(x0, y0)到(x1, y1)的直线。void far lineto(int x, int y); 画一作从现行游标到点(x, y)的直线。void far linerel(int dx,
40、 int dy); 画一条从现行游标(x,y)到按相对增量确定的点(x+dx, y+dy)的直线。void far circle(int x, int y, int radius); 以(x, y)为圆心,radius为半径,画一个圆。void far arc(int x, int y, int stangle, int endangle,int radius); 以(x,y)为圆心,radius为半径,从stangle开始到endangle结束(用度表示)画一段圆弧线。在TURBO C中规定x轴正向为0 度,逆时针方向旋转一周, 依次为90,180, 270和360度(其它有关函数也按此规定
41、,不再重述)。 void ellipse(int x, int y, int stangle, int endangle,int xradius,int yradius);以(x, y)为中心,xradius,yradius为x轴和y轴半径,从角stangle 开始到endangle结束画一段椭圆线,当stangle=0,endangle=360时, 画出一个完整的椭圆。void far rectangle(int x1, int y1, int x2, inty2); 以(x1, y1)为左上角,(x2, y2)为右下角画一个矩形框。 void far drawpoly(int numpoi
42、nts, int far *polypoints); 画一个顶点数为numpoints,各顶点坐标由polypoints给出的多边形。polypoints整型数组必须至少有2 倍顶点数个无素。每一个顶点的坐标都定义为x,y,并且x在前。值得注意的是当画一个封闭的多边形时,numpoints 的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。下面举一个用drawpoly()函数画箭头的例子。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;int arw16=200,102
43、,300,102,300,107,330,100,300,93,300,98,200,98,200,102;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(12); /*设置作图颜色*/drawpoly(8, arw); /*画一箭头*/getch();closegraph();return 0;II、设定线型函数在没有对线的特性进行设定之前,TURBO C 用其默认值,即一点宽的实线,但TURBO C 也提供了可以改变线型的函数。线型包括:宽度和形状。
44、其中宽度只有两种选择:一点宽和三点宽。而线的形状则有五种。下面介绍有关线型的设置函数。void far setlinestyle(int linestyle,unsigned upattern,int thickness);该函数用来设置线的有关信息,其中linestyle是线形状的规定,见graphics.h。对于upattern,只有linestyle选USERBIT_LINE 时才有意义 (选其它线型,uppattern取0即可)。此时uppattern的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。 void far getlinesettings(s
45、truct linesettingstypefar *lineinfo);该函数将有关线的信息存放到由lineinfo 指向的结构中,表中linesettingstype的结构如下:struct linesettingstypeint linestyle;unsigned upattern;int thickness;例如下面两句程序可以读出当前线的特性 struct linesettingstype *info;getlinesettings(info);void far setwritemode(int mode);该函数规定画线的方式。如果mode=0,则表示画线时将所画位置的原来信息覆
46、盖了(这是TURBO C的默认方式)。如果mode=1, 则表示画线时用现在特性的线与所画之处原有的线进行异或(XOR)操作,实际上画出的线是原有线与现在规定的线进行异或后的结果。因此,当线的特性不变,进行两次画线操作相当于没有画线。有关线型设定和画线函数的例子如下所示。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(GR
47、EEN);circle(320, 240, 98);setlinestyle(0, 0, 3); /*设置三点宽实线*/setcolor(2);rectangle(220, 140, 420, 340);setcolor(WHITE);setlinestyle(4, 0 xaaaa, 1);/*设置一点宽用户定义线*/line(220, 240, 420, 240);line(320, 140, 320, 340);getch();closegraph();return 0;第四节 基本图形的填充填充就是用规定的颜色和图模填满一个封闭图形。 一般是先画轮廓再填充。TURBO C提供了一些先画出
48、基本图形轮廓, 再按规定图模和颜色填充整个封闭图形的函数。在没有改变填充方式时,TURBO C 以默认方式填充。 void far bar(int x1, int y1, int x2, int y2);确定一个以(x1,y1)为左上角,(x2,y2)为右下角的矩形窗口,再按规定图模和颜色填充。说明:此函数不画出边框,所以填充色为边框。void far bar3d(int x1, int y1, int x2, int y2,int depth,int topflag);当topflag为非0时, 画出一个三维的长方体。当topflag为0时,三维图形不封顶,实际上很少这样使用。说明: bar
49、3d()函数中,长方体第三维的方向不随任何参数而变,即始终为45度的方向。void far pieslice(int x,int y,int stangle,int endangle,int radius);画一个以(x, y)为圆心,radius为半径,stangle为起始角度,endangle 为终止角度的扇形,再按规定方式填充。当stangle=0,endangle=360 时变成一个实心圆,并在圆内从圆点沿X轴正向画一条半径。void far sector(int x, int y,int stanle,intendangle,int xradius, int yradius);画一个
50、以(x, y)为圆心分别以xradius, yradius为x轴和y轴半径,stangle 为起始角,endangle为终止角的椭圆扇形,再按规定方式填充。第五节 设定填充方式TURBO C有四个与填充方式有关的函数。下面分别介绍: void far setfillstyle(int pattern, int color); color的值是当前屏幕图形模式时颜色的有效值。pattern的值及与其等价的符号常数见graphics.h。除USER_FILL(用户定义填充式样)以外,其它填充式样均可由setfillstyle() 函数设置。当选用USER_FILL时,该函数对填充图模和颜色不作任何
51、改变。 之所以定义USER_FILL主要因为在获得有关填充信息时用到此项。void far setfillpattern(char * upattern,int color); 设置用户定义的填充图模的颜色以供对封闭图形填充。其中upattern是一个指向8个字节的指针。这8个字节定义了8x8点阵的图形。每个字节的8位二进制数表示水平8点,8个字节表示8行,然后以此为模型向个封闭区域填充。void far getfillpattern(char * upattern); 该函数将用户定义的填充图模存入upattern指针指向的内存区域。void far getfillsetings(struc
52、t fillsettingstypefar * fillinfo); 获得现行图模的颜色并将存入结构指针变量fillinfo中。其中fillsettingstype结构定义如下:struct fillsettingstypeint pattern; /* 现行填充模式 * /int color; /* 现行填充模式 * /; 有关图形填充图模的颜色的选择,请看下面例程。#include stdio.h#include graphics.hmain()char str8=10,20,30,40,50,60,70,80; /*用户定义图模*/int gdriver,gmode,i;struct f
53、illsettingstype save;/*定义一个用来存储填充信息的结构变量*/gdriver=DETECT;initgraph(&gdriver,&gmode,C:TC2.0BGI);setbkcolor(BLUE);cleardevice();for(i=0;i13;i+)setcolor(i+3);setfillstyle(i,2+i); /* 设置填充类型 */bar(100,150,200,50); /*画矩形并填充*/bar3d(300,100,500,200,70,1); /* 画长方体并填充*/pieslice(200, 300, 90, 180, 90);/*画扇形并填充
54、*/sector(500,300,180,270,200,100);/*画椭圆扇形并填充*/getch();cleardevice();setcolor(14);setfillpattern(str, RED);bar(100,150,200,50);bar3d(300,100,500,200,70,0);pieslice(200,300,0,360,90);sector(500,300,0,360,100,50);getch();getfillsettings(&save);/*获得用户定义的填充模式信息*/closegraph();clrscr();printf(The pattern i
55、s %d, The color of filling is %d,save.pattern, save.color);/*输出目前填充图模和颜色值*/getch();第六节 任意封闭图形的填充截止目前为止,我们只能对一些特定形状的封闭图形进行填充,但还不能对任意封闭图形进行填充。为此,TURBO C 提供了一个可对任意封闭图形填充的函数,其调用格式如下: void far floodfill(int x, int y, int border); 其中:x, y为封闭图形内的任意一点,border为边界的颜色,也就是封闭图形轮廓的颜色。调用了该函数后,将用由函数setfillstyle()规定的
56、颜色和模式填满整个封闭图形。注意:a. 如果x或y取在边界上,则不进行填充。b. 如果不是封闭图形则填充会从没有封闭的地方溢出去,填满其它地方。c. 如果x或y在图形外面,则填充封闭图形外的屏幕区域。d. 由border指定的颜色值必须与图形轮廓的颜色值相同, 但填充色可选任意颜色。下例是有关floodfill()函数的用法,该程序填充了bar3d()所画长方体中其它两个未填充的面。#include stdio.h#include graphics.hmain()int gdriver, gmode;struct fillsettingstype save;gdriver=DETECT;ini
57、tgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(LIGHTRED);setlinestyle(0,0,3);setfillstyle(1,14); /*设置填充方式*/bar3d(100,200,400,350,200,1); /*画长方体并填充*/floodfill(450,300,LIGHTRED);/*填充长方体另外两个面*/floodfill(250,150, LIGHTRED);rectangle(450,400,500,450); /*画一矩形*/floodfill(470,4
58、20, LIGHTRED); /*填充矩形*/getch();closegraph();第七节屏幕操作函数除了清屏函数以外,关于屏幕操作还有以下函数: void far setactivepage(int pagenum); void far setvisualpage(int pagenum);这两个函数只用于EGA,VGA 以及HERCULES图形适配器。setctivepage()函数是为图形输出选择激活页。所谓激活页是指后续图形的输出被写到函数选定的pagenum页面,该页面并不一定可见。setvisualpage()函数才使pagenum所指定的页面变成可见页。页面从0开始(Turb
59、o C默认页)。如果先用setactivepage() 函数在不同页面上画出一幅幅图像,再用setvisualpage() 函数交替显示,就可以实现一些动画的效果。void far getimage(int xl,int yl, int x2,int y2,void far *mapbuf); void far putimge(int x,int,y,void * mapbuf, int op); unsined far imagesize(int xl,int yl,int x2,int y2);这三个函数用于将屏幕上的图像复制到内存,然后再将内存中的图像送回到屏幕上。首先通过函数image
60、size() 测试要保存左上角为(xl,yl),右上角为(x2,y2)的图形屏幕区域内的全部内容需多少个字节,然后再给mapbuf分配一个所测数字节内存空间的指针。通过调用getimage()函数就可将该区域内的图像保存在内存中,需要时可用putimage()函数将该图像输出到左上角为点(x, y)的位置上,其中getimage()函数中的参数op规定如何释放内存中图像。 关于这个参数的定义参见下表。对于imagesize()函数,只能返回字节数小于64K字节的图像区域,否则将会出错,出错时返回-1。本节介绍的函数在图像动画处理、菜单设计技巧中非常有用。下面程序模拟两个小球动态碰撞过程。#in
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025新风系统购销合同范本
- 2025年:探讨合作原则下的租赁合同与违约责任研究
- 2025北京租赁合同模板
- 个人经营合伙合同样本
- 2025湖北省非全日制用工合同协议范本
- 2025人力资源外包合同书
- 公寓油烟隔绝方案范本
- 蜘蛛车专项施工方案
- 出租建筑用地合同标准文本
- 2025年上海市购销合同范本购销合同
- 综合实践项目4 饲养家蚕了解我国的养蚕历史(教学设计)
- 第6单元第1课《影响系统运行的因素》 黔教版《信息科技》六年级下册
- 2025陕西西安亮丽电力集团限责任公司招聘55人高频重点模拟试卷提升(共500题附带答案详解)
- GB/T 45140-2025红树林生态修复监测和效果评估技术指南
- 数字化赋能服务育人路径探索与实践
- 医疗技术临床应用管理培训
- 节约用水知识竞答考试题库(共400题含答案)
- 2025年浙江金华义乌市道路运输管理局招聘历年高频重点提升(共500题)附带答案详解
- 高一年级《沂蒙精神进校园》班会 《沂蒙精神进校园》 课件
- 物业应急演练计划应急预案演练计划
- 高一年级总结暨表彰大会校长讲话希望同学们以本次考试为起点用行动来践行自己对家长的承诺
评论
0/150
提交评论