zoukankan      html  css  js  c++  java
  • 算法生成太极八卦图

          前面一篇文章是通过算法生成一幅太极图,有道是:无极生太极,太极生两仪,两仪生四象,四象生八卦.那么这一节就为太极生成一个八卦图.八卦图衍生自汉族古代的《河图》与《洛书》,传为伏羲所作。其中《河图》演化为先天八卦,《洛书》演化为后天八卦。八卦各有三爻,“乾、坤、震、巽、坎、离、艮、兑”分立八方,象征“天、地、雷、风、水、火、山、泽”八种性质与自然现象,象征世界的变化与循环,分类方法如同五行,世间万物皆可分类归至八卦之中,亦是二进制与电子计算机的古老始祖。

          太极就是一,是道,是天地未分时物质性的浑沌元气。太极动而生阳,静而生阴,是生两仪,一阴一阳就是两仪,故《易·系辞说》说:“一阴一阳之谓道”,古人观天下万物之变化,不外乎由太极而生阴阳,故画一奇以象阳,画一偶以象阴。阳就是阳爻,用"—"表示,单为阳之数;阴就是阴爻,用"--"表示,双为阴之数。这就是构成八卦的基本符号,是(阴阳)矛盾的形态和万物演变过程中的最基本的阴阳二气的基本符号。

          虽然我对易经这种玄之又玄的哲学没多少研究,但至少八卦可以看做是二进制的鼻祖.根据二进制数的规定:有,用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 }

  • 相关阅读:
    Java实现大批量数据导入导出(100W以上) -(三)超过25列Excel导出
    华为狼性文化与新员工引导
    盈利模式!商业保理 VS银行保理
    供应链金融保理业务最全解析-四大模式
    Spring Boot下Bean定义方式及调用方式
    Java非侵入式API接口即文档工具apigcc
    Java一个简单的重试工具包
    多层级汇总报表生成
    Spring事物隔离级别及事物传播行为@Transactional实现
    四种事物隔离级别详解
  • 原文地址:https://www.cnblogs.com/WhyEngine/p/4059266.html
Copyright © 2011-2022 走看看