首页 | IT新闻 | 硬件 | 操作系统 | 开发 | 网络编程 | 数据库 | 热门框架 | 网络安全 | 组网 | 建站指南 | 网页制作 | 特效 | 实用技巧 | 服务器 | 办公 | QQ | 探索 | 社区

  • 技术部落
  • 部落首页 > 程序开发 > C/C#/C++ > 正文
  • VC++实现的一个小绘图程序
      2007-7-4  来源:网络资源  编辑:Jsbulo  热度:

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

      源程序如下:

    #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);   // 画填充圆
       }
    }