算法生成太极八卦图

      前面一篇文章是通过算法生成一幅太极图,有道是:无极生太极,太极生两仪,两仪生四象,四象生八卦.那么这一节就为太极生成一个八卦图.八卦图衍生自汉族古代的《河图》与《洛书》,传为伏羲所作。其中《河图》演化为先天八卦,《洛书》演化为后天八卦。八卦各有三爻,“乾、坤、震、巽、坎、离、艮、兑”分立八方,象征“天、地、雷、风、水、火、山、泽”八种性质与自然现象,象征世界的变化与循环,分类方法如同五行,世间万物皆可分类归至八卦之中,亦是二进制与电子计算机的古老始祖。

      太极就是一,是道,是天地未分时物质性的浑沌元气。太极动而生阳,静而生阴,是生两仪,一阴一阳就是两仪,故《易·系辞说》说:“一阴一阳之谓道”,古人观天下万物之变化,不外乎由太极而生阴阳,故画一奇以象阳,画一偶以象阴。阳就是阳爻,用"—"表示,单为阳之数;阴就是阴爻,用"--"表示,双为阴之数。这就是构成八卦的基本符号,是(阴阳)矛盾的形态和万物演变过程中的最基本的阴阳二气的基本符号。

      虽然我对易经这种玄之又玄的哲学没多少研究,但至少八卦可以看做是二进制的鼻祖.根据二进制数的规定:有,用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 }

生成图像如下:

 之前我曾经见过这样的代码注释:

/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         佛祖保佑       永无BUG
*/

我觉得:相比于佛祖,八卦和程序的关系更近一些.

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

相关文章:

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

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

--------------------------------------------

36楼

谈天才是专家,看来绝无BUG,永不修改只能是一厢情愿的事

 

 1 unsigned int    CPixelTaijiYinyang::CalculatePixel(unsigned int x, unsigned int y)
 2 {
 3     float radius1 = m_params[0];
 4     float radius2 = radius1*m_params[1];
 5 
 6     float rr = radius1*radius1;
 7 
 8     unsigned int black = 0xff000000;
 9     unsigned int white = 0xffffffff;
10     unsigned int gray = 0xff808080;
11 
12     float i = x - 512.0f;
13     float j = y - 512.0f;
14 
15     if ((i*i + j*j) > rr)
16     {
17         return gray;
18     }
19 
20     float t = j + radius1*0.5f;
21     float tt = t*t + i*i;
22     if (tt < radius2*radius2)
23     {
24         return black;
25     }
26     else if (tt < rr*0.25f)
27     {
28         return white;
29     }
30 
31     t = j - radius1*0.5f;
32     tt = t*t + i*i;
33     if (tt < radius2*radius2)
34     {
35         return white;
36     }
37     else if (tt < rr*0.25f)
38     {
39         return black;
40     }
41 
42     if (i < 0.0f)
43     {
44         return white;
45     }
46     else
47     {
48         return black;
49     }
50 }

 

 

posted on 2014-10-29 13:31  叶飞影  阅读(13335)  评论(39编辑  收藏  举报