基于MATLAB的OFDM的仿真_第1页
基于MATLAB的OFDM的仿真_第2页
基于MATLAB的OFDM的仿真_第3页
基于MATLAB的OFDM的仿真_第4页
基于MATLAB的OFDM的仿真_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、PAGE PAGE 37实习目的熟悉通信相关方面的知识、学习并掌握OFDM技术的原理熟悉MATLAB语言设计并实现OFDM通信系统的建模与仿真实习要求仿真实现OFDM调制解调,在发射端,经串/并变换和IFFT变换,加上保护间隔(又称“循环前缀”),形成数字信号,通过信道到达接收端,结束端实现反变换,进行误码分析三、实习内容实习题目 正交频分复用OFDM系统建模与仿真原理介绍OFDM的基本原理就是把高速的数据流通过串并变换,分配到传输速率相对较低的若干个子信道中进行传输。由于每个子信道中的符号周期会相对增加,因此可以减轻由无线信道的多径时延扩展所产生的时间弥散性对系统造成的影响。并且还可以在OF

2、DM符号之间插入保护间隔,令保护间隔大于无线信道的最大时延扩展,这样就可以最大限度地消除由于多径而带来的符号间干扰(ISI)。而且,一般都采用循环前缀作为保护间隔,从而可以避免由多径带来的子载波间干扰(ICI) 。原理框图高速数据图1-1 OFDM 原理框图 功能说明4.1确定参数需要确定的参数为:子信道,子载波数,FFT长度,每次使用的OFDM符号数,调制度水平,符号速率,比特率,保护间隔长度,信噪比,插入导频数,基本的仿真可以不插入导频,可以为0。4.2产生数据使用个随机数产生器产生二进制数据,每次产生的数据个数为carrier_count * symbols_per_carrier *

3、bits_per_symbol。4.3编码交织交织编码可以有效地抗突发干扰。4.4子载波调制OFDM采用BPSK、QPSK、16QAM、64QAM4种调制方式。按照星座图,将每个子信道上的数据,映射到星座图点的复数表示,转换为同相Ich和正交分量Qch。其实这是一种查表的方法,以16QAM星座为例,bits_per_symbol=4,则每个OFDM符号的每个子信道上有4个二进制数d1,d2,d3,d4,共有16种取值,对应星座图上16个点,每个点的实部记为Qch。为了所有的映射点有相同高的平均功率,输出要进行归一化,所以对应BPSK,PQSK,16QAM,64QAM,分别乘以归一化系数系数1,

4、, , .输出的复数序列即为映射后的调制结果。4.5串并转换。将一路高速数据转换成多路低速数据4.6 IFFT。对上一步得到的相同分量和正交分量按照(Ich+Qch*i)进行IFFT运算。并将得到的复数的实部作为新的Ich,虚部作为新的Qch。在实际运用中, 信号的产生和解调都是采用数字信号处理的方法来实现的, 此时要对信号进行抽样, 形成离散时间信号。 由于OFDM信号的带宽为B=Nf, 信号必须以t=1/B=1/(Nf)的时间间隔进行采样。 采样后的信号用sn,i表示, i = 0, 1, , N-1,则有 从该式可以看出,它是一个严格的离散反傅立叶变换(IDFT)的表达式。IDFT可以采

5、用快速反傅立叶变换(IFFT)来实现 4.7加入保护间隔。由IFFT运算后的每个符号的同相分量和正交分量分别转换为串行数据,并将符号尾部G长度的数据加到头部,构成循环前缀。如果加入空的间隔,在多径传播的影响下,会造成载波间干扰ICI。保护见个的长度G应该大于多径时的扩张的最大值。 图 1-2 多径情况下,空闲保护间隔在子载波间造成的干扰图1-3 保护间隔的插入过程4.8加窗加窗是为了降低系统的PAPR,滚降系数为1/32。通过这种方法,可以显著地改善OFDM通信系统高的PAPR分布,大大降低了峰值信号出现的概率以及对功率放大器的要求,节约成本。经常被采用的窗函数是升余弦窗 (1-2) 图1-9

