1、C语言中的画图函数终审稿 公司内部档案编码:OPPTR-OPPT28-OPPTL98-OPPNN08C语言中的画图函数C语言中的画图函数基本图形函数包括画点,线以及其它一些基本图形的函数。本节对这些函数作一全面的介绍。、画点 . 画点函数 void far putpixel(int x, int y, int color);该函数表示有指定的象元画一个按color 所确定颜色的点。对于颜色color的值可从表3中获得而对x, y是指图形象元的坐标。 在图形模式下,是按象元来定义坐标的。对VGA适配器,它的最高分辨率为640x480,其中640为整个屏幕从左到右所有象元的个数,480为整个屏幕从
2、上到下所有象元的个数。屏幕的左上角坐标为(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); 返回游
3、标有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 far lineto(int x, int y); 画一作从现行游标到点(
4、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结束(用度表示)画一段圆弧线。 在TURBO C中规定x轴正向为0 度,逆时针方向
5、旋转一周, 依次为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, inty2); 以(x1, y1)为左上角,(x2, y2)为右下
6、角画一个矩形框。void far drawpoly(int numpoints, int far *polypoints); 画一个顶点数为numpoints,各顶点坐标由polypoints给出的多边形。polypoints整型数组必须至少有2 倍顶点数个无素。每一个顶点的坐标都定义为x,y,并且x在前。值得注意的是当画一个封闭的多边形时,numpoints 的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。 下面举一个用drawpoly()函数画箭头的例子。 #include #include int main() int gdriver, gmod
7、e, 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:caicbgi); setbkcolor(BLUE); cleardevice(); setcolor(12); /*设置作图颜色*/ drawpoly(8, arw); /*画一箭头*/ getch(); closegraph(); return 0; II、设定线型函数 在没有对线的特性进行设定之前,TURBO C 用其默认值,即一点宽的实线,
8、但TURBO C 也提供了可以改变线型的函数。 线型包括:宽度和形状。其中宽度只有两种选择:一点宽和三点宽。而线的形状则有五种。 下面介绍有关线型的设置函数。 void far setlinestyle(int linestyle,unsigned upattern,int thickness); 该函数用来设置线的有关信息,其中linestyle是线形状的规定,见下表。 有关线的形状(linestyle) 符号常数 数值 含义 SOLID_LINE 0 实线 DOTTED_LINE 1 点线 CENTER_LINE 2 中心线 DASHED_LINE 3 点画线 USERBIT_LINE 4
9、 用户定义线 thickness是线的宽度,见下表。 有关线宽(thickness) 符号常数 数值 含义 NORM_WIDTH 1 一点宽 THIC_WIDTH 3 三点宽 ? 对于upattern,只有linestyle选USERBIT_LINE 时才有意义 (选其它线型,uppattern取0即可)。此时uppattern的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。void far getlinesettings(struct linesettingstypefar *lineinfo);该函数将有关线的信息存放到由lineinfo 指向的结构中,表
10、中linesettingstype的结构如下: struct linesettingstype int linestyle; unsigned upattern; int thickness; 例如下面两句程序可以读出当前线的特性?struct linesettingstype *info; getlinesettings(info); void far setwritemode(int mode);该函数规定画线的方式。如果mode=0,则表示画线时将所画位置的原来信息覆盖了(这是TURBO C的默认方式)。如果mode=1, 则表示画线时用现在特性的线与所画之处原有的线进行异或(XOR)操
11、作, 实际上画出的线是原有线与现在规定的线进行异或后的结果。因此,当线的特性不变,进行两次画线操作相当于没有画线。 有关线型设定和画线函数的例子如下所示。 #include #include int main() int gdriver, gmode, i; gdriver=DETECT; initgraph(&gdriver, &gmode, c:caicbgi); setbkcolor(BLUE); cleardevice(); setcolor(GREEN); circle(320, 240, 98); setlinestyle(0, 0, 3); /*设置三点宽实线*/ setcolo
12、r(2); rectangle(220, 140, 420, 340); setcolor(WHITE); setlinestyle(4, 0xaaaa, 1); /*设置一点宽用户定义线*/ line(220, 240, 420, 240); line(320, 140, 320, 340); getch(); closegraph(); return 0; initgraph函数名: initgraph() 功 能: 初始化图形系统 函数原型: void far initgraph(int far *graphdriver, int far *graphmode, char far *pa
13、thtodriver);头文件: 程序例: #include #include int main(void) /* request auto detection */ int gdriver = DETECT, gmode, errorcode; /* initialize graphics mode */ initgraph(&gdriver, &gmode, ); /* read result of initialization */ errorcode = graphresult(); if (errorcode != grOk) /* an error occurred */ prin
14、tf(Graphics error: %sn, grapherrormsg(errorcode); printf(Press any key to halt:); getch(); exit(1); /* return with error code */ /* draw a line */ line(0, 0, getmaxx(), getmaxy(); /* clean up */ getch(); closegraph(); return 0; 绘图程序例下面的程序可以绘出如下三个图形:源程序如下:#include#include#include#define P1 180int gra
15、phdriver,graphmode;float rr,rs,n;void main() void snail(); void roundshell(); void ammonite(); clrscr(); gotoxy(1,6); printf(Plot your article graph. n); printf(=n); gotoxy(1,9); printf(Enter roundshell radius:); / 输入贝壳图半径 sanf(%f,&rr); printf(Enter snail radius:); / 输入蜗牛图半径 scanf(%f,&rs); printf(En
16、ter ammonite radius even:(2-6)n); / 输入菊石图半径 scanf(%f,&n); roundshell(); / 调用函数绘出贝売图 snail();/ 调用函数绘出蜗牛图 ammonite(); / 调用函数绘出菊石图 getch(); / 使图形停留在屏幕上 closegraph(); / 切换回到文本模式void roundshell() / 画贝壳图 int i,wx1,wx2,wy1,wy2,sx,sy; struct arccoordstype ArcInfo; float x1,x2,y1,y2,x,y,k1,k2,the,theta,r, mi
17、nx,maxx,miny,maxy,sx0,sy0,sxr,syr; the=2*Pi/60; / 角度增量 maxx=rr*cos(the*; / 赋初值 maxy=rr*sin(the*; / 赋初值 minx=rr*cos(the*; / 赋初值 miny=rr*sin(the*; / 赋初值 for(i=0;i=59;+i) the=2*Pi*i/60; x=rr*cos(the*; y=rr*sin(the*; if(xmaxx)maxx=x; / 求出最大x值 if(ymaxy)maxy=y; / 求出最大y值 x1=minx; / 窗口的左边界 x2=maxx; / 窗口的右边界
18、 y1=miny; / 窗口的下边界y2=maxy; / 窗口的上边界 wx1=56; / 视口的左边界 wx2=146; / 视口的右边界 wy1=56; / 视口的下边界 wy2=146;/ 视口的上边界 k1=(wx2-wx1)/(x2-x1); / 窗口到视口变换x方向的比例系数 k2=(wy2-wy1)/(y2-y1); / 窗口到视口变换y方向的比例系数 x=rr*cos(the*; y=rr*sin(the*; sxr=wx1+(x-x1)*k1; syr=wy1+(y-y1)*k2; sx0=wx1+(0-x1)*k1; sy0=wy1+(0-y1)*k2; r=sqrt(sx
19、r-sx0)*(sxr-sx0)+(syr-sy0)*(syr-sy0) / 求画圆弧的半径 graphdriver=DETECT; initgraph(&graphdriver,&graphmode,bcbgi); setcolor(WHITE); rectangle(1,1,240,200); for(i=0;i=59;+i) theta=2*Pi*i/60; x=rr*cos(2*Pi-theta)*; / 用户坐标下,贝壳上一系列半圆圆心x坐标 y=rr*sin(2*Pi-theta)*; / 用户坐标下,贝壳上一系列半圆圆心y坐标 sx=wx1+(x-x1)*k1; / 转换成屏幕上
20、相应的半圆圆心x坐标 sy=wy1+(y-y1)*k2; / 转换成屏幕上相应的半圆圆心y坐标 setcolor(WHITE); arc(sx,sy,theta,theta+Pi,r); / 画出半圆 getarccoords(&ArcInfo); / 获取所画半圆端点的信息 line(sx,sy,; / 由半圆圆心到半圆弧起点画一线段 line(sx,sy,;/ 由半圆圆心到半圆弧终点画一线段 void snail() / 画蜗牛图 int i,wx1,wx2,wy1,wy2,theta,sx,sy; struct arccoordstype ArcInfo; float x1,x2,y1,
21、y2,x,y,k1,k2,sxr,syr, minx,maxx,miny,maxy,sx0,sy0,r; theta=2*Pi/60; maxx=rs*cos(theta+Pi)*; / 赋初值 maxy=rs*sin(theta+Pi)*; / 赋初值 minx=rs*cos(theta+Pi)*; / 赋初值 miny=rs*sin(theta+Pi)*; / 赋初值 for(i=0;imaxx) maxx=x; / 求窗口x方向最大值 if(ymaxy) maxy=y; / 求窗口y方向最大值 if(xminx) minx=x; / 求窗口x方向最小值 if(yminy) miny=y;
22、 / 求窗口y方向最小值 x1=minx; / 窗口左边界赋值 x2=maxx; / 窗口右边界赋值 y1=miny; / 窗口下边界赋值 y2=maxy; / 窗口上边界赋值 wx1=280; / 取定视口左边界 wx2=330; / 取定视口右边界 wy1=195; / 取定视口下边界 wy2=245; / 取定视口上边界 k1=(wx2-wx1)/(x2-x1); / 窗口到视口变换x方向的比例系数 k2=(wy2-wy1)/(y2-y1); / 窗口到视口变换y的比例系数 sx0=wx1+(0-x1)*k1; sy0=wy1+(0-y1)*k2; setcolor(WHITE); se
23、tfillstyle(0,0); bar3d(200,100,455,300,0,0); / 下面语句的注释见画贝壳函数roundshell()中相应的说明 theta=2*Pi*i/60; x=rs*cos(Pi-theta)*; y=rs*sin(Pi-theta)*; sxr=wx1+(x-x1)*k1; syr=wy1+(y-u1)*k2; sx=wx1+(x-x1)*k1; sy=wy1+(y-y1)*k2; setcolor(WHITE); r=sqrt(sxr-sx0)*(sxr-sx0)+(syr-sy0)*(syr-sy0); arc(sx,sy,theta,theta+Pi
24、,r); getarccoords(&ArcInfo); line(sx,sy,; line,; rs=rs*; / 这里使半圆半径不断增大 void ammonite() / 画菊石图 int xasp,yasp; int i,wx1,wx2,wy1,wy2,theta,sx,sy; struct arccoordstype ArxInfo; / 这个结构类型在头文件中可以查到 float x1,x2,y1,y2,x,y,minx,maxx,sry,l,r,miny,maxy,k1,k2,aspr,sx0,sy0,sxr; getaspectratio(&xasp,&yasp); l=exp
25、*50); minx=l*cos*50); / 赋初值 miny=l*sin*50); / 赋初值 maxx=l*cos*50); / 赋初值 maxy=l*sin*50); / 赋初值 for(i=50;i=254;+i) l=exp*i) x=l*cos*i); y=l*sin*i); if(xmaxx) maxx=x;/ 求窗口x方向最大值 if(ymaxy) maxy=y;/ 求窗口y方向最大值 x1=minx; / 窗口左边界赋值 x2=maxx; / 窗口右边界赋值 y1=miny; / 窗口下边界赋值 y2=maxy; /窗口上边界赋值 wx1=460; / 取定视口左边界 wx
26、2=590; / 取定视口右边界 wy1=260; / 取定视口下边界 wy2=390; / 取定视口上边界 k1=(wx2-wx1)/(x2-x1);/ 变换比例 k2=(wy2-wy1)/(y2-y1);/ 变换比例 sx0=wx1+(0-x1)*k1; sy0=wy1+(0-y1)*k2; setcolor(WHITE); setfillstyle(0,0); bar3d(415,200,636,460,0,0); for(i=50;i=254;+i) l=exp*i); x=l*cos / 用户坐标下圆心x坐标 y=l*sin / 用户坐标下圆心y坐标 sxr=wx1+(x-x1)*k1; syr=wy1+(y-y1)*k2; sx=wx1+(x-x1)*k1; / 屏幕坐标下圆心x坐标 sy=wy1+(y-y1)*k2; / 屏幕坐标下圆心y坐标 r=sqrt(sxr-sx0)*(sxr-sx0)+(syr-sy0)*(syr-sy0); r=r/n; / 画圆的半径 setcolor(WHITE); setfillstyle(0,0); / 设置填充图样 fillellipse(sx,sy,r,r*aspr); / 画填充圆
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1