zoukankan      html  css  js  c++  java
  • 算法生成青天白日满地红旗

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

          青色代表光明纯洁、民族和自由;白色代表坦白无私、民权和平等;白日的十二道光芒,代表著一年十二个月,一天十二个时辰;也象征著国家的命脉,随著时间的前进永存于世界;更鼓舞国人与时俱进,自强不息。青天白日,取象宏美,中华民国为远东大国,日出东方为之最者,且青天白日,示光明正照自由平等之义。
    代码如下:
     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幅由程序生成的图像,总有一幅让你感到惊艳[下]

  • 相关阅读:
    题解 P5320
    Codeforces 1500F
    三个 AGC D(AGC037D、AGC043D、AGC050D)
    Atcoder Regular Contst 084 D
    DG-基础知识点整理
    MySQL-数据恢复场景实验
    MySQL-查看Galera集群状态
    MySQL-运行日志切割
    MySQL-生产环境删除大表或大量binlog策略
    MySQL-基于(MySQL 5.7)NDB中启用共享权限表
  • 原文地址:https://www.cnblogs.com/WhyEngine/p/4065753.html
Copyright © 2011-2022 走看看