手机版

C语言中的画图函数

发布时间:2024-11-18   来源:未知    
字号:

全面总结了c语言中用到的画图函数,功能相当强大

C语言中的画图函数

基本图形函数包括画点,线以及其它一些基本图形的函数。本节对这些函数作一全面的介绍。

1、画点

I. 画点函数 void far putpixel(int x, int y, int color);

该函数表示有指定的象元画一个按color 所确定颜色的点。对于颜色color的值可从表3中获得而对x, y是指图形象元的坐标。

在图形模式下,是按象元来定义坐标的。对VGA适配器,它的最高分辨率为640x480,其中640为整个屏幕从左到右所有象元的个数,480为整个屏幕从上到下所有象元的个数。屏幕的左上角坐标为(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); 返回游标有y轴的位置。

void far moveto(int x, int y); 移动游标到(x, y)点,不是画点,在移动过程中亦画点。

void far moverel(int dx, int dy); 移动游标从现行位置(x, y)移动到(x+dx, y+dy)的位置,移动过程中不画点。

2、画线

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); 画一作从现行游标到点(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 度,逆时针方向旋转一周, 依次为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)为左上角,

全面总结了c语言中用到的画图函数,功能相当强大

(x2, y2)为右下角画一个矩形框。

void far drawpoly(int numpoints, int far *polypoints); 画一个顶点数为numpoints,各顶点坐标由polypoints给出的多边形。polypoints整型数组必须至少有2 倍顶点数个无素。每一个顶点的坐标都定义为x,y,并且x在前。值得注意的是当画一个封闭的多边形时,numpoints 的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。

下面举一个用drawpoly()函数画箭头的例子。

#include<stdlib.h>

#include<graphics.h>

int main()

{

int gdriver, gmode, i;

int arw[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();

return 0;

}

II、设定线型函数

在没有对线的特性进行设定之前,TURBO C 用其默认值,即一点宽的实线,但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 用户定义线

━━━━━━━━━━━━━━━━━━━━━━━━━

全面总结了c语言中用到的画图函数,功能相当强大

thickness是线的宽度,见下表。

有关线宽(thickness)

━━━━━━━━━━━━━━━━━━━━━━━━━

符号常数 数值 含义

─────────────────────────

NORM_WIDTH 1 一点宽

THIC_WIDTH 3 三点宽

━━━━━━━━━━━━━━━━━━━━━━━━━

对于upattern,只有linestyle选USERBIT_LINE 时才有意义 (选其它线型,uppattern取0即可)。此时uppattern的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。

void far getlinesettings(struct linesettingstypefar *lineinfo);该函数将有关线的信息存放到由lineinfo 指向的结构中,表中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)操作, 实际上画出的线是原有线与现在规定的线进行异或后的结果。因此,当线的特性不变,进行两次画线操作相当于没有画线。

有关线型设定和画线函数的例子如下所示。

#include<stdlib.h>

#include<graphics.h>

int main()

{

int gdriver, 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);

全面总结了c语言中用到的画图函数,功能相当强大

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 *pathtodriver);

头文件:graphics.h

程序例:

#include "graphics.h"

#include "stdio.h"

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 */

{

printf("Graphics error: %s\n", grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();

exit(1); /* return with error code */

}

/* draw a line */

line(0, 0, getmaxx(), getmaxy());

全面总结了c语言中用到的画图函数,功能相当强大

/* clean up */

getch();

closegraph();

return 0;

}

绘图程序例

下面的程序可以绘出如下三个图形:

源程序如下:

#include<stdio.h>

#include<graphics.h>

#include<math.h>

#define P1 180

int graphdriver,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:(1.0----10000.0)\n");

// 输入贝壳图半径

sanf("%f",&rr);

printf("Enter snail radius:(1.0----10000.0)\n");

// 输入蜗牛图半径

scanf("%f",&rs);

printf("Enter ammonite radius even:(2----6)\n");

// 输入菊石图半径

scanf("%f",&n);

roundshell(); // 调用函数绘出贝売图

snail(); // 调用函数绘出蜗牛图

ammonite(); // 调用函数绘出菊石图

getch(); // 使图形停留在屏幕上