6、 经过加窗处理后的OFDM符号示意图4.9通过信道。信道分为多径实验信道和高斯白噪声信道。多径时延信道直射波河延迟波对于标准时间按照固定比率递减,因此多径时延信道参数为比率和对大延迟时间。4.10同步。同步是决定OFDM系统高性能十分重要的方面,实际OFDM系统都有同步过称。主要同步方法有使用导频,循环前缀,忙算法三种。研究目的为同步的可以详细实现本步,基本的方针可以略过此步,假设接收端已经于发射端同步。4.11去掉保护间隔。根据同步得到的数据,分别见给每个符号的同相分量和正交分量开头的保护间隔去掉。4.12并串转换。将每个符号分布在子信道上的数据,还原为一路串行数据。4.13 FFT。对每个

7、符号的同相分量和正交分量按照(Ich+Qch*i)进行FFT运算。并将得到的实部作为新的Ich,虚部作为新的Qch。与发端相类似,上述相关运算可以通过离散傅立叶变换(DFT)或快速傅立叶变换(FFT)来实现, 即: 4.14子载波解调FFT后的同相粉脸感和正交分量两组数据在星座图上对饮高的点,由于噪声和信道的影响,不再是严格的发送端的星座图。将得到的星座图上的点按照最近原则判决为原星座图上的点,并按映射规则还原为一组数据。4.15解码解交织。按照编码交织对应解码,解交织的方法,还原为原始数据,并进行纠错处理。4.16计算误码率。比较第2步产生的数据和接收到的数据,计算误码率BER实现步骤5.1

