绘图程序例
下面的程序可以绘出如下三个图形:
源程序如下: #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(); // 切换回到文本模式 }
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) { 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; // 取定视口上边界 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) { 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,20
0,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); // 画填充圆 } }
// P122
视频教程列表
文章教程搜索
C语言程序设计推荐教程
C语言程序设计热门教程
|