论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

绘图程序例

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:43:11

绘图程序例

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


源程序如下:
#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语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058