算法生成太極八卦圖


      前面一篇文章是通過算法生成一幅太極圖,有道是:無極生太極,太極生兩儀,兩儀生四象,四象生八卦.那么這一節就為太極生成一個八卦圖.八卦圖衍生自漢族古代的《河圖》與《洛書》,傳為伏羲所作。其中《河圖》演化為先天八卦,《洛書》演化為后天八卦。八卦各有三爻,“乾、坤、震、巽、坎、離、艮、兌”分立八方,象征“天、地、雷、風、水、火、山、澤”八種性質與自然現象,象征世界的變化與循環,分類方法如同五行,世間萬物皆可分類歸至八卦之中,亦是二進制與電子計算機的古老始祖。

      太極就是一,是道,是天地未分時物質性的渾沌元氣。太極動而生陽,靜而生陰,是生兩儀,一陰一陽就是兩儀,故《易·系辭說》說:“一陰一陽之謂道”,古人觀天下萬物之變化,不外乎由太極而生陰陽,故畫一奇以象陽,畫一偶以象陰。陽就是陽爻,用"—"表示,單為陽之數;陰就是陰爻,用"--"表示,雙為陰之數。這就是構成八卦的基本符號,是(陰陽)矛盾的形態和萬物演變過程中的最基本的陰陽二氣的基本符號。

      雖然我對易經這種玄之又玄的哲學沒多少研究,但至少八卦可以看做是二進制的鼻祖.根據二進制數的規定:有,用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 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM