版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机网络课程实验报告实验2:抗干扰编码姓名李蓝鑫院系自动化学院学号U201514280实验地点科技楼十二楼机房实验时间2018年5月3日实验目的:1. 了解抗干扰编码原理。2、掌握海明编码和CRC编码的原理,能熟练计算实验内容:内容1:海明编码 海明编码原理将有效信息按某种规律分成若干组,每组安排一个校验位通过异或运算进行校验,得出具体的校验码;在接收端同样通过异或运算看各组校验结果是否正确,并观察出错的校校组,或者个出错的校验组的共同校验位,得出具体的出错比特位;对错误位取反来将其纠正;假设用N表示添加了校验码位后整个传输信息的二进制位数,用K代表其中有效信息位数,r表示添加的校验码位数,
2、它们之间的关系应满足:N=Kr2r1(是为了确保r位校验码能校验全部的数据位,因为r位校验码所能表示的最大十进制数为2r-1,同时也确保各位码本身不被其他校验码校验)。海明码的校验码的位置必须是在2n次方位置(n从0 开始,分别代表从左边数起分别是第1、2、4、8、16),信息码也就是在非2n次方位置第i位校验码从当前校验码位开始,每次连续校验i位后再跳过i位,然后再连续校验i位,再跳过i位,以此类推。确定每个校验码所校验的比特位: 海明编码程序流程图 交互界面设计 编码:原码序列从“输入序列”编辑框输入,点击“编码”按钮在“编码序列”编辑框内输出编码序列,对输入编码要求为二进制输入译码:编码
3、序列从“输入序列”编辑框输入,点击“译码”按钮在“译码序列”编辑框内输出译码序列,若译码错误会有响应的报错和纠错,对输入序列有不小于三位和二进制序列的要求 核心代码与注释输入序列框callback%做输入检测,检测是否是“0”“1”输入,否则报错temp_str=get(handles.input,String);num_char=unique(temp_str);%unique函数获得输入字符串中不同字符的字符串if length(num_char)=2 %如果字符串长度为2 if num_char(2)=1 %第二个字符不是“1”说明字符串中有其他字符 else set(handles.i
4、nput,String,0000); errordlg(只能输入1和0,输入错误); endelseif length(num_char)=1 %如果字符串长度为1,判断“1”还是“0,否则报错 if num_char(1)=0 elseif num_char(1)=1 else set(handles.input,String,0000); errordlg(只能输入1和0,输入错误); end else %如果字符串长度不为2,直接报错 set(handles.input,String,0000); errordlg(只能输入1和0,输入错误); End编码按钮callback(编码核心)
5、%获取输入字符串temp_str=get(handles.input,string);%获取字符串长度len_str=length(temp_str);%转存原码字符串长度备用k=len_str;%初始化需要插入的校验码的位数r=0;%根据海明编码的2(r)-1)(k+r)要求,计算校验码位数while(2(r)-1)(k+r) r=r+1;end%把字符串数组转成0和1的数组,便于处理for i=1:1:len_str if temp_str(i)=1 yuan(i)=1;%原码数组为yuan else yuan(i)=0; endend%把求得相应位数的校验码,用0插入原码中得到新码j=0
6、;m=1;for i=1:1:(k+r) if i=2(j) %如果该位置为2的次方,则插入校验码 xin(i)=0; j=j+1; else xin(i)=yuan(m); m=m+1; endend%进行海明编码odd=0;%用于计算每位校验码负责校验的位置的和for j=1:1:r %共有r位校验码,需要计算r次 n=1; %初始化循环变量 i=1; while(n*2(j-1)+i-1)(2(j-1) %如果本段的编码已经加完 i=1; %则调转到下一段,也就是隔一个2(j-1)的段再进行累加 n=n+2; else %累加 odd=odd+xin(n*2(j-1)+i-1); i=i
7、+1; end end if mod(odd,2)=0 %判断是否为偶数 xin(2(j-1)=0; %若为偶数,则在对应的校验位插入0 else xin(2(j-1)=1; %若为奇数,则在对应的校验为插入1 end odd=0;end%编码完毕,把数组转换成字符串用于输出for i=1:1:(k+r) if xin(i)=1 output_str(i)=1; else output_str(i)=0; endendset(handles.out,String,output_str);译码按钮callback(原理与编码基本相同)%获得译码序列字符串temp_str=get(handles.
8、input,string);len_str=length(temp_str);%判断输入序列长度是否满足要求,不满足报错返回if len_str=len_str) r=r-1; end r=r+1;%找到校验码的个数 k=len_str-r; for i=1:1:len_str%得到所有编码数组 if temp_str(i)=1 xin(i)=1; else xin(i)=0; end end %提取出信息编码数组 m=1; j=0; for i=1:1:(k+r) if i=2(j) j=j+1; else yuan(m)=xin(i); m=m+1; end end %重新偶校验,原理同编
9、码 odd=0; for j=1:1:r n=1; i=1; while(n*2(j-1)+i-1)(2(j-1) i=1; n=n+2; else odd=odd+xin(n*2(j-1)+i-1); i=i+1; end end if mod(odd,2)=0 check(j)=0; %校验结果存在check数组中 else check(j)=1; end odd=0; end %把check数组也就是校验结果转成十进制数 num_wrong=0; for j=1:1:r num_wrong=num_wrong*2; if check(r-j+1)=1 num_wrong=num_wron
10、g+1; end end %判断校验是否正确,为0则正确 if num_wrong=0 for m=1:1:k if yuan(m)=1 output_str(m)=1; else output_str(m)=0; end end set(handles.ym_out,String,output_str); else%否则校验错误,对应位置取反后再输出 if xin(num_wrong)=0 xin(num_wrong)=1; else xin(num_wrong)=0; end m=1; j=0; for i=1:1:(k+r) if i=2(j) j=j+1; else yuan(m)=x
11、in(i); m=m+1; end end for m=1:1:k if yuan(m)=1 output_str(m)=1; else output_str(m)=0; end end set(handles.ym_out,String,output_str); errordlg(校验码第 ,num2str(num_wrong), 位出错,对应位置取反后得到正确解码为,output_str,校验出错); endend1.5 程序执行测试1.5.1 编码测试正常编码1.5.2 译码测试输入报错正常解码解码错误与纠正内容2:CRC编码2.1 CRC编码原理在K位信息码后再拼接R位的校验码,整个编
12、码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。 校验码的具体生成过程为:假设要发送的信息用多项式C(X)表示,将C(x)左移R位(可表示成C(x)*2R),这样C(x)的右边就会空出R位,这就是校验码的位置。用 C(x)*2R 除以生成多项式G(x)得到的余数就是校验码。若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得V(x)=A(x)g(x)=xRm
13、(x)+r(x);其中: m(x)为K次原始的信息多项式, r(x)为R-1次校验多项式(即CRC校验和),g(x)称为生成多项式:g(x)=g0+g1x1+ g2x2+.+g(R-1)x(R-1)+gRxR发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。2.2 CRC编码程序流程图 2.3 交互界面设计 编码:原码序列由“输入序列”编辑框输入,生成式由“生成式子”编辑框输入,点击“编码”按钮,在“输出序列”编辑框输出编码序列,对输入序列有二进制输入的要求,对生成式的输入除二进制输入以外,还有首位与末位不能为0的要求 译码:编码序列由“输入序列”编辑框输入
14、,生成式由“生成式子”编辑框输入,点击“译码”按钮,在“输出序列”编辑框输出译码序列,对输入序列有二进制输入的要求,还有不能小于生成式的长度,否则将报错,对生成式的输入除二进制输入以外,还有首位与末位不能为0的要求2.4 核心代码与注释编码按钮callback(编码核心)temp_str=get(handles.input,string);len_str1=length(temp_str);for i=1:1:len_str1 %把原码的字符串转成数组,便于后续处理 if temp_str(i)=1 sz(i)=1; temp_sz(i)=1; else temp_sz(i)=0; sz(i)
15、=0; endendtemp_crc=get(handles.crc,string);len_scs=length(temp_crc)-1; for i=1:1:(len_scs+1) %把生成式的字符串转成数组 if temp_crc(i)=1 scs(i)=1; else scs(i)=0; endend%把原码后面加上CRC冗余编码,位数为CRC生成式长度-1for i=len_str1+1:1:(len_str1+len_scs) temp_sz(i)=0; sz(i)=0;end%从生成式长度位开始往后循环做类似于长除法的运算,实际为异或,注意首位为0时商0for j=(len_sc
16、s+1):1:(len_str1+len_scs) if temp_sz(j-len_scs)=0 for i=1:1:(len_scs+1) if temp_sz(j-len_scs-1+i)=0 temp_sz(j-len_scs-1+i)=0; else temp_sz(j-len_scs-1+i)=1; end end else for i=1:1:(len_scs+1) if scs(i)=temp_sz(j-len_scs-1+i) temp_sz(j-len_scs-1+i)=0; else temp_sz(j-len_scs-1+i)=1; end end endend%把得到
17、的冗余码余子式加上原码后面形成编码for i=(len_str1+1):1:(len_str1+len_scs) sz(i)=temp_sz(i);end%把数组转成字符串数组并输出for i=1:1:(len_str1+len_scs) if sz(i)=1 output_str(i)=1; else output_str(i)=0; endendset(handles.output,String,output_str);译码按钮callback(原理与编码基本相同)temp_str=get(handles.input,string);len_str1=length(temp_str);fo
18、r i=1:1:len_str1 if temp_str(i)=1 sz(i)=1; temp_sz(i)=1; else temp_sz(i)=0; sz(i)=0; endendtemp_crc=get(handles.crc,string);len_scs=length(temp_crc)-1;if len_str10 set(handles.output,String,NONE); errordlg(校验错误,校验错误); endEnd2.5 程序执行测试2.5.1 编码测试正常编码2.5.2 译码测试输入报错正常译码译码报错内容3:思考问题3.1 CRC编码和海明编码的主要区别有哪些
19、?3.1.1 CRC和海明的校验码的位置不同,CRC冗余码加在原码序列后面,从而形成编码序列,而海明是插在2的次方位 3.1.2 CRC的冗余码位数和生成式有关,一旦生成式定下来,那么冗余码位数就确定,而海明则是与输入编码序列的位数有关,输入编码序列位数越多,海明校验码的位数越多 3.1.3 CRC和海明的校验原理完全不同,CRC是基于长除法的一种余子式校验,而海明则是基于奇偶校验,而且校验码把原来的信息码分片校验 3.1.4 CRC没有纠错能力,但是易于电路实现,因为异或和以为实现简单,所以广泛用于实际校验,而海明虽然具有纠错能力,但是计算比较复杂,因为需要次方运算,而且只能纠一位错,所以实
20、用性不如前者。3.2 海明编码能纠多位错误吗? 不能,海明码能校验出两位错误,并能纠正一位错误。3.3 CRC编码的检错能力与生成多项式最高幂次数值有关系吗? 有,考虑极端情况,如果生成式只有三位,那么余数只有00,01,10,11,四种情况, 所以如果原码信息码错上多位,很有可能导致校验码出现00的情况,也就是正确的。实验过程中遇到的问题如何解决的?问题1: CRC编码的输入和运算的实现 解决:因为输入的是字符串序列,所以不能直接进行运算,而且如果转成十进制数或者二进制数也不好提却出来做位运算,最终采用数组形式,这样0 和 1的提取就很方便问题2:CRC编码在实现过程中的移位和除法问题 解决
21、:使用暂存的原码序列做除法,设置双层循环,外层是除法的次数,内层是生成式子的长度,即异或运算的次数问题3:CRC的生成式序列需要检验,不能直接用于编码 解决:对生成式输入序列做检测,如果首位或者末位为1,需要报错问题4:海明在实现过程中,对于每位校验码的计算问题解决:对每位校验码负责的位进行累加,使用两层循环,外层是校验码的位数,也就是需要计算的次数,内层是以当前处理位数是否小于总长度的循环,内部做加和运算,每次加的位数是2的对应次方位。问题5: 海明在校验时,如何找出错误的位数解决:对序列先做提取校验码位数的计算,然后再对编码进行一次海明校验,把校验结果转化成十进制数,即为错误的位数,此处注
22、意二进制数序列转成十进制时,低位在前高位在后注:实验体会综合在实验四报告中附录资料:不需要的可以自行删除 C语言曲线函数像素函数putpixel() 画像素点函数 getpixel()返回像素色函数 直线和线型函数line() 画线函数 lineto() 画线函数 linerel() 相对画线函数 setlinestyle() 设置线型函数 getlinesettings() 获取线型设置函数 setwritemode() 设置画线模式函数 多边形函数HYPERLINK /view/553113.htmrectangle() 画矩形函数 bar() 画条函数 bar3d() 画条块函数 dra
23、wpoly() 画多边形函数 圆、弧和曲线函数getaspectratio()获取纵横比函数 circle()画圆函数 arc() 画圆弧函数 ellipse()画HYPERLINK /view/36981.htm椭圆弧函数 fillellipse() 画椭圆区函数 pieslice() 画扇区函数 sector() 画椭圆扇区函数 getarccoords()获取圆弧坐标函数 填充函数setfillstyle() 设置填充图样和颜色函数 setfillpattern() 设置用户图样函数 floodfill() 填充闭域函数 fillpoly() 填充多边形函数 getfillsetting
24、s() 获取填充设置函数 getfillpattern() 获取用户图样设置函数 图像函数imagesize() 图像存储大小函数 getimage() 保存图像函数 putimage() 输出图像函数 图形和图像函数对许多图形HYPERLINK /view/330120.htm应用程序,直线和HYPERLINK /view/400.htm曲线是非常有用的。但对有些图形只能靠操作单个像素才能画出。当然如果没有画像素的功能,就无法操作直线和曲线的函数。而且通过大规模使用像素功能,整个图形就可以保存、写、擦除和与屏幕上的原有图形进行叠加。 (一) 像素函数putpixel() 画像素点函数功能:
25、函数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()返回像素色函数功能: 函数getpixel()返回像素点颜色值。 用法: 该函数调用方式为int getpixel(int x
26、,int y); 说明: 参数x,y为像素点坐标。 函数的返回值可以不反映实际彩色值,这取决于HYPERLINK /view/1120949.htm调色板的设置情况(参见setpalette()函数)。 这个函数相应的头文件为graphics.h 返回值: 返回一个像素点色彩值。 例: 把屏幕上(8,6)点的像素颜色值赋给变量color。 color=getpixel(8,6); (二) 直线和线型函数有三个画直线的函数,即line(),lineto(),linerel()。这些直线使用整型坐标,并相对于当前图形视口,但不一定受视口限制,如果视口裁剪标志clip为真,那么直线将受到视口边缘截断
27、;如果clip为假,即使终点坐标或新的当前位置在图形视口或屏幕极限之外,直线截断到屏幕极限。 有两种线宽及几种线型可供选择,也可以自己定义线图样。下面分别介绍直线和线型函数。 line() 画线函数功能: 函数line()使用当前绘图色、线型及线宽,在给定的两点间画一直线。 用法: 该函数调用方式为void line(int startx,int starty,int endx,int endy); 说明: 参数startx,starty为起点坐标,endx,endy为终点坐标,函数调用前后,图形状态下屏幕光标(一般不可见)当前位置不改变。 此函数相应的头文件为graphics.h 返回值:
28、无 例: 见函数60.linerel()中的实例。 lineto() 画线函数功能: 函数lineto()使用当前绘图色、线型及线宽,从当前位置画一直线到指定位置。 用法: 此函数调用方式为void lineto(int x,int y); 说明: 参数x,y为指定点的坐标,函数调用后,当前位置改变到指定点(x,y)。 该函数对应的头文件为graphics.h 返回值: 无 例: 见函数60.linerel()中的实例。 linerel() 相对画线函数功能: 函数linerel() 使用当前绘图色、线型及线宽,从当前位置开始,按指定的水平和垂直偏移距离画一直线。 用法: 这个函数调用方式为v
29、oid 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,); setcolor(15); line(66,66,88,88); lineto(100,100); linerel
30、(36,64); getch(); restorecrtmode(); setlinestyle() 设置线型函数功能: setlinestyle() 为画线函数设置当前线型,包括线型、线图样和线宽。 用法: setlinestyle() 函数调用方式为void setlinestyle(int stly,unsigned pattern,int wigth); 说明: 参数style为线型取值,也可以用相应名称表示,如表1-10中所示。 参数pattern用于自定义线图样,它是16位(bit)字,只有当style=USERBIT_LINE(值为1)时,pattern的值才有意义,使用用户自定
31、义线图样,与图样中“1”位对应的像素显示,因此,pattern=0 xFFFF,则画实线;pattern=0 x9999,则画每隔两个像素交替显示的虚线,如果要画长虚线,那么pattern的值可为0 xFF00和0 xF00F,当style不为USERBIT_LINE值时,虽然pattern的值不起作用,但扔须为它提供一个值,一般取为0。 参数wigth用来设定线宽,其取值见表1-11,表中给出了两个值,即1和3,实际上,线宽取值为2也是可以接受的。 若用非法参数调用setlinestyle()函数,那么graphresult()会返回错误代码,并且当前线型继续有效。 Turbo C提供的线型
32、与线宽定义在头文件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中所提供的线型图样: #i nclude void main() int driver,mode;i; driver=
33、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 getlinesettings(struct linesettingstype *info); 说明: 此函数调用执行后
34、,当前的线型、线图样和线宽值被装入info指向的结构里,从而可从该结构中获得线型设置。 linesettingstype型结构定义如下: struct linesettingstype int linestyle; unsigned upattern; int thickness; ; 其中linestyle用于存放线型,线型值为表1-10中的各值之一。 upattern用为装入用户自定义线图样,这是16位字,每一位等于一个像素,如果哪个位被设置,那么该像素打开,否则关闭。 thickness为线宽值存放的变量,可参见表1-11。 getlinesettings()函数对应的头文件为graph
35、ics.h 返回值: 返回的线型设置存放在info指向的结构中。 例: 把当前线型的设置写入info结构: struct linesettingstype info; getlinesettings(&info); setwritemode() 设置画线模式函数功能: 函数setwritemode() 设置画线模式 用法: 函数调用方式为 void setwritemode()(int mode); 说明: 参数mode只有两个取值0和1,若mode为0,则新画的线将覆盖屏幕上原有的图形,此为缺省画线输出模式。如果mode为1,那么新画的像素点与原有图形的像素点先进行异或(XOR)运算,然后输
36、出到屏幕上,使用这种画线输出模式,第二次画同一图形时,将擦除该图形。调用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),那么调用该函数后,只有在图形视口内的矩形部分才被画出。 这个函数对应的头文件为graphics.h 返回值: 无 例:
38、 下面的程序画一些矩形实例: #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() 画条函数功能: 函数bar()用当前填充图样和填充色(注意不是给图色)画出一个指定上左上角与右下角的实心长条形(长方块或正
39、方块),但没有四条边线)。 用法: bar()函数调用方式为void bar(int left,int top,int right,int bottom); 说明: 参数left,topright,bottom分别为左上角坐标与右下角坐标,它们和调用函数rectangle()的情形相同,调用此函数前,可用setfillstyle()或setfillpattern()设置当前填充图样和填充色。 注意此函数只画没有边线的条形,如果要画有边线的的条形,可调用下面的函数bar3d()来画,并将深度参数设为0,同时topflag参数要设置为真,否则该条形无顶边线。 这 应的头文件为graphics.h
40、返回值: 无 例: 见函数bar3d()中的实例。 bar3d() 画条块函数功能: 函数bar3d() 使用当前绘图色、线型及线宽画出三维长方形条块,并用当前填充图样和填 充色填充该三维条块的表面。 用法: 此函数调用方式为void bar3d(int left,int top,int right,int bottom,int depth,int topflag); 说明: 参数left,top,right,bottom分另为左上角与右下角坐标,这与bar()函数中的一样。参数depth为条块的深度,以像素为单位,通常按宽度的四分之一计算。深度方向通过屏显纵横比调节为约45度(即这时x/y比
41、设置为1:1)。 参数topflag相当于一个HYPERLINK /view/46060.htm布尔参数,如果设置为1(真)那么条块上放一顶面;若设置为0(假),则三维条形就没有顶面,这样可使多个三维条形叠加在一起。 要使图形更加美观,可利用函数floodfill()或setfillpattern()来选择填充图样和填充色(参见本小节(五)填充函数 )。 bar3d()函数对应的头文件为graphics.h 返回值: 无 例: 下面的程序画一个条形和条块: #i nclude void main() int driver,mode; driver=DETECT; mode=0; initgra
42、ph(&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 drawpoly(int pnumber,int *points); 说明: 参数pnumber为多边形的顶点数;参数po
43、ints指向整型HYPERLINK /view/209670.htm数组,该数组中是多边形所有顶点(x,y)坐标值,即一系列整数对,x坐标值在前。显然整型数组的维数至少为顶点数的2倍,在定义了多边形所有顶点的数组polypoints时,顶点数目可通过计算sizeof(polypoints)除以2倍的sizeof(int)得到,这里除以2倍的原因是每个顶点有两个整数坐标值。另外有一点要注意,画一个n个顶点的闭合图形,顶点数必须等于n+1,并且最后一点(第n+1)点坐标必须等于第一点的坐标。 drawpoly()函数对应的头文件为grpahics.h 返回值: 无 例: 下面的程序画一个封闭星形图
44、与一个不封闭星形图: #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,110; driver=DETECT; mode=0; initgraph(&driver,&mode,); dr
45、awpoly(9,polypoints1); drawpoly(9,polypoints2); getch(); restorecrtmode(); (四)、 圆、弧和曲线函数在一个屏幕上画得很圆的图形到另一个屏幕上可能被压扁或拉长,这是因为每一种显示卡与之相应的显示模式都有一个纵横比。纵横比是指像素的水平方向大小与垂直方向大小的比值。如VGA显示卡由于偈素基本上是正方形,所以纵横比为1.000。 为了保证几何图形基本按预计情况显示在屏幕上,用屏显的纵横比来计算和纠正不同硬件及显示卡产生的畸变。计算纵横比所需要的水平方向和垂直方向的比例系数可调用函数getaspectratio()获得。 ge
46、taspectratio()获取纵横比函数功能: 函数getaspectratio()返回x方向和y方向的比例系数,用这两个整型值可计算某一特定屏显的纵横比。 用法: 此函数调用方式为void getaspectratio(int xasp,int yasp); 说明: 参数xasp指向的变量存放返回的x方向比例系数;参数yasp指向的变量存放返回的y方向比例系数。通常y方向比例系数为10 000, x方向比例系数不大于10 000(这是因为大多数屏幕像素高比宽长)。 注意纵横比自动用作下面函数arc(),circle()和pieslice()中的标尺因子,使屏幕上圆或弧正常显示。但用elli
47、pse()函数画椭圆必须调用本函数获取纵横比作为标尺因子,否则不予调整。纵横比可用于其它几何图形,目的是校正和显示图形。 getaspectratio()函数对应的头文件为graphics.h 返回值: 返回x与y方向比例系数分别存放在xasp和yasp所指向的变量中。 例: 下面的程序显示纵横比: int xasp,yasp; float aspectratio; getaspectratio(&xasp,&yasp); aspectratio=xasp/yasp; printf(aspect ratio: %f,aspectratio); circle()画圆函数功能: 函数circle(
48、)使用当前绘图色并以实线画一个完整的圆。 用法:该函数调用方式为void circle(int x,int y,int radius); 说明: 参数x,y为圆心坐标,radius为圆半径,用像素个素表示。注意,调用circle()函数画圆时不用当前线型。 不同于ellipse()函数,只用单个半径radius参数调用circle()函数,故屏显纵横比可以自动调节,以产生正确的显示图。 此函数对应的头文件为graphics.h 返回值: 无 例: 画六个同心圆,圆心在(100,100)。 #i nclude void main() int driver,mode; driver=DETECT;
49、 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(int x,int y,int startangle,int endangle,int radius); 说明: 参
50、数x,y为圆心坐标,startangle与endangle分别为起始角与终止角,radius为半径。圆心坐标和半径以像素个数给出,起始角和终止角以度为单位,0度位于右边,90度位于顶部,180度位于左边,底部是270度。同往常一样,360度与0度重合。角度按逆时针方向增加,但并不要求终止角一定比起始角大。例如指定300度和90度分别为起始角和终止角,与指定300度和450度分别为起始角和终止角可画出相同的弧。大于360度可作为参数,它将被化到0度360度范围里。函数arc()能画封闭圆,只要取起始角为0度,终止角为360度即可。此函数中,屏显纵横比可自动调节。 arc()函数对应的头文件为gr
51、aphics.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头文件的内容:/* graphics.h Definitions for Graphics Package. Copyright (c) B
52、orland 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 = -1, grNotDetected = -2, grFileNotFound = -3, grInvali
53、dDriver = -4, grNoLoadMem = -5, grNoScanMem = -6, grNoFloodMem = -7, grFontNotFound = -8, grNoFontMem = -9, grInvalidMode = -10, grError = -11, /* generic error */ grIOerror = -12, grInvalidFont = -13, grInvalidFontNum = -14, grInvalidVersion = -18 ; enum graphics_drivers /* define graphics drivers
54、*/ 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 palette 0; 1 page */ CGAC1 = 1, /* 320 x200 palette 1; 1 page
55、 */ 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 palette 2; 1 page */ MCGAC3 = 3, /* 320 x200 palette 3; 1 pag
56、e */ 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 */ EGAMONOHI = 0, /* 640 x350 64K on card, 1 256K on car
57、d, 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 */ ATT400MED = 4, /* 640 x200 1 page */ ATT400HI = 5, /* 640 x
58、400 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 256 colors */ ; /* Colors for setpalette and setallpale
59、tte */ #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 enum CGA_COLORS CGA_LIGHTGREEN = 1, /* Palette C0 Color N
60、ames */ 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 */ CGA_MAGENTA = 2, CGA_LIGHTGRAY = 3 ; enum EGA_COLORS EGA_B
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 煤炭行业的金融投资与融资分析考核试卷
- 安全生产事故案例培训课件考核试卷
- 新能源技术研发与人才培养策略考核试卷
- 放射性金属矿床的资源勘查与评价方法考核试卷
- 如何克服撰写工作总结报告的压力考核试卷
- 废弃资源综合利用的应急管理与灾害防范考核试卷
- 牛津英语教材单词表
- 2025年高考语文一轮复习:文学类文本小说之小说中的形象
- DB11∕T 1828-2021 文物保护工程资料管理规程
- 眼部卫生课件教学课件
- 监控工程验收单-范本模板
- 机械设计产品案例分析报告
- 政治审查表(模板)
- 2024届高考英语复习语法填空课件
- 监控设备保养维护方案
- 公立医院绩效考核表
- 华电人才测评试题在线测试
- 《带压堵漏技术》课件
- 铜矿矿山规划与布局
- 备考2023高考语文二轮 高中语文 山水田园类诗歌阅读专项练习(解析)
- 人教版二年级上册口算练习1000题及答案
评论
0/150
提交评论