算法生成青天白日满地红旗 - 叶飞影

>>>  技術話題—商業文明的嶄新時代  >>> 簡體     傳統

      “青天白日满地红”曾经代表中国,特别是在抗日战争的艰苦年代。那时候红军编入国民革命军,戴着青天白日帽徽,全国人民团结在“青天白日满地红”旗帜下,高唱《义勇军进行曲》,奋力抗战,打败了日本帝国主义。“青天白日满地红”象征着中国人的苦难和抗争,跟《义勇军进行曲》一起,鼓舞中国人团结起来取得胜利,凝结着中国人的感情。

      青色代表光明纯洁、民族和自由;白色代表坦白无私、民权和平等;白日的十二道光芒,代表着一年十二个月,一天十二个时辰;也象征着国家的命脉,随着时间的前进永存于世界;更鼓舞国人与时俱进,自强不息。青天白日,取象宏美,中华民国为远东大国,日出东方为之最者,且青天白日,示光明正照自由平等之义。
代码如下:
 1 class CPixelBlueSkyWhiteSun : public IPixelEquation
 2 {
 3 public:
 4     CPixelBlueSkyWhiteSun()
 5     {
 6         m_width = 1680;
 7         m_height = 1120;
 8 
 9         for (int i = 0; i < 12; i++)
10         {
11             m_list_sin[i] = sinf(i*PI/6);
12             m_list_cos[i] = cosf(i*PI/6);
13         }
14     }
15 
16     const char*     GetName() const
17     {
18         return "Blue Sky White Sun";
19     }
20 
21     unsigned int    CalculatePixel(unsigned int x, unsigned int y);
22 
23 private:
24     float m_list_sin[12];
25     float m_list_cos[12];
26 };

cpp

 1 unsigned int    CPixelBlueSkyWhiteSun::CalculatePixel(unsigned int x, unsigned int y)
 2 {
 3     unsigned int red = 0xffff0000;
 4     unsigned int white = 0xffffffff;
 5     unsigned int blue = 0xff0000ff;
 6 
 7     float w = m_width*0.5f;
 8     float h = m_height*0.5f;
 9 
10     if ((float)x > w || (float)y > h)
11     {
12         return red;
13     }
14 
15     float cX = w*0.5f;
16     float cY = h*0.5f;
17     float radius = cY*0.5f;
18     Vec2 tri0(0.0f, -radius*1.65f);
19     Vec2 tri1(-radius*0.2f, -radius*1.05f);
20     Vec2 tri2(radius*0.2f, -radius*1.05f);
21     Vec2 P;
22 
23     float i = x - cX;
24     float j = y - cY;
25 
26     float dis = sqrtf(i*i + j*j);
27 
28     if (dis < radius)
29     {
30         return white;
31     }
32     else if (dis > radius*1.65f)
33     {
34         return blue;
35     }
36 
37     for (int m = 0; m < 12; m++)
38     {
39         P.x = i*m_list_cos[m] - j*m_list_sin[m];
40         P.y = i*m_list_sin[m] + j*m_list_cos[m];
41 
42         if (IsPointInTriangle(tri0, tri1, tri2, P))
43         {
44             return white;
45         }
46     }
47   
48     return blue;
49 }

基类IPixelEquation的代码见:Why数学图像生成工具

关于结构体Vec2的定义及相关函数见:二维平面上判断点在三角形内的最优算法

代码中没有太考究图形之间的比例,与实际会略有不符。生成图像如下:

相应软件:

Why数学图像生成工具

相关文章:

算法生成五星红旗

算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[上]

算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[下]

 


叶飞影 2015-05-19 00:36:35

[新一篇] 第四個:怎么應付在背地里說你壞話的人 - Free Programmer

[舊一篇] 算算制造一款App的成本
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表