算法生成太极八卦图
前面一篇文章是通过算法生成一幅太极图,有道是:无极生太极,太极生两仪,两仪生四象,四象生八卦.那么这一节就为太极生成一个八卦图.八卦图衍生自汉族古代的《河图》与《洛书》,传为伏羲所作。其中《河图》演化为先天八卦,《洛书》演化为后天八卦。八卦各有三爻,“乾、坤、震、巽、坎、离、艮、兑”分立八方,象征“天、地、雷、风、水、火、山、泽”八种性质与自然现象,象征世界的变化与循环,分类方法如同五行,世间万物皆可分类归至八卦之中,亦是二进制与电子计算机的古老始祖。
太极就是一,是道,是天地未分时物质性的浑沌元气。太极动而生阳,静而生阴,是生两仪,一阴一阳就是两仪,故《易·系辞说》说:“一阴一阳之谓道”,古人观天下万物之变化,不外乎由太极而生阴阳,故画一奇以象阳,画一偶以象阴。阳就是阳爻,用"—"表示,单为阳之数;阴就是阴爻,用"--"表示,双为阴之数。这就是构成八卦的基本符号,是(阴阳)矛盾的形态和万物演变过程中的最基本的阴阳二气的基本符号。
虽然我对易经这种玄之又玄的哲学没多少研究,但至少八卦可以看做是二进制的鼻祖.根据二进制数的规定:有,用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 }