bokee.net

科研管理博客

正文 更多文章

用C语言画立体五角星

立 体 五 角 星
设计思路:
1、通过给定的圆半径,计算出圆上平均分布的五个顶点的坐标,再计算出相应小圆的半径及旋转36度后小圆上平均分布的五个点的坐标。用线将各对应点连接起来形成五角星。
2、通过循环画间断弧线形成动态的光芒效果。
3、本例应用到数组及数学中的正弦和余弦函数。
图例:
 
 
公式:x=x0+r*cos(a);
y=y0-r*sin(a);
a为从起点到该点的旋转角度。
由于C语言中sin、cos等函数中的参数是依弧度计算的,因此需要进行度数转换。一般先用#define PI 3.1415926这样的宏定义定义PI。2*PI为一个圆周,2*PI/360为角度1度的值,简化为PI/180。比如需要计算30度的正弦值,按下式:
sin(30*PI/180);
五角星内接的小圆半径的求法: 
  
数学公式:yc=r×sin(18°); 或yc=r×cos(72°);
        r0=yc÷cos(36°)
 
转成C语言语句:
          yc=r*sin(18*PI/180);
          r0=yc/cos(36*PI/180);
或直接写成:r0=r*sin(18*PI/180)/cos(36*PI/180);
 
 
例:
#include<graphics.h>
#include<math.h>         /* 插入数学头文件 */
#define PI 3.1415926     /* 宏定义 PI */
float th=PI/180;         /*定义全局变量 th */
main()
{
 int gd=DETECT,gm,i,j;
 initgraph(&gd,&gm,"");
 setbkcolor(BLUE);
 star(320,240,120);   /*调用自定义函数star()。*/
 while(!kbhit())       /*下面循环体是绘制光芒部分,可以不要 */
 {
 setcolor(YELLOW);
 for(j=0;j<20;j++)
 {
    for(i=0;i<120;i++)
    ellipse(320,240,i*3,1+i*3,125+j*20,125+j*10);
    delay(5000);
 }
 setcolor(BLACK);
 for(j=0;j<20;j++)
    {
    for(i=0;i<120;i++)
    ellipse(320,240,i*3,1+i*3,125+j*20,125+j*10);
    delay(5000);
    }
 }
 getch();
 closegraph();
}
 
 star(int x,int y,int r)
 {
     int r0=r*sin(18*th)/cos(36*th); /*计算小圆半径r0 */
     int i,color;
     int x1[6],y1[6],x2[6],y2[6];
     for(i=0;i<6;i++)
     {
     x1[i]=x+r*cos((90+i*72)*th); /* 计算出大圆上的五个平均分布点的坐标*/
     y1[i]=y-r*sin((90+i*72)*th);
     x2[i]=x+r0*cos((54+i*72)*th); /* 计算出小圆上的五个平均分布点的坐标*/
     y2[i]=y-r0*sin((54+i*72)*th);
     }
     setcolor(RED);
     for(i=0;i<5;i++)           /* 将相应的点用线连接起来。*/
     {
     line(x,y,x1[i],y1[i]);
     line(x,y,x2[i],y2[i]);
     line(x1[i],y1[i],x2[i],y2[i]);
     line(x1[i],y1[i],x2[i+1],y2[i+1]);
     }
     for(i=0;i<10;i++)         /* 分别填充相应部位,形成立体效果*/
     {
        setfillstyle(1,i%2?RED:LIGHTRED);
        floodfill(x+10*cos(i*36*th),y-10*sin(i*36*th),RED);
     }
 }
 
分享到:

上一篇:趣 说 八 卦

下一篇:高效的洗牌、发牌程序

评论 (0条) 发表评论

抢沙发,第一个发表评论
验证码