首页 > 代码库 > 算法生成太极八卦图
算法生成太极八卦图
前面一篇文章是通过算法生成一幅太极图,有道是:无极生太极,太极生两仪,两仪生四象,四象生八卦.那么这一节就为太极生成一个八卦图.虽然我对易经这种玄之又玄的哲学没什么研究,但至少八卦可以看做是二进制的鼻祖.愿太极八卦保佑我们的程序绝无BUG,永不修改.
根据二进制数的规定:有,用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 }
生成图像如下:
最后愿这幅八卦图保佑我们写的程序绝无BUG,永不修改,同意的点推荐.
相关文章:
算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[上]
算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[下]
算法生成太极八卦图