closegraph(); // 切换回到文本模式

}

全面总结了c语言中用到的画图函数,功能相当强大

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,

minx,maxx,miny,maxy,sx0,sy0,sxr,syr;

the=2*Pi/60; // 角度增量

maxx=rr*cos(the*0.017453); // 赋初值

maxy=rr*sin(the*0.017453); // 赋初值

minx=rr*cos(the*0.017453); // 赋初值

miny=rr*sin(the*0.017453); // 赋初值

for(i=0;i<=59;++i)

{

the=2*Pi*i/60;

x=rr*cos(the*0.017453);

y=rr*sin(the*0.017453);

if(x<minx)minx=x; // 求出最小x值

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

if(y<miny)miny=y; // 求出最小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*0.017453);

y=rr*sin(the*0.017453);

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)

全面总结了c语言中用到的画图函数,功能相当强大

theta=2*Pi*i/60;

x=rr*cos((2*Pi-theta)*0.017453); // 用户坐标下,贝壳上一系列半圆圆心x坐标 y=rr*sin((2*Pi-theta)*0.017453); // 用户坐标下,贝壳上一系列半圆圆心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,ArcInfo.xstart,ArcInfo.yend); // 由半圆圆心到半圆弧起点画一线段 line(sx,sy,ArcInfo.xend,ArcInfo.yend); // 由半圆圆心到半圆弧终点画一线段 }

}

void snail() // 画蜗牛图

{

int i,wx1,wx2,wy1,wy2,theta,sx,sy;

struct arccoordstype ArcInfo;

float x1,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)*0.017453); // 赋初值

maxy=rs*sin((theta+Pi)*0.017453); // 赋初值

minx=rs*cos((theta+Pi)*0.017453); // 赋初值

miny=rs*sin((theta+Pi)*0.017453); // 赋初值

for(i=0;i<=49;++i)

{

theta=2*Pi*i/60;

x=rs*cos((theta+Pi)*0.017453);

y=rs*sin((theta+Pi)*0.017453);

rs=rs*1.012;

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

if(y>maxy) maxy=y; // 求窗口y方向最大值

if(x<minx) minx=x; // 求窗口x方向最小值

if(y<miny) miny=y; // 求窗口y方向最小值

}

x1=minx; // 窗口左边界赋值

x2=maxx; // 窗口右边界赋值

y1=miny; // 窗口下边界赋值

y2=maxy; // 窗口上边界赋值

wx1=280; // 取定视口左边界

wx2=330; // 取定视口右边界

wy1=195; // 取定视口下边界

wy2=245; // 取定视口上边界

全面总结了c语言中用到的画图函数,功能相当强大

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)*0.017453);

y=rs*sin((Pi-theta)*0.017453);

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,ArcInfo.xstart,ArcInfo.ystart);

line(sx.sy,ArcInfo.xend,ArcInfo.yend);

rs=rs*1.012; // 这里使半圆半径不断增大

}

}

void ammonite() // 画菊石图

{

int xasp,yasp;

int i,wx1,wx2,wy1,wy2,theta,sx,sy;

struct arccoordstype ArxInfo;

// 这个结构类型在头文件graphics.h中可以查到

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(0.02*50);

minx=l*cos(0.2*50); // 赋初值

miny=l*sin(0.0*50); // 赋初值

maxx=l*cos(0.2*50); // 赋初值

maxy=l*sin(0.2*50); // 赋初值

for(i=50;i<=254;++i)

全面总结了c语言中用到的画图函数,功能相当强大

{

l=exp(0.02*i)

x=l*cos(0.2*i);

y=l*sin(0.2*i);

if(x<minx) mix=x; // 求窗口x方向最小值 if(x>maxx) maxx=x; // 求窗口x方向最大值 if(y<miny) miny=y; // 求窗口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(0.02*i);

x=l*cos(6.2831852-0.2*i); // 用户坐标下圆心x坐标 y=l*sin(6.2831852-0.2*i); // 用户坐标下圆心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); // 画填充圆

}

}

C语言中的画图函数.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
    ×
    二维码
    × 游客快捷下载通道(下载后可以自由复制和排版)
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
    × 常见问题(客服时间:周一到周五 9:30-18:00)