C语言中的画图函数终审稿.docx

上传人:b****8 文档编号:9360633 上传时间:2023-02-04 格式:DOCX 页数:15 大小:19.27KB
下载 相关 举报
C语言中的画图函数终审稿.docx_第1页
第1页 / 共15页
C语言中的画图函数终审稿.docx_第2页
第2页 / 共15页
C语言中的画图函数终审稿.docx_第3页
第3页 / 共15页
C语言中的画图函数终审稿.docx_第4页
第4页 / 共15页
C语言中的画图函数终审稿.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

C语言中的画图函数终审稿.docx

《C语言中的画图函数终审稿.docx》由会员分享,可在线阅读,更多相关《C语言中的画图函数终审稿.docx(15页珍藏版)》请在冰豆网上搜索。

C语言中的画图函数终审稿.docx

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(x

if(x>maxx)maxx=x;//求出最大x值

if(y

if(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(x

if(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(x

if(x>maxx)maxx=x;//求窗口x方向最大值

if(y

if(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);//画填充圆

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1