C语言中的画图函数终审稿.docx
《C语言中的画图函数终审稿.docx》由会员分享,可在线阅读,更多相关《C语言中的画图函数终审稿.docx(15页珍藏版)》请在冰豆网上搜索。
![C语言中的画图函数终审稿.docx](https://file1.bdocx.com/fileroot1/2023-2/3/2d27e3e3-b444-4fda-aa6b-bebf8adc6469/2d27e3e3-b444-4fda-aa6b-bebf8adc64691.gif)
C语言中的画图函数终审稿
公司内部档案编码:
[OPPTR-OPPT28-OPPTL98-OPPNN08]
C语言中的画图函数
C语言中的画图函数
基本图形函数包括画点,线以及其它一些基本图形的函数。
本节对这些函数作一全面的介绍。
1、画点
I.画点函数voidfarputpixel(intx,inty,intcolor);
该函数表示有指定的象元画一个按color所确定颜色的点。
对于颜色color的值可从表3中获得而对x,y是指图形象元的坐标。
在图形模式下,是按象元来定义坐标的。
对VGA适配器,它的最高分辨率为640x480,其中640为整个屏幕从左到右所有象元的个数,480为整个屏幕从上到下所有象元的个数。
屏幕的左上角坐标为(0,0),右下角坐标为(639,479),水平方向从左到右为x轴正向,垂直方向从上到下为y轴正向。
TURBOC的图形函数都是相对于图形屏幕坐标,即象元来说的。
关于点的另外一个函数是:
intfargetpixel(intx,inty);它获得当前点(x,y)的颜色值。
II、有关坐标位置的函数?
intfargetmaxx(void);返回x轴的最大值。
intfargetmaxy(void);返回y轴的最大值。
intfargetx(void);返回游标在x轴的位置。
voidfargety(void);返回游标有y轴的位置。
voidfarmoveto(intx,inty);移动游标到(x,y)点,不是画点,在移动过程中亦画点。
voidfarmoverel(intdx,intdy);移动游标从现行位置(x,y)移动到(x+dx,y+dy)的位置,移动过程中不画点。
2、画线
I.画线函数
TURBOC提供了一系列画线函数,下面分别叙述:
voidfarline(intx0,inty0,intx1,inty1);画一条从点(x0,y0)到(x1,y1)的直线。
voidfarlineto(intx,inty);画一作从现行游标到点(x,y)的直线。
voidfarlinerel(intdx,intdy);画一条从现行游标(x,y)到按相对增量确定的点(x+dx,y+dy)的直线。
voidfarcircle(intx,inty,intradius);以(x,y)为圆心,radius为半径,画一个圆。
voidfararc(intx,inty,intstangle,intendangle,intradius);以(x,y)为圆心,radius为半径,从stangle开始到endangle结束(用度表示)画一段圆弧线。
在TURBOC中规定x轴正向为0度,逆时针方向旋转一周,依次为90,180,270和360度(其它有关函数也按此规定,不再重述)。
voidellipse(intx,inty,intstangle,intendangle,intxradius,intyradius);以(x,y)为中心,xradius,yradius为x轴和y轴半径,从角stangle开始到endangle结束画一段椭圆线,当stangle=0,endangle=360时,画出一个完整的椭圆。
voidfarrectangle(intx1,inty1,intx2,inty2);以(x1,y1)为左上角,(x2,y2)为右下角画一个矩形框。
voidfardrawpoly(intnumpoints,intfar*polypoints);画一个顶点数为numpoints,各顶点坐标由polypoints给出的多边形。
polypoints整型数组必须至少有2倍顶点数个无素。
每一个顶点的坐标都定义为x,y,并且x在前。
值得注意的是当画一个封闭的多边形时,numpoints的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。
下面举一个用drawpoly()函数画箭头的例子。
#include<>
#include<>
intmain()
{
intgdriver,gmode,i;
intarw[16]={200,102,300,102,300,107,330,
100,300,93,300,98,200,98,200,102};
gdriver=DETECT;
initgraph(&gdriver,&gmode,"c:
\\caic\\bgi");
setbkcolor(BLUE);
cleardevice();
setcolor(12);/*设置作图颜色*/
drawpoly(8,arw);/*画一箭头*/
getch();
closegraph();
return0;
}
II、设定线型函数
在没有对线的特性进行设定之前,TURBOC用其默认值,即一点宽的实线,但TURBOC也提供了可以改变线型的函数。
线型包括:
宽度和形状。
其中宽度只有两种选择:
一点宽和三点宽。
而线的形状则有五种。
下面介绍有关线型的设置函数。
voidfarsetlinestyle(intlinestyle,unsignedupattern,intthickness);该函数用来设置线的有关信息,其中linestyle是线形状的规定,见下表。
有关线的形状(linestyle)
━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数数值含义
─────────────────────────
SOLID_LINE0实线
DOTTED_LINE1点线
CENTER_LINE2中心线
DASHED_LINE3点画线
USERBIT_LINE4用户定义线
━━━━━━━━━━━━━━━━━━━━━━━━━
thickness是线的宽度,见下表。
有关线宽(thickness)
━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数数值含义
─────────────────────────
NORM_WIDTH1一点宽
THIC_WIDTH3三点宽
━━━━━━━━━━━━━━━━━━━━━━━━━?
对于upattern,只有linestyle选USERBIT_LINE时才有意义(选其它线型,uppattern取0即可)。
此时uppattern的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。
voidfargetlinesettings(structlinesettingstypefar*lineinfo);该函数将有关线的信息存放到由lineinfo指向的结构中,表中linesettingstype的结构如下:
structlinesettingstype{
intlinestyle;
unsignedupattern;
intthickness;
}
例如下面两句程序可以读出当前线的特性?
structlinesettingstype*info;
getlinesettings(info);
voidfarsetwritemode(intmode);该函数规定画线的方式。
如果mode=0,则表示画线时将所画位置的原来信息覆盖了(这是TURBOC的默认方式)。
如果mode=1,则表示画线时用现在特性的线与所画之处原有的线进行异或(XOR)操作,实际上画出的线是原有线与现在规定的线进行异或后的结果。
因此,当线的特性不变,进行两次画线操作相当于没有画线。
有关线型设定和画线函数的例子如下所示。
#include<>
#include<>
intmain()
{
intgdriver,gmode,i;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"c:
\\caic\\bgi");
setbkcolor(BLUE);
cleardevice();
setcolor(GREEN);
circle(320,240,98);
setlinestyle(0,0,3);/*设置三点宽实线*/
setcolor
(2);
rectangle(220,140,420,340);
setcolor(WHITE);
setlinestyle(4,0xaaaa,1);
/*设置一点宽用户定义线*/
line(220,240,420,240);
line(320,140,320,340);
getch();
closegraph();
return0;
}
initgraph
函数名:
initgraph()
功能:
初始化图形系统
函数原型:
voidfarinitgraph(intfar*graphdriver,intfar*graphmode,
charfar*pathtodriver);
头文件:
程序例:
#include""
#include""
intmain(void)
{
/*requestautodetection*/
intgdriver=DETECT,gmode,errorcode;
/*initializegraphicsmode*/
initgraph(&gdriver,&gmode,"");
/*readresultofinitialization*/
errorcode=graphresult();
if(errorcode!
=grOk)/*anerroroccurred*/
{
printf("Graphicserror:
%s\n",grapherrormsg(errorcode));
printf("Pressanykeytohalt:
");
getch();
exit
(1);/*returnwitherrorcode*/
}
/*drawaline*/
line(0,0,getmaxx(),getmaxy());
/*cleanup*/
getch();
closegraph();
return0;
}
绘图程序例
下面的程序可以绘出如下三个图形:
源程序如下:
#include<>
#include<>
#include<>
#defineP1180
intgraphdriver,graphmode;
floatrr,rs,n;
voidmain()
{
voidsnail();
voidroundshell();
voidammonite();
clrscr();
gotoxy(1,6);
printf("Plotyourarticlegraph.\n");
printf("=======================================================\n");
gotoxy(1,9);
printf("Enterroundshellradius:
");
//输入贝壳图半径
sanf("%f",&rr);
printf("Entersnailradius:
");
//输入蜗牛图半径
scanf("%f",&rs);
printf("Enterammoniteradiuseven:
(2----6)\n");
//输入菊石图半径
scanf("%f",&n);
roundshell();//调用函数绘出贝売图
snail();//调用函数绘出蜗牛图
ammonite();//调用函数绘出菊石图
getch();//使图形停留在屏幕上
closegraph();//切换回到文本模式
}
voidroundshell()
//画贝壳图
{
inti,wx1,wx2,wy1,wy2,sx,sy;
structarccoordstypeArcInfo;
floatx1,x2,y1,y2,x,y,k1,k2,the,theta,r,
minx,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(xif(x>maxx)maxx=x;//求出最大x值
if(yif(y>maxy)maxy=y;//求出最大y值
}
x1=minx;//窗口的左边界
x2=maxx;//窗口的右边界
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((sxr-sx0)*(sxr-sx0)+(syr-sy0)*(syr-sy0))//求画圆弧的半径
graphdriver=DETECT;
initgraph(&graphdriver,&graphmode,"\\bc\\bgi");
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;//转换成屏幕上相应的半圆圆心x坐标
sy=wy1+(y-y1)*k2;//转换成屏幕上相应的半圆圆心y坐标
setcolor(WHITE);
arc(sx,sy,theta,theta+Pi,r);//画出半圆
getarccoords(&ArcInfo);//获取所画半圆端点的信息
line(sx,sy,,;
//由半圆圆心到半圆弧起点画一线段
line(sx,sy,,;
//由半圆圆心到半圆弧终点画一线段
}
}
voidsnail()
//画蜗牛图
{
inti,wx1,wx2,wy1,wy2,theta,sx,sy;
structarccoordstypeArcInfo;
floatx1,x2,y1,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;i<=49;++i)
{
theta=2*Pi*i/60;
x=rs*cos((theta+Pi)*;
y=rs*sin((theta+Pi)*;
rs=rs*;
if(x>maxx)maxx=x;//求窗口x方向最大值
if(y>maxy)maxy=y;//求窗口y方向最大值
if(xif(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);
setfillstyle(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,r);
getarccoords(&ArcInfo);
line(sx,sy,,;
line,,;
rs=rs*;
//这里使半圆半径不断增大
}
}
voidammonite()
//画菊石图
{
intxasp,yasp;
inti,wx1,wx2,wy1,wy2,theta,sx,sy;
structarccoordstypeArxInfo;
//这个结构类型在头文件中可以查到
floatx1,x2,y1,y2,x,y,minx,maxx,sry,l,r,miny,maxy,k1,k2,aspr,sx0,sy0,sxr;
getaspectratio(&xasp,&yasp);
l=exp*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(xif(x>maxx)maxx=x;//求窗口x方向最大值
if(yif(y>maxy)maxy=y;//求窗口y方向最大值
}
x1=minx;//窗口左边界赋值
x2=maxx;//窗口右边界赋值
y1=miny;//窗口下边界赋值
y2=maxy;//窗口上边界赋值
wx1=460;//取定视口左边界
wx2=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);//画填充圆
}
}