·天新网首页·加入收藏·设为首页·网站导航
数码笔记本手机摄像机相机MP3MP4GPS
硬件台式机网络服务器主板CPU硬盘显卡
办公投影打印传真
家电电视影院空调
游戏网游单机动漫
汽车新车购车试驾
下载驱动源码
学院开发域名
考试公务员高考考研
业界互联网通信探索
您现在的位置:天新网 > 软件开发 > 开发语言 > C/C++
绘图程序例
http://www.Q.cc 2005年05月12日
绘图程序例

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

绘图程序例


源程序如下:
#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,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);   // 画填充圆
   }
}


// P122

上一篇: 高斯列主无消去法解线性方程组
下一篇: 十全十美游戏原程序

关于我们 | 联系我们 | 加入我们 | 广告服务 | 投诉意见 | 网站导航
Copyright © 2000-2009 www.Q.cc, All Rights Reserved.
晨新科技 版权所有 Created by TXSite.net