前面一篇文章是通過算法生成一幅太極圖,有道是:無極生太極,太極生兩儀,兩儀生四象,四象生八卦.那么這一節就為太極生成一個八卦圖.八卦圖衍生自漢族古代的《河圖》與《洛書》,傳為伏羲所作。其中《河圖》演化為先天八卦,《洛書》演化為后天八卦。八卦各有三爻,“乾、坤、震、巽、坎、離、艮、兌”分立八方,象征“天、地、雷、風、水、火、山、澤”八種性質與自然現象,象征世界的變化與循環,分類方法如同五行,世間萬物皆可分類歸至八卦之中,亦是二進制與電子計算機的古老始祖。
太極就是一,是道,是天地未分時物質性的渾沌元氣。太極動而生陽,靜而生陰,是生兩儀,一陰一陽就是兩儀,故《易·系辭說》說:“一陰一陽之謂道”,古人觀天下萬物之變化,不外乎由太極而生陰陽,故畫一奇以象陽,畫一偶以象陰。陽就是陽爻,用"—"表示,單為陽之數;陰就是陰爻,用"--"表示,雙為陰之數。這就是構成八卦的基本符號,是(陰陽)矛盾的形態和萬物演變過程中的最基本的陰陽二氣的基本符號。
雖然我對易經這種玄之又玄的哲學沒多少研究,但至少八卦可以看做是二進制的鼻祖.根據二進制數的規定:有,用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 }