算法生成太极八卦图算法生成太极八卦图前面一篇文章是通过算法生成一幅太极图,有道是:无极生太极,太极生两仪,两仪生四象,四象生八卦.那么这一节就为太极生成一个八卦图.八卦图衍生自汉族古代的《河图》与《洛书》,传为伏羲所作。
其中《河图》演化为先天八卦,《洛书》演化为后天八卦。
八卦各有三爻,“乾、坤、震、巽、坎、离、艮、兑”分立八方,象征“天、地、雷、风、水、火、山、泽”八种性质与自然现象,象征世界的变化与循环,分类方法如同五行,世间万物皆可分类归至八卦之中,亦是二进制与电子计算机的古老始祖。
太极就是一,是道,是天地未分时物质性的浑沌元气。
太极动而生阳,静而生阴,是生两仪,一阴一阳就是两仪,故《易·系辞说》说:“一阴一阳之谓道”,古人观天下万物之变化,不外乎由太极而生阴阳,故画一奇以象阳,画一偶以象阴。
阳就是阳爻,用"—"表示,单为阳之数;阴就是阴爻,用"--"表示,双为阴之数。
这就是构成八卦的基本符号,是(阴阳)矛盾的形态和万物演变过程中的最基本的阴阳二气的基本符号。
虽然我对易经这种玄之又玄的哲学没多少研究,但至少八卦可以看做是二进制的鼻祖.根据二进制数的规定:有,用1表示;无,用0表示,可以得出八卦各卦阳爻和阴爻的二进制数。
下面写出八卦各卦阳爻的二进制数(即有阳爻为1,无阳爻为0):坤:黑黑黑,卦符阴阴阴,二进制数为000艮:黑黑白,卦符阴阴阳,二进制数为001坎:黑白黑,卦符阴阳阴,二进制数为010巽:黑黑白,卦符阴阳阳,二进制数为011震:白黑黑,卦符阳阴阴,二进制数为100离:白黑白,卦符阳阴阳,二进制数为101兑:白白黑,卦符阳阳阴,二进制数为110乾:白白白,卦符阳阳阳,二进制数为111。
同样,也可以写出八卦各卦阴爻的二进制数(即有阴爻为1,无阴爻为0):坤:黑黑黑,卦符阴阴阴,二进制数为111艮:黑黑白,卦符阴阴阳,二进制数为110坎:黑白黑,卦符阴阳阴,二进制数为101巽:黑黑白,卦符阴阳阳,二进制数为100震:白黑黑,卦符阳阴阴,二进制数为011离:白黑白,卦符阳阴阳,二进制数为010兑:白白黑,卦符阳阳阴,二进制数为001乾:白白白,卦符阳阳阳,二进制数为000好吧,写了这么多云里雾里的话,还是帖代码实际一些,希望大家能看懂我的代码.1 struct Rect2 {3 float left;4 float right;5 float top;6 float bottom;7 };89 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 }1314 unsigned intCPixelTaijiEight::CalculatePixel(unsigned int x, unsigned int y)15 {16 float radius1 = 360.0f;17 float radius2 = 60.0f;18 float height = 18.0f;1920 float rr = radius1*radius1;2122 unsigned int black = 0xff000000;23 unsigned int white = 0xffffffff;24 unsigned int gray = 0xff404040;25 unsigned int dise = 0xffc0c0c0;2627 float i = x - 512.0f;28 float j = y - 512.0f;2930 const float sqrt2 = sqrtf(2.0f)*0.5f;3132 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};3839 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};4243 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};4648 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];5253 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 }6263 return gray;64 }6566 if (IsInRect(rt2, ti, tj))67 {68 if (list_eight[m] & 0x2)70 if (IsInRect(rtc2, ti, tj))71 {72 return dise;73 }74 }7576 return gray;77 }7879 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 }8889 return gray;90 }9293 return dise;94 }95 else96 {97 // 太极阴阳图9899 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 }109110 t = j - radius1*0.5f;111 tt = t*t + i*i;112 if (tt < radius2*radius2)114 return black; 115 }116 else if (tt < rr*0.25f) 117 {118 return white; 119 }120121 if (i < 0.0f)122 {123 return white; 124 }125 else126 {127 return black; 128 }129 }130131 }生成图像如下:之前我曾经见过这样的代码注释:/*_ooOoo_o8888888o88" . "88(| -_- |)O\ = /O____/`---'\____.' \\| |// `./ \\||| : |||// / _||||| -:- |||||- | | \\\ - /// | || \_| ''\---/'' | |\ .-\__ `-` ___/-. /___`. .' /--.--\ `. . __."" '< `.___\_<|>_/___.' >'"".| | : `- \`.;`\ _ /`;.`/ - ` : | |\ \ `-. \_ __\ /__ _/ .-` / /======`-.____`-.___\_____/___.-`____.-'======`=---='^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^佛祖保佑永无BUG*/我觉得:相比于佛祖,八卦和程序的关系更近一些.最后愿这幅八卦图保佑我们写的程序绝无BUG,永不修改,同意的请点推荐.相关文章:算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[上]算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[下]--------------------------------------------36楼谈天才是专家,看来绝无BUG,永不修改只能是一厢情愿的事按Ctrl+C 复制代码按Ctrl+C 复制代码。