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

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