七夕情人节

转载请标明地址:http://www.cnblogs.com/wangmengmeng/

效果图:

 

源代码:

自己调试了老半天......orz

  1 #include <graphics.h>
  2 #include <conio.h>
  3 #include <math.h>
  4 
  5 //定义全局变量
  6 int rosesize=500;
  7 int h=-250;
  8 
  9 //定义结构体
 10 struct DOT
 11 {
 12     double x;
 13     double y;
 14     double z;
 15     double r;//hong
 16     double g;//liu
 17     //b  (蓝)  通过r计算
 18 };
 19 
 20 //计算点
 21 bool calc(double a,double b,double c,DOT &d)
 22 {
 23     double j,n,o,w,z;
 24 
 25     if(c>60){
 26         d.x=sin(a*7)*(13+5/(0.2+pow(b*4,4)))-sin(b)*50;
 27         d.y=b*rosesize+50;
 28         d.z=625+cos(a*7)*(13+5/(0.2+pow(b*4,4)))+b*400;
 29         d.r=a*1-b/2;
 30         d.g=a;
 31         return true;
 32     }//花柄
 33 
 34     double A=a*2-1;
 35     double B=b*2-1;
 36     if(A*A+B*B<1){
 37 
 38         if(c>37){
 39             j=(int(c)&1);
 40             n=j?6:4;
 41             o=0.5/(a+0.01)+cos(b*125)*3-a*300;
 42             w=b*h;
 43 
 44             d.x=o*cos(n)+w*sin(n)+j*610-390;
 45             d.y=o*sin(n)-w*cos(n)+550-j*350;
 46             d.z=1180+cos(B+A)*99-j*300;
 47             d.r=0.4-a*0.1+pow(1-B*B,-h*6)*0.15-a*b*0.4+cos(a+b)/5+pow(cos((o*(a+1)+(B>0?w:-w))/25),30)*0.1*(1-B*B);
 48             d.g=o/1000+0.7-o*w*0.000003;
 49             return true;
 50         }//
 51 
 52         if(c>32){
 53             c=c*1.16-0.15;
 54             o=a*45-20;
 55             w=b*b*h;
 56             z=o*sin(c)+w*cos(c)+620;
 57 
 58             d.x=o*cos(c)-w*sin(c);
 59             d.y=28+cos(B*0.5)*99-b*b*b*60-z/2-h;
 60             d.z = z;
 61             d.r=(b*b*0.3+pow((1-(A*A)),7)*0.15+0.3)*b;
 62             d.g=b*0.7;
 63             return true;
 64         }//花萼
 65 
 66         //flower
 67         o=A*(2-b)*(80-c*2);
 68         w=99-cos(A)*120-cos(b)*(-h-c*4.9)+cos(pow(1-b,7))*50+c*2;
 69         z=o*sin(c)+w*cos(c)+700;
 70 
 71         d.x=o*cos(c)-w*sin(c);
 72         d.y=B*99-cos(pow(b,7))*50-c/3-z/1.35+450;
 73         d.z=z;
 74         d.r=(1-b/1.2)*0.9+a*0.1;
 75         d.g=pow((1-b),20)/4+0.05;
 76         return true;
 77     }
 78     return false;
 79 }
 80 
 81 //主函数
 82 void main()
 83 {
 84     //定义变量
 85     short *zBuffer;
 86     int x,y,z,zBufferIndex;
 87     DOT dot;
 88 
 89     //初始化
 90     initgraph(640,480);
 91     setbkcolor(WHITE);
 92     cleardevice();
 93 
 94     //初始化 zbuffer
 95     zBuffer = new short[rosesize*rosesize];
 96     memset(zBuffer,0,sizeof(short)*rosesize*rosesize);
 97 
 98     for(int j=0;j<2000 && !_kbhit();j++){
 99         for(int i=0;i<10000;i++)//减少是否有按键的判断
100             if(calc(double(rand()) / RAND_MAX, double(rand()) / RAND_MAX, rand() % 46 / 0.74, dot)){
101                 z=int(dot.z+0.5);
102                 x=int(dot.x*rosesize/z-h+0.5);
103                 y=int(dot.y*rosesize/z-h+0.5);
104                 if (y >= rosesize) continue;
105 
106                 zBufferIndex=y*rosesize+x;
107 
108                 if(!zBuffer[zBufferIndex]||zBuffer[zBufferIndex]>z){
109                     zBuffer[zBufferIndex]=z;
110 
111                     //画点
112                     int r=~int ((dot.r*h));
113                     if(r<0)  r=0;
114                     if(r>255)  r=255;
115                     int g=~int ((dot.g*h));
116                     if(g<0)  g=0;
117                     if(g>255)  g=255;
118                     int b=~int ((dot.r*dot.r*-80));
119                     if(b<0)  b=0;
120                     if(b>255)  b=255;
121                     putpixel(x+50,y-20,RGB(r,g,b));
122                 }
123             }
124             Sleep(1);
125     }//按任意键退出
126     //退出
127     delete[]zBuffer;
128     _getch();
129     closegraph();
130 }

来自:C语言程序设计经典236例

原文地址:https://www.cnblogs.com/wangmengmeng/p/4716124.html