8、 16QAM的调制函数function complex_qam_data=qam16(bitdata)%modulation of 16QAM,modulate bitdata to 16QAM complex signalX1=reshape(bitdata,4,length(bitdata)/4);d=1;%min distance of symble for i=1:length(bitdata)/4; for j=1:4 X1(i,j)=X1(i,j)*(2(4-j); end source(i,1)=1+sum(X1(i,:);%convert to the number 1 to

9、16endmapping=-3*d 3*d; -d 3*d; d 3*d; 3*d 3*d; -3*d d; -d d; d d; 3*d d; -3*d -d; -d -d; d -d; 3*d -d; -3*d -3*d; -d -3*d; d -3*d; 3*d -3*d; for i=1:length(bitdata)/4 qam_data(i,:)=mapping(source(i),:);%data mapping end complex_qam_data=complex(qam_data(:,1),qam_data(:,2);5.2 16QAM的解调函数。function dem

10、odu_bit_symble=demoduqam16(Rx_serial_complex_symbols)%将得到的串行16QAM数据解调成二进制比特流complex_symbols=reshape(Rx_serial_complex_symbols,length(Rx_serial_complex_symbols),1);d=1;mapping=-3*d 3*d; -d 3*d; d 3*d; 3*d 3*d; -3*d d; -d d; d d; 3*d d; -3*d -d; -d -d; d -d; 3*d -d; -3*d -3*d; -d -3*d; d -3*d; 3*d -3*

11、d; complex_mapping=complex(mapping(:,1),mapping(:,2); for i=1:length(Rx_serial_complex_symbols); for j=1:16; metrics(j)=abs(complex_symbols(i,1)-complex_mapping(j,1); end min_metric decode_symble(i)= min(metrics) ; %将离某星座点最近的值赋给decode_symble(i) end decode_bit_symble=de2bi(decode_symble-1),left-msb);

12、 demodu_bit_symble=reshape(decode_bit_symble,1,length(Rx_serial_complex_symbols)*4);5.3加窗函数function rcosw=rcoswindow(beta, Ts)%定义升余弦窗,其中beta为滚降系数,Ts为包含循环前缀的OFDM符号的长度,Ts为正偶数t=0:(1+beta)*Ts;rcosw=zeros(1,(1+beta)*Ts);for i=1:beta*Ts;rcosw(i)=0.5+0.5*cos(pi+ t(i)*pi/(beta*Ts);endrcosw(beta*Ts+1:Ts)=1;f

13、or j=Ts+1:(1+beta)*Ts+1; rcosw(j-1)=0.5+0.5*cos(t(j)-Ts)*pi/(beta*Ts);endrcosw=rcosw;%变换为列向量5.4 OFDM主程序clear all;close all;carrier_count=200;%子载波数symbols_per_carrier=12;%每子载波含符号数bits_per_symbol=4;%每符号含比特数,16QAM调制IFFT_bin_length=512;%FFT点数PrefixRatio=1/4;%保护间隔与OFDM数据的比例 1/61/4GI=PrefixRatio*IFFT_bin_

14、length ;%每一个OFDM符号添加的循环前缀长度为1/4*IFFT_bin_length 即保护间隔长度为128beta=1/32;%窗函数滚降系数GIP=beta*(IFFT_bin_length+GI);%循环后缀的长度20SNR=15; %信噪比dB%=%=信号产生=baseband_out_length = carrier_count * symbols_per_carrier * bits_per_symbol;%所输入的比特数目carriers = (1:carrier_count) + (floor(IFFT_bin_length/4) - floor(carrier_co

15、unt/2);%共轭对称子载波映射 复数数据对应的IFFT点坐标conjugate_carriers = IFFT_bin_length - carriers + 2;%共轭对称子载波映射 共轭复数对应的IFFT点坐标baseband_out=round(rand(1,baseband_out_length);%输出待调制的二进制比特流%=16QAM调制=complex_carrier_matrix=qam16(baseband_out);%列向量complex_carrier_matrix=reshape(complex_carrier_matrix,carrier_count,symbol

16、s_per_carrier);%symbols_per_carrier*carrier_count 矩阵figure(1);plot(complex_carrier_matrix,*r);%16QAM调制后星座图title(16QAM调制后星座图)axis(-4, 4, -4, 4);grid on%=IFFT=IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);%添0组成IFFT_bin_length IFFT 运算 IFFT_modulation(:,carriers ) = complex_carrier_matrix ;

17、%未添加导频信号 ,子载波映射在此处IFFT_modulation(:,conjugate_carriers ) = conj(complex_carrier_matrix);%共轭复数映射%=signal_after_IFFT=ifft(IFFT_modulation,IFFT_bin_length,2);%OFDM调制 即IFFT变换time_wave_matrix =signal_after_IFFT;%时域波形矩阵,行为每载波所含符号数,列ITTF点数,N个子载波映射在其内,每一行即为一个OFDM符号%=%=添加循环前缀与后缀=XX=zeros(symbols_per_carrier,

18、IFFT_bin_length+GI+GIP);for k=1:symbols_per_carrier; for i=1:IFFT_bin_length; XX(k,i+GI)=signal_after_IFFT(k,i); end for i=1:GI; XX(k,i)=signal_after_IFFT(k,i+IFFT_bin_length-GI);%添加循环前缀 end for j=1:GIP; XX(k,IFFT_bin_length+GI+j)=signal_after_IFFT(k,j);%添加循环后缀 endendtime_wave_matrix_cp=XX;%添加了循环前缀与

19、后缀的时域信号矩阵,此时一个OFDM符号长度为IFFT_bin_length+GI+GIP=660%=OFDM符号加窗=windowed_time_wave_matrix_cp=zeros(1,IFFT_bin_length+GI+GIP);for i = 1:symbols_per_carrier windowed_time_wave_matrix_cp(i,:) = real(time_wave_matrix_cp(i,:).*rcoswindow(beta,IFFT_bin_length+GI);%加窗 升余弦窗end %=生成发送信号,并串变换=windowed_Tx_data=zer

20、os(1,symbols_per_carrier*(IFFT_bin_length+GI)+GIP);windowed_Tx_data(1:IFFT_bin_length+GI+GIP)=windowed_time_wave_matrix_cp(1,:);for i = 1:symbols_per_carrier-1 ; windowed_Tx_data(IFFT_bin_length+GI)*i+1:(IFFT_bin_length+GI)*(i+1)+GIP)=windowed_time_wave_matrix_cp(i+1,:);%并串转换,循环后缀与循环前缀相叠加end%=Tx_dat

21、a=reshape(windowed_time_wave_matrix_cp,(symbols_per_carrier)*(IFFT_bin_length+GI+GIP),1);%加窗后 循环前缀与后缀不叠加 的串行信号%=temp_time1 = (symbols_per_carrier)*(IFFT_bin_length+GI+GIP);%加窗后 循环前缀与后缀不叠加 发送总位数figure (2)subplot(2,1,1);plot(0:temp_time1-1,Tx_data );%循环前缀与后缀不叠加 发送的信号波形grid onylabel(Amplitude (volts)xl

22、abel(Time (samples)title(循环前后缀不叠加的OFDM Time Signal)temp_time2 =symbols_per_carrier*(IFFT_bin_length+GI)+GIP;subplot(2,1,2);plot(0:temp_time2-1,windowed_Tx_data);%循环后缀与循环前缀相叠加 发送信号波形grid onylabel(Amplitude (volts)xlabel(Time (samples)title(循环前后缀叠加的OFDM Time Signal)%=加窗的发送信号频谱=symbols_per_average = ce

23、il(symbols_per_carrier/5);%符号数的1/5,10行avg_temp_time = (IFFT_bin_length+GI+GIP)*symbols_per_average;%点数,10行数据,10个符号averages = floor(temp_time1/avg_temp_time);average_fft(1:avg_temp_time) = 0;%分成5段for a = 0:(averages-1) subset_ofdm = Tx_data(a*avg_temp_time)+1):(a+1)*avg_temp_time);%利用循环前缀后缀未叠加的串行加窗信号

24、计算频谱 subset_ofdm_f = abs(fft(subset_ofdm);%分段求频谱 average_fft = average_fft + (subset_ofdm_f/averages);%总共的数据分为5段,分段进行FFT,平均相加endaverage_fft_log = 20*log10(average_fft);figure (3)subplot(2,1,2)plot(0:(avg_temp_time-1)/avg_temp_time, average_fft_log)%归一化 0/avg_temp_time : (avg_temp_time-1)/avg_temp_ti

25、mehold onplot(0:1/IFFT_bin_length:1, -35, rd)grid onaxis(0 0.5 -40 max(average_fft_log)ylabel(Magnitude (dB)xlabel(Normalized Frequency (0.5 = fs/2)title(加窗的发送信号频谱)%=添加噪声=Tx_signal_power = var(windowed_Tx_data);%发送信号功率linear_SNR=10(SNR/10);%线性信噪比 noise_sigma=Tx_signal_power/linear_SNR;noise_scale_fa

26、ctor = sqrt(noise_sigma);%标准差sigmanoise=randn(1,(symbols_per_carrier)*(IFFT_bin_length+GI)+GIP)*noise_scale_factor;%产生正态分布噪声序列Rx_data=windowed_Tx_data +noise;%接收到的信号加噪声%=接收信号 串/并变换 去除前缀与后缀=Rx_data_matrix=zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP);for i=1:symbols_per_carrier; Rx_data_matrix(i,

27、:)=Rx_data(1,(i-1)*(IFFT_bin_length+GI)+1:i*(IFFT_bin_length+GI)+GIP);%串并变换endRx_data_complex_matrix=Rx_data_matrix(:,GI+1:IFFT_bin_length+GI);%去除循环前缀与循环后缀,得到有用信号矩阵%=% OFDM解码 16QAM解码%=FFT变换=Y1=fft(Rx_data_complex_matrix,IFFT_bin_length,2);%OFDM解码 即FFT变换Rx_carriers=Y1(:,carriers);%除去IFFT/FFT变换添加的0,选出

28、映射的子载波Rx_phase =angle(Rx_carriers);%接收信号的相位Rx_mag = abs(Rx_carriers);%接收信号的幅度figure(4);polar(Rx_phase, Rx_mag,bd);%极坐标坐标下画出接收信号的星座图title(极坐标下的接收信号的星座图)%=M, N=pol2cart(Rx_phase, Rx_mag); Rx_complex_carrier_matrix = complex(M, N);figure(5);plot(Rx_complex_carrier_matrix,*r);%XY坐标接收信号的星座图title(XY坐标接收信号

29、的星座图)axis(-4, 4, -4, 4);grid on%=16qam解调=Rx_serial_complex_symbols=reshape(Rx_complex_carrier_matrix,size(Rx_complex_carrier_matrix, 1)*size(Rx_complex_carrier_matrix,2),1) ;Rx_decoded_binary_symbols=demoduqam16(Rx_serial_complex_symbols);%=baseband_in = Rx_decoded_binary_symbols;figure(6);subplot(2

30、,1,1);stem(baseband_out(1:100);title(输出待调制的二进制比特流)subplot(2,1,2);stem(baseband_in(1:100);title(接收解调后的二进制比特流)%=误码率计算=bit_errors=find(baseband_in =baseband_out);bit_error_count = size(bit_errors, 2) ber=bit_error_count/baseband_out_length5.5实验仿真结果误码率bit_error_count =11ber =0.0011四、参考文献 1 Erich Cosby.

31、Orthogonal Frequency Division Multip lexing(OFDM) Tutorial and AnalysisM . Northern Virginia Center,2001. 2 Mingqi L i, ,Qicong Peng, Yubai L i, Performance Evaluation ofMC - DS - CDMA Systems inMultipath Fading Channels J . 0- 7803 - 7547 - 5 /02, IEEE , 2002. 3 A Peled, A Ruiz. Frequency domain da

32、ta transmission usingreduced computational comp lexity algorithmsC . In Proc.IEEE Int. Conf. Acoust. , Speech, Signal Processing, 1980.964 - 967. 4 R van Nee. OFDM WirelessMultimedia CommunicationsM .Rrasad R. Artech House, 1998. 5 周正兰,等. OFDM及其链路级平台的Simulink实现 J . 中国数据通信, 2003, (10) : 90 - 92 6 尹泽明

33、,等. 精通MATLAB6 M . 清华大学出版社, 2002. 7 蔡涛, 等译. 无线通信原理与应用M . 电子工业出版社,1999. 8 丁玉美,等. 数字信号处理M. 西安电子科技大学出版社, 2003.五、实习体会本次实习的题目是OFDM系统的建模与仿真,对于我们通信工程各专业的学生来说这也是毕业设计的一次热身,也让我们提前走上了工作的实习岗位,为以后工作和奋斗垫上了丰厚的基石。我通过本次课程设计巩固并扩展了本专业的基本概念,基本理论,分析方法和实现方法。集合数字信号处理,移动通信和通信原理的MATLAB编程。这次课程设计,培养了我的软件编程实现能力,解决实际问题能力,和独立思考。加

34、强了我对OFDM系统原理的理解,为能顺利完成毕业设计和走上工作岗位做好了准备。 附录资料:不需要的可以自行删除 C语言图形模式速成第一节 图形模式的初始化Turbo C 提供了非常丰富的图形函数,所有图形函数的原型均在graphics. h 中,本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。另外,使用图形函数时要确保有显示器图形驱动程序*.BGI,同时将集成开发环境options/Linker中的Graphics lib选为on,只有这样才能保证正确使用图形函数。 不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器,在不同模式下

35、也有不同分辨率。因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。设置屏幕为图形模式,可用下列图形初始化函数:void far initgraph(int far *gdriver, int far *gmode,char *path);其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见graphics. h。图形驱动程序由Turbo C出版商提供,文件扩展名为.BGI。

36、 根据不同的图形适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序EGAVGA.BGI。#include stdio.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;有时编程者并不知道所用的图形显示器适配器种类,或者需要将编写的程序用于不同图形驱动

37、器,Turbo C 提供了一个自动检测显示器硬件的函数,其调用格式为:void far detectgraph(int *gdriver, *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); /*输出测试结果*/get

38、ch();initgraph(&gdriver, &gmode, C:TC2.0BGI);/* 根据测试结果初始化图形*/bar3d(100, 100, 300, 250, 50, 1); /*画一长方体*/getch();closegraph();return 0;上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置,但Turbo C提供了一种更简单的方法, 即用gdriver=DETECT 语句后再跟initgraph()函数就行了。采用这种方法后,上例可改为:#include stdio.h#include graphics.hint main()int gdriver

39、=DETECT, gmode;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(50, 50, 150, 30, 50, 1);getch();closegraph();return 0;另外,Turbo C 提供了退出图形状态的函数closegraph(),其调用格式为:void far closegraph(void);第二节 屏幕颜色的设置和清屏函数对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。在Turbo C中分别用下面两个函数: 设置背景色: void far setbkcolor(int color);设置作图色: voi

40、d far setcolor(int color);其中color 为图形方式下颜色的规定数值,对EGA,VGA显示器适配器,有关颜色的符号常数及数值见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); /*设

41、置图形背景*/cleardevice();for(i=0; i=15; i+)setcolor(i); /*设置不同作图色*/circle(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也提供了几个获得现行颜色设置情况的函数

42、。 int far getbkcolor(void); 返回现行背景颜色值。int far getcolor(void); 返回现行作图颜色值。int far getmaxcolor(void); 返回最高可用的颜色值。第三节 基本画图函数基本图形函数包括画点,线以及其它一些基本图形的函数。本节对这些函数作一全面的介绍。 、画点. 画点函数 void far putpixel(int x, int y, int color); 该函数表示有指定的象元画一个按color 所确定颜色的点。对于颜色color的值可从表3中获得而对x, y是指图形象元的坐标。在图形模式下,是按象元来定义坐标的。对VG

43、A适配器,它的最高分辨率为640 x480,其中640为整个屏幕从左到右所有象元的个数,480为整个屏幕从上到下所有象元的个数。屏幕的左上角坐标为(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 fa

44、r getx(void); 返回游标在x轴的位置。void far gety(void); 返回游标有y轴的位置。void far moveto(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

45、far lineto(int x, int y); 画一作从现行游标到点(x, y)的直线。void far linerel(int dx, 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结束(用度表示

46、)画一段圆弧线。在TURBO C中规定x轴正向为0 度,逆时针方向旋转一周, 依次为90,180, 270和360度(其它有关函数也按此规定,不再重述)。 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,

47、inty2); 以(x1, y1)为左上角,(x2, y2)为右下角画一个矩形框。 void far drawpoly(int numpoints, int far *polypoints); 画一个顶点数为numpoints,各顶点坐标由polypoints给出的多边形。polypoints整型数组必须至少有2 倍顶点数个无素。每一个顶点的坐标都定义为x,y,并且x在前。值得注意的是当画一个封闭的多边形时,numpoints 的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。下面举一个用drawpoly()函数画箭头的例子。#include stdio

48、.h#include graphics.hint main()int gdriver, gmode, i;int arw16=200,102,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、设定线型函数在

49、没有对线的特性进行设定之前,TURBO C 用其默认值,即一点宽的实线,但TURBO C 也提供了可以改变线型的函数。线型包括:宽度和形状。其中宽度只有两种选择:一点宽和三点宽。而线的形状则有五种。下面介绍有关线型的设置函数。void far setlinestyle(int linestyle,unsigned upattern,int thickness);该函数用来设置线的有关信息,其中linestyle是线形状的规定,见graphics.h。对于upattern,只有linestyle选USERBIT_LINE 时才有意义 (选其它线型,uppattern取0即可)。此时uppatte

50、rn的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。 void far getlinesettings(struct linesettingstypefar *lineinfo);该函数将有关线的信息存放到由lineinfo 指向的结构中,表中linesettingstype的结构如下:struct linesettingstypeint linestyle;unsigned upattern;int thickness;例如下面两句程序可以读出当前线的特性 struct linesettingstype *info;getlinesettings(info)

51、;void far setwritemode(int mode);该函数规定画线的方式。如果mode=0,则表示画线时将所画位置的原来信息覆盖了(这是TURBO C的默认方式)。如果mode=1, 则表示画线时用现在特性的线与所画之处原有的线进行异或(XOR)操作,实际上画出的线是原有线与现在规定的线进行异或后的结果。因此,当线的特性不变,进行两次画线操作相当于没有画线。有关线型设定和画线函数的例子如下所示。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;gdriver=DETECT;initgraph(&g

52、driver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(GREEN);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()

53、;return 0;第四节 基本图形的填充填充就是用规定的颜色和图模填满一个封闭图形。 一般是先画轮廓再填充。TURBO C提供了一些先画出基本图形轮廓, 再按规定图模和颜色填充整个封闭图形的函数。在没有改变填充方式时,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 t

54、opflag);当topflag为非0时, 画出一个三维的长方体。当topflag为0时,三维图形不封顶,实际上很少这样使用。说明: bar3d()函数中,长方体第三维的方向不随任何参数而变,即始终为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 se

55、ctor(int x, int y,int stanle,intendangle,int xradius, int yradius);画一个以(x, y)为圆心分别以xradius, yradius为x轴和y轴半径,stangle 为起始角,endangle为终止角的椭圆扇形,再按规定方式填充。第五节 设定填充方式TURBO C有四个与填充方式有关的函数。下面分别介绍: void far setfillstyle(int pattern, int color); color的值是当前屏幕图形模式时颜色的有效值。pattern的值及与其等价的符号常数见graphics.h。除USER_FILL(

56、用户定义填充式样)以外,其它填充式样均可由setfillstyle() 函数设置。当选用USER_FILL时,该函数对填充图模和颜色不作任何改变。 之所以定义USER_FILL主要因为在获得有关填充信息时用到此项。void far setfillpattern(char * upattern,int color); 设置用户定义的填充图模的颜色以供对封闭图形填充。其中upattern是一个指向8个字节的指针。这8个字节定义了8x8点阵的图形。每个字节的8位二进制数表示水平8点,8个字节表示8行,然后以此为模型向个封闭区域填充。void far getfillpattern(char * upa

57、ttern); 该函数将用户定义的填充图模存入upattern指针指向的内存区域。void far getfillsetings(struct fillsettingstypefar * fillinfo); 获得现行图模的颜色并将存入结构指针变量fillinfo中。其中fillsettingstype结构定义如下:struct fillsettingstypeint pattern; /* 现行填充模式 * /int color; /* 现行填充模式 * /; 有关图形填充图模的颜色的选择,请看下面例程。#include stdio.h#include graphics.hmain()cha

58、r str8=10,20,30,40,50,60,70,80; /*用户定义图模*/int gdriver,gmode,i;struct fillsettingstype 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,1

59、00,500,200,70,1); /* 画长方体并填充*/pieslice(200, 300, 90, 180, 90);/*画扇形并填充*/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();getfillsetti

60、ngs(&save);/*获得用户定义的填充模式信息*/closegraph();clrscr();printf(The pattern is %d, The color of filling is %d,save.pattern, save.color);/*输出目前填充图模和颜色值*/getch();第六节 任意封闭图形的填充截止目前为止,我们只能对一些特定形状的封闭图形进行填充,但还不能对任意封闭图形进行填充。为此,TURBO C 提供了一个可对任意封闭图形填充的函数,其调用格式如下: void far floodfill(int x, int y, int border); 其中:x,

温馨提示

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

评论

0/150

提交评论