前面一篇文章是,有道是:无极生太极,太极生两仪,两仪生四象,四象生八卦.那么这一节就为太极生成一个八卦图.八卦图衍生自汉族古代的《河图》与《洛书》,传为伏羲所作。其中《河图》演化为先天八卦,《洛书》演化为后天八卦。八卦各有三爻,“乾、坤、震、巽、坎、离、艮、兑”分立八方,象征“天、地、雷、风、水、火、山、泽”八种性质与自然现象,象征世界的变化与循环,分类方法如同五行,世间万物皆可分类归至八卦之中,亦是二进制与电子计算机的古老始祖。
太极就是一,是道,是天地未分时物质性的浑沌元气。太极动而生阳,静而生阴,是生两仪,一阴一阳就是两仪,故《易·系辞说》说:“一阴一阳之谓道”,古人观天下万物之变化,不外乎由太极而生阴阳,故画一奇以象阳,画一偶以象阴。阳就是阳爻,用"—"表示,单为阳之数;阴就是阴爻,用"--"表示,双为阴之数。这就是构成八卦的基本符号,是(阴阳)矛盾的形态和万物演变过程中的最基本的阴阳二气的基本符号。
虽然我对易经这种玄之又玄的哲学没多少研究,但至少八卦可以看做是二进制的鼻祖.根据二进制数的规定:有,用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 else126 {127 return black;128 }129 }130 131 }
生成图像如下:
之前我曾经见过这样的代码注释:
/* _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. / \\||| : |||// \ / _||||| -:- |||||- \ | | \\\ - /// | | | \_| ''\---/'' | | \ .-\__ `-` ___/-. / ___`. .' /--.--\ `. . __ ."" '< `.___\_<|>_/___.' >'"". | | : `- \`.;`\ _ /`;.`/ - ` : | | \ \ `-. \_ __\ /__ _/ .-` / /======`-.____`-.___\_____/___.-`____.-'====== `=---='^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 佛祖保佑 永无BUG*/
我觉得:相比于佛祖,八卦和程序的关系更近一些.
最后愿这幅八卦图保佑我们写的程序绝无BUG,永不修改,同意的请点推荐.
相关文章:
--------------------------------------------
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 else47 {48 return black;49 }50 }
原文地址:http://www.cnblogs.com/WhyEngine/p/4059266.html#3053962