还剩15页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
c语言图形程序设计2009-07-2720:14:35HYPERLINKjavascript:;INCLUDEPICTUREhttp://simg.sinajs.cn/blog7style/images/common/sg_trans.gif\*MERGEFORMAT转载标签杂谈分类c语言程序设计
四、图形和图像函数一像素函数
56.putpiel画像素点函数
57.getpixel返回像素色函数二直线和线型函数
58.line画线函数
59.lineto画线函数
60.linerel相对画线函数
61.setlinestyle设置线型函数
62.getlinesettings获取线型设置函数
63.setwritemode设置画线模式函数
三、多边形函数
64.rectangle画矩形函数
65.bar画条函数
66.bar3d画条块函数
67.drawpoly画多边形函数四圆.弧和曲线函数
68.getaspectratio获取纵横比函数
69.circle画圆函数
70.arc画圆弧函数
71.ellipse画椭圆弧函数
72.fillellipse画椭圆区函数
73.pieslice画扇区函数
74.sector画椭圆扇区函数
75.getarccoords获取圆弧坐标函数
五、填充函数
76.setfillstyle设置填充图样和颜色函数
77.setfillpattern设置用户图样函数
78.floodfill填充闭域函数
79.fillpoly填充多边形函数
80.getfillsettings获取填充设置函数
81.getfillpattern获取用户图样设置函数
六、图像函数
82.imagesize图像存储大小函数
83.getimage保存图像函数
84.putimage输出图像函数
四、图形和图像函数 对许多图形应用程序,直线和曲线是非常有用的但对有些图形只能靠操作单个像素才能画出当然如果没有画像素的功能,就无法操作直线和曲线的函数而且通过大规模使用像素功能,整个图形就可以保存、写、擦除和与屏幕上的原有图形进行叠加一像素函数
56.putpixel画像素点函数功能函数putpixel在图形模式下屏幕上画一个像素点用法函数调用方式为voidputpixelintxintyintcolor;说明参数xy为像素点的坐标,color是该像素点的颜色,它可以是颜色符号名,也可以是整型色彩值 此函数相应的头文件是graphics.h返回值无例:#includegraphics.hconstintX=200;constintY=300;constintN=10;voidmainvoid{intdriver=DETECTmodei;initgraphdrivermode;setbkcolorWHITE;fori=0;iN;i+=100 putpixelX+iY+iGREEN;}
57.getpixel返回像素色函数功能:函数getpixel返回像素点颜色值用法:该函数调用方式为intgetpixelintxinty;说明:参数xy为像素点坐标函数的返回值可以不反映实际彩色值.这取决于调色板的设置情况参见setpalette函数这个函数相应的头文件为graphics.h返回值:返回一个像素点色彩值例把屏幕上86点的像素颜色值赋给变量color color=getpixel86;二直线和线型函数 有三个画直线的函数,即linelinetolinerel这些直线使用整型坐标,并相对于当前图形视口,但不一定受视口限制,如果视口裁剪标志clip为真,那么直线将受到视口边缘截断;如果clip为假,即使终点坐标或新的当前位置在图形视口或屏幕极限之外,直线截断到屏幕极限 有两种线宽及几种线型可供选择,也可以自己定义线图样下面分别介绍直线和线型函数
58.line画线函数功能函数line使用当前绘图色、线型及线宽,在给定的两点间画一直线用法该函数调用方式为voidlineintstartxintstartyintendxintendy;说明参数startxstarty为起点坐标endxendy为终点坐标,函数调用前后,图形状态下屏幕光标一般不可见当前位置不改变 此函数相应的头文件为graphics.h返回值无例见函数
60.linerel中的实例
59.lineto画线函数功能函数lineto使用当前绘图色、线型及线宽,从当前位置画一直线到指定位置用法此函数调用方式为voidlinetointxinty;说明参数xy为指定点的坐标,函数调用后,当前位置改变到指定点xy 该函数对应的头文件为graphics.h返回值无例:#includegraphics.hvoidmainvoid{ intdriver=DETECTmode; initgraphdrivermode; setcolor15; line66668888; lineto100100; linerel3664; getch; restorecrtmode;}
60.linerel相对画线函数功能函数linerel使用当前绘图色、线型及线宽,从当前位置开始,按指定的水平和垂直偏移距离画一直线用法这个函数调用方式为voidlinerelintdxintdy;说明参数dxdy分别是水平偏移距离和垂直偏移距离 函数调用后,当前位置变为增加偏移距离后的位置,例如,原来的位置是86,调用函数linerel1018后,当前位置为1824返回值无例下面的程序为画线函数调用实例#includegraphics.hvoidmainvoid{ intdriver=DETECTmode; initgraphdrivermode; setcolor15; line66668888; lineto100100; linerel3664; getch; restorecrtmode;}
61.setlinestyle设置线型函数功能setlinestyle为画线函数设置当前线型,包括线型、线图样和线宽用法setlinestyle函数调用方式为voidsetlinestyleintstlyunsignedpatternintwidth;说明参数style为线型取值,也可以用相应名称表示,如表1-10中所示 参数pattern用于自定义线图样,它是16位bit字,只有当style=USERBIT_LINE值为1时,pattern的值才有意义,使用用户自定义线图样,与图样中“1”位对应的像素显示,因此,pattern=0xFFFF,则画实线;pattern=0x9999,则画每隔两个像素交替显示的虚线,如果要画长虚线,那么pattern的值可为0xFF00和0xF00F,当style不为USERBIT_LINE值时,虽然pattern的值不起作用,但扔须为它提供一个值,一般取为0 参数wigth用来设定线宽,其取值见表1-11,表中给出了两个值,即1和3,实际上,线宽取值为2也是可以接受的 若用非法参数调用setlinestyle函数,那么graphresult会返回错误代码,并且当前线型继续有效 TurboC提供的线型与线宽定义在头文件graphics.h中,表1-10和1-11分别列出了参数的取值与含义表1-10线型----------------------------------------------------- 名 称 取值 含 义----------------------------------------------------- SOLID_LINE 0 实线 DOTTED_LINE 1 点线 CNTER_LINE 2 中心线 DASHED_LINE 3 虚线 USERBIT_LINE 4 用户自定义线型-----------------------------------------------------表1-11线宽----------------------------------------------------------- 名 称 取值 说 明----------------------------------------------------------- NORM_WIDTH常宽 1 一个像素宽缺省值 THICK_WIDTH加宽 3 三个像素宽-----------------------------------------------------------这个函数的头文件是graphics.h返回值无例下面的程序显示了BC中所提供的线型图样#includegraphics.hvoidmainvoid{ intdriver=DETECTmode; initgraphdrivermode; fori=0;i4;i++ { setlinestylei01; linei*50200i*50+60200 } getch; restorecrtmode;}
62.getlinesettings获取线型设置函数功能函数getlinesettings用当前设置的线型、线图样和线宽填写linesettingstype型结构用法函数调用方式为voidgetlinesettingsstructlinesettingstype*info;说明此函数调用执行后,当前的线型、线图样和线宽值被装入info指向的结构里,从而可从该结构中获得线型设置 linesettingstype型结构定义如下 structlinesettingstype{ intlinestyle; unsignedupattern; intthickness; }; 其中linestyle用于存放线型,线型值为表1-10中的各值之一 upattern用为装入用户自定义线图样,这是16位字,每一位等于一个像素,如果哪个位被设置,那么该像素打开,否则关闭 thickness为线宽值存放的变量,可参见表1-11 getlinesettings函数对应的头文件为graphics.h返回值返回的线型设置存放在info指向的结构中例把当前线型的设置写入info结构 structlinesettingstypeinfo; getlinesettingsinfo;
63.setwritemode设置画线模式函数功能函数setwritemode设置画线模式用法函数调用方式为voidsetwritemodeintmode;说明参数mode只有两个取值0和1,若mode为0,则新画的线将复盖屏幕上原有的图形,此为缺省画线输出模式如果mode为1,那么新画的像素点与原有图形的像素点先进行异或XOR运算,然后输出到屏幕上,使用这种画线输出模式,第二次画同一图形时,将擦除该图形调用setwritemode设置的画线输出模式只影响函数linelinetolinerelrecangle和drawpoly setwritemode函数对应的头文件是graphics.h返回值无例设置画线输出模式为0 setwritemode0;
三、多边形函数 对多边形,无疑可用画直线函数来画出它,但直接提供画多边形的函数会给用户很大方便最常见的多边形有矩形、矩形块或称条形、多边形和多边形块,我们还把长方形条块也放到这里一起考虑,虽然它不是多边形,但它的特例就是矩形块下面直接介绍画多边形的函数
64.rectangle画矩形函数功能函数rectangle用当前绘图色、线型及线宽,画一个给定左上角与右下角的矩形正方形或长方形用法此函数调用方式为voidrectangleintleftinttopintrightintbottom;说明参数lefttop是左上角点坐标,rightbottom是右下角点坐标如果有一个以上角点不在当前图形视口内,且裁剪标志clip设置的是真1,那么调用该函数后,只有在图形视口内的矩形部分才被画出 这个函数对应的头文件为graphics.h返回值无例下面的程序画一些矩形实例#includegraphics.hvoidmainvoid{ intdriver=DETECTmode; initgrpahdrivermode; rectangle8080220200; rectangle14099180300; rectangle668888; rectangle16872260360; getch; restorecrtmode;}
65.bar画条形函数功能函数bar用当前填充图样和填充色注意不是绘图色画出一个指定上左上角与右下角的实心矩形矩形块或正方块,但没有四条边线用法bar函数调用方式为voidbarintleftinttopintrightintbottom;说明参数lefttoprightbottom分别为左上角坐标与右下角坐标,它们和调用函数rectangle的情形相同,调用此函数前,可用setfillstyle或setfillpattern设置当前填充图样和填充色注意此函数只画没有边线的矩形,如果要画有边线的的矩形,可调用下面的函数bar3d来画,并将深度参数设为0,同时topflag参数要设置为真,否则该条形无顶边线这个函数对应的头文件为graphics.h返回值无例1画一个条形和条块#includegraphics.hvoidmainvoid{ intdriver=DETECTmode; initgraphdrivermode; setfillstyle1GREEN; bar6080220160; setfillstyle1RED; bar3d260180360240201; getch; restorecrtmode;}例2画有边线的矩形#includegraphics.hvoidmainvoid{intdriver=DETECTmode;initgraphdrivermode;setfillstyle1RED;bar3d15020030035001;}
66.bar3d画条块函数功能函数bar3d使用当前绘图色、线型及线宽画出三维长方形条块,并用当前填充图样和填充色填充该三维条块的表面用法此函数调用方式为voidbar3dintleftinttopintrightintbottomintdepthinttopflag;说明参数lefttoprightbottom分别为左上角与右下角坐标,这与bar函数中的一样参数depth为条块的深度,以像素为单位,通常按宽度的四分之一计算深度方向通过屏显纵横比调节为约45度即这时x/y比设置为11参数topflag相当于一个布尔参数,如果设置为1真那么条块上放一顶面;若设置为0假,则三维条形就没有顶面,这样可使多个三维条形叠加在一起要使图形更加美观,可利用函数floodfill或setfillpattern来选择填充图样和填充色参见本小节五填充函数 bar3d函数对应的头文件为graphics.h返回值无例下面的程序画一个条形和条块#includegraphics.hvoidmainvoid{ intdriver=DETECTmode; initgraphdrivermode; setfillstyle1GREEN; bar6080220160; setfillstyle1RED; bar3d260180360240201; getch; restorecrtmode;}
67.drawpoly画多边形函数功能:函数drawpoly用当前绘图色、线型及线宽,画一个给定若干点所定义的多边形用法:此函数调用方式为voiddrawpolyintpnumberint*points;说明:参数pnumber为多边形的顶点数;参数points指向整型数组,该数组中是多边形所有顶点xy坐标值,即一系列整数对,x坐标值在前显然整型数组的维数至少为顶点数的2倍,在定义了多边形所有顶点的数组polypoints时,顶点数目可通过计算sizeofpolypoints除以2倍的sizeofint得到,这里除以2倍的原因是每个顶点有两个整数坐标值另外有一点要注意,画一个n个顶点的闭合图形,顶点数必须等于n+1,并且最后一点第n+1点坐标必须等于第一点的坐标 drawpoly函数对应的头文件为grpahics.h返回值无例下面的程序画一个封闭星形图与一个不封闭星形图#includegraphics.hvoidmainvoid{ intdriver=DETECTmode; intpolypoints1
[18]={100100110120100130120125140140130120 140110120115100100}; intpolypoints2
[18]={180100210120200130220125240140230120 240110220115220110}; initgraphdrivermode; drawpoly9polypoints1; drawpoly9polypoints2; getch; restorecrtmode;}四圆.弧和曲线函数 在一个屏幕上画得很圆的图形到另一个屏幕上可能被压扁或拉长,这是因为每一种显示卡与之相应的显示模式都有一个纵横比纵横比是指像素的水平方向大小与垂直方向大小的比值如VGA显示卡由于偈素基本上是正方形,所以纵横比为
1.000 为了保证几何图形基本按预计情况显示在屏幕上,用屏显的纵横比来计算和纠正不同硬件及显示卡产生的畸变计算纵横比所需要的水平方向和垂直方向的比例系数可调用函数getaspectratio获得
68.getaspectratio获取纵横比函数功能函数getaspectratio返回x方向和y方向的比例系数,用这两个整型值可计算某一特定屏显的纵横比用法此函数调用方式为voidgetaspectratiointxaspintyasp;说明参数xasp指向的变量存放返回的x方向比例系数;参数yasp指向的变量存放返回的y方向比例系数通常y方向比例系数为10000,x方向比例系数不大于10000这是因为大多数屏幕像素高比宽长 注意纵横比自动用作下面函数arccircle和pieslice中的标尺因子,使屏幕上圆或弧正常显示但用ellipse函数画椭圆必须调用本函数获取纵横比作为标尺因子,否则不予调整纵横比可用于其它几何图形,目的是校正和显示图形 getaspectratio函数对应的头文件为graphics.h返回值返回x与y方向比例系数分别存放在xasp和yasp所指向的变量中例下面的程序显示纵横比 intxaspyasp; floataspectratio; getaspectratioxaspyasp; aspectratio=xasp/yasp; printfaspectratio:%faspectratio;
69.circle画圆函数功能函数circle使用当前绘图色并以实线画一个完整的圆用法该函数调用方式为voidcircleintxintyintradius;说明 参数xy为圆心坐标,radius为圆半径,用像素个素表示注意,调用circle函数画圆时不用当前线型 不同于ellipse函数,只用单个半径radius参数调用circle函数,故屏显纵横比可以自动调节,以产生正确的显示图 此函数对应的头文件为graphics.h返回值 无例 画六个同心圆,圆心在300240#includegraphics.hconstintX=300;constintY=240;constintN=240;voidmainvoid{ intdriver=DETECTmode=0i; initgraphdrivermode; setbkcolorGREEN; setcolorWHITE; fori=10;iN;i+=10 circleXYi; getch; restorecrtmode;}
70.arc画圆弧函数功能 函数arc使用当前绘图色并以实线画一圆弧用法 函数调用方式为voidarcintxintyintstartangleintendangleintradius;说明 参数xy为圆心坐标,startangle与endangle分别为起始角与终止角,radius为半径圆心坐标和半径以像素个数给出,起始角和终止角以度为单位,0度位于右边,90度位于顶部,180度位于左边,底部是270度同往常一样,360度与0度重合角度按逆时针方向增加,但并不要求终止角一定比起始角大例如指定300度和90度分别为起始角和终止角,与指定300度和450度分别为起始角和终止角可画出相同的弧大于360度可作为参数,它将被化到0-360度范围里函数arc能画封闭圆,只要取起始角为0度,终止角为360度即可此函数中,屏显纵横比可自动调节 arc函数对应的头文件为graphics.h返回值 无例 以200200为圆心,100为半径,从0度到120度画圆弧#includegraphics.hvoidmainvoid{ intdriver=DETECTmode; initgraphdrivermode; setcolorWHITE; arc2002000120100; getch; restorecrtmode;}
71.ellipse画椭圆弧函数功能 函数ellipse使用当前绘图色画一椭圆弧用法 该函数调用方式为voidellipseintxintyintstartangleintendangle intxradiusintyradius;说明 参数xy为椭圆中心坐标,startangle和endangle为给定的起始角和终止角,xradius与yradius为椭圆的x轴半径与y轴半径,如果startangle为0,endangle等于360度,那么画出的是个完整的椭圆ellipse函数不同于arc和circle函数,屏显纵横比不能自动调节若需要的是成比例的半径而不是特定的像素距离,则y轴距离必须调节为yradius*aspectratioy轴半径乘以纵横比 此函数对应的头文件为graphics.h返回值无例在屏幕上画一个鸡蛋形的椭圆#includegraphics.hvoidmainvoid{ intdriver=DETECTmode; initgraphdrivermode; ellipse20010003608040; getch; restorecrtmode;}
72.fillellipse画椭圆区函数功能函数fillellipse使用当前绘图色画一椭圆,然后用当前填充色图样和填充色填充所画的椭圆用法此函数调用方式为voidfillellipseintxintyintxradiusintyradius;说明参数xy为椭圆中心坐标,xradiusyradius为水平轴半径和垂直轴半径 这个函数对应的头文件为graphics.h返回值无例画一填充椭圆#includegraphics.h#includestdio.h#defineR60voidmainvoid{ intdriver=DETECTmode; intxaspyasp; initgraphdrivermode; setbkcolorYELLOW; setfillstyle1GREEN; fillellipsegetmaxx/2getmaxy/26644; getaspectratioxaspyasp; fillellipseRRRR*longxasp/longyasp; getch; closegraph;}
73.pieslice画扇区函数功能函数pieslice使用当前绘图色画一圆弧,并把弧两端与圆心分别连一直线段即半径,然后用当前填图样和填充色进行填充,即得扇区用法这个函数调用方式为voidpiesliceintxintyintstartangleintendangleintradius;说明函数pieslice的操作类似于arc函数即同调用参数一样,只是函数名不同,因此调用此函数的详细说明参见函数arc的相应内容该函数对屏显纵横比能自动调节进行补偿 pieslice函数对应的头文件为graphics.h返回值无例显示一个扇形图,每45度为一个不同的扇区#includegraphics.hvoidmainvoid{ intdriver=DETECTmode; intistartend; initgraphdrivermode; start=0; end=45; fori=0;i8;i++ { setfillstyleSOLID_FILLi; pieslice260200startend100; start+=45; end+=45; } getch; restorecrtmode;}。