码迷,mamicode.com
首页 > 编程语言 > 详细

算法生成太极八卦图

时间:2014-10-29 14:28:34      阅读:482      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   ar   for   sp   strong   

      前面一篇文章是通过算法生成一幅太极图,有道是:无极生太极,太极生两仪,两仪生四象,四象生八卦.那么这一节就为太极生成一个八卦图.虽然我对易经这种玄之又玄的哲学没什么研究,但至少八卦可以看做是二进制的鼻祖.愿太极八卦保佑我们的程序绝无BUG,永不修改.

      根据二进制数的规定:有,用1表示;无,用0表示。我们可以得出八卦各卦阳爻和阴爻的二进制数。下面我们写出八卦各卦阳爻的二进制数(即有阳爻为1,无阳爻为0):

坤:黑黑黑,卦符阴阴阴,二进制数为000

艮:黑黑白,卦符阴阴阳,二进制数为001

坎:黑白黑,卦符阴阳阴,二进制数为010

巽:黑黑白,卦符阴阳阳,二进制数为011

震:白黑黑,卦符阳阴阴,二进制数为100

离:白黑白,卦符阳阴阳,二进制数为101

兑:白白黑,卦符阳阳阴,二进制数为110

乾:白白白,卦符阳阳阳,二进制数为111。

      同样,我们可以写出八卦各卦阴爻的二进制数(即有阴爻为1,无阴爻为0):

坤:黑黑黑,卦符阴阴阴,二进制数为111

艮:黑黑白,卦符阴阴阳,二进制数为110

坎:黑白黑,卦符阴阳阴,二进制数为101

巽:黑黑白,卦符阴阳阳,二进制数为100

震:白黑黑,卦符阳阴阴,二进制数为011

离:白黑白,卦符阳阴阳,二进制数为010

兑:白白黑,卦符阳阳阴,二进制数为001

乾:白白白,卦符阳阳阳,二进制数为000

好吧,还是帖代码实际一些:

  1 struct Rect
  2 {
  3     float left;
  4     float right;
  5     float top;
  6     float bottom;
  7 };
  8 
  9 inline bool IsInRect(const Rect& rect, float x, float y)
 10 {
 11     return (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom);
 12 }
 13 
 14 unsigned int    CPixelTaijiEight::CalculatePixel(unsigned int x, unsigned int y)
 15 {
 16     float radius1 = 360.0f;
 17     float radius2 = 60.0f;
 18     float height = 18.0f;
 19 
 20     float rr = radius1*radius1;
 21 
 22     unsigned int black = 0xff000000;
 23     unsigned int white = 0xffffffff;
 24     unsigned int gray = 0xff404040;
 25     unsigned int dise = 0xffc0c0c0;
 26 
 27     float i = x - 512.0f;
 28     float j = y - 512.0f;
 29 
 30     const float sqrt2 = sqrtf(2.0f)*0.5f;
 31 
 32     if ((i*i + j*j) > rr)
 33     {
 34         // 八卦图
 35         Rect rt1 = {-radius1*0.4f, radius1*0.4f, -radius1 - height*7, -radius1 - height*6};
 36         Rect rt2 = {-radius1*0.4f, radius1*0.4f, -radius1 - height*5, -radius1 - height*4};
 37         Rect rt3 = {-radius1*0.4f, radius1*0.4f, -radius1 - height*3, -radius1 - height*2};
 38 
 39         Rect rtc1 = {-radius1*0.06f, radius1*0.06f, -radius1 - height*7, -radius1 - height*6};
 40         Rect rtc2 = {-radius1*0.06f, radius1*0.06f, -radius1 - height*5, -radius1 - height*4};
 41         Rect rtc3 = {-radius1*0.06f, radius1*0.06f, -radius1 - height*3, -radius1 - height*2};
 42 
 43         float list_sin[8] = {0.0f, sqrt2, 1.0f,  sqrt2,  0.0f, -sqrt2, -1.0f, -sqrt2};
 44         float list_cos[8] = {1.0f, sqrt2, 0.0f, -sqrt2, -1.0f, -sqrt2,  0.0f,  sqrt2};
 45         int list_eight[8] = {0, 1, 2, 3, 7, 6, 5, 4};
 46 
 47         float ti, tj;
 48         for (int m = 0; m < 8; m++)
 49         {
 50             ti = i*list_cos[m] - j*list_sin[m];
 51             tj = i*list_sin[m] + j*list_cos[m];
 52 
 53             if (IsInRect(rt1, ti, tj))
 54             {
 55                 if (list_eight[m] & 0x1)
 56                 {
 57                     if (IsInRect(rtc1, ti, tj))
 58                     {
 59                         return dise;
 60                     }
 61                 }
 62 
 63                 return gray;
 64             }
 65 
 66             if (IsInRect(rt2, ti, tj))
 67             {
 68                 if (list_eight[m] & 0x2)
 69                 {
 70                     if (IsInRect(rtc2, ti, tj))
 71                     {
 72                         return dise;
 73                     }
 74                 }
 75 
 76                 return gray;
 77             }
 78 
 79             if (IsInRect(rt3, ti, tj))
 80             {
 81                 if (list_eight[m] & 0x4)
 82                 {
 83                     if (IsInRect(rtc3, ti, tj))
 84                     {
 85                         return dise;
 86                     }
 87                 }
 88 
 89                 return gray;
 90             }
 91         }
 92 
 93         return dise;
 94     }
 95     else
 96     {
 97         // 太极阴阳图
 98 
 99         float t = j + radius1*0.5f;
100         float tt = t*t + i*i;
101         if (tt < radius2*radius2)
102         {
103             return white;
104         }
105         else if (tt < rr*0.25f)
106         {
107             return black;
108         }
109 
110         t = j - radius1*0.5f;
111         tt = t*t + i*i;
112         if (tt < radius2*radius2)
113         {
114             return black;
115         }
116         else if (tt < rr*0.25f)
117         {
118             return white;
119         }
120 
121         if (i < 0.0f)
122         {
123             return white;
124         }
125         else
126         {
127             return black;
128         }
129     }
130 
131 }

生成图像如下:

bubuko.com,布布扣

最后愿这幅八卦图保佑我们写的程序绝无BUG,永不修改,同意的点推荐.

相关文章:

算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[上]

算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[下]

算法生成太极八卦图

标签:style   blog   http   color   os   ar   for   sp   strong   

原文地址:http://www.cnblogs.com/WhyEngine/p/4059266.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!