首页 > 代码库 > 算法生成五星红旗
算法生成五星红旗
这一篇将提供一套生成五星红旗的算法,代码中满满都是正能量。上一篇文章是生成N芒星,五角星是就芒星的一种,所以不难生成一个五角星的图像。中华人民共和国国旗是五星红旗,旗面为红色,长宽比例为3:2。左上方缀黄色五角星五颗,四颗小星环拱在一颗大星的右面,并各有一个角尖正对大星的中心点。1、4颗黄星对齐,2、3颗黄星对齐。
代码如下:
h
1 class CPixel5StarsRedFlag : public IPixelEquation 2 { 3 public: 4 CPixel5StarsRedFlag(); 5 6 const char* GetName() const 7 { 8 return "Five Stars Red Flag"; 9 }10 11 unsigned int CalculatePixel(unsigned int x, unsigned int y);12 13 struct Star14 {15 float posX;16 float posY;17 float radius;18 float angle;19 };20 bool IsPointInStar(float x, float y, Star& star);21 22 private:23 float m_list_sin[5];24 float m_list_cos[5];25 26 Star m_list_stars[5];27 };
头文章中定义了一个结构体Star,用于决定五角星的位置,大小,旋转角度。需要为每一颗星设置其合适的数值,我提供的代码所用参数是我多次试出来的,与实际不会绝对地相符。
cpp
1 CPixel5StarsRedFlag::CPixel5StarsRedFlag() 2 { 3 m_width = 1680; 4 m_height = 1120; 5 6 for (int i = 0; i < 5; i++) 7 { 8 m_list_sin[i] = sinf((i - 0.5f)*2*PI/5); 9 m_list_cos[i] = cosf((i - 0.5f)*2*PI/5); 10 } 11 12 m_list_stars[0].posX = m_width*0.2f; 13 m_list_stars[0].posY = m_height*0.35f; 14 m_list_stars[0].radius = m_height*0.1f; 15 m_list_stars[0].angle = 0.0f; 16 17 float r = m_list_stars[0].radius * 3.0f; 18 19 m_list_stars[1].posX = m_list_stars[0].posX + r*cosf(PI/4); 20 m_list_stars[1].posY = m_list_stars[0].posY + r*sinf(PI/4); 21 m_list_stars[1].radius = m_list_stars[0].radius*0.5f; 22 m_list_stars[1].angle = -PI/8; 23 24 m_list_stars[2].posX = m_list_stars[0].posX + r*cosf(PI/12); 25 m_list_stars[2].posY = m_list_stars[0].posY + r*sinf(PI/12); 26 m_list_stars[2].radius = m_list_stars[0].radius*0.5f; 27 m_list_stars[2].angle = -PI/24; 28 29 m_list_stars[3].posX = m_list_stars[0].posX + r*cosf(-PI/12); 30 m_list_stars[3].posY = m_list_stars[0].posY + r*sinf(-PI/12); 31 m_list_stars[3].radius = m_list_stars[0].radius*0.5f; 32 m_list_stars[3].angle = PI/24; 33 34 m_list_stars[4].posX = m_list_stars[0].posX + r*cosf(-PI/4); 35 m_list_stars[4].posY = m_list_stars[0].posY + r*sinf(-PI/4); 36 m_list_stars[4].radius = m_list_stars[0].radius*0.5f; 37 m_list_stars[4].angle = PI/8; 38 } 39 40 bool CPixel5StarsRedFlag::IsPointInStar(float x, float y, Star& star) 41 { 42 float i = x - star.posX; 43 float j = y - star.posY; 44 45 if (i*i + j*j > star.radius*star.radius) 46 { 47 return false; 48 } 49 50 float _s = sinf(star.angle); 51 float _c = cosf(star.angle); 52 53 Vec2 P; 54 P.x = i*_c - j*_s; 55 P.y = i*_s + j*_c; 56 57 Vec2 listPoints[5]; 58 for (unsigned int m = 0; m < 5; m++) 59 { 60 listPoints[m].x = star.radius*m_list_sin[m]; 61 listPoints[m].y = star.radius*m_list_cos[m]; 62 } 63 64 bool bCenter = true; 65 for (unsigned int m = 0; m < 5; m++) 66 { 67 Vec2& v = listPoints[m]; 68 Vec2& vL1 = listPoints[(m + 4)%5]; 69 Vec2& vL2 = listPoints[(m + 3)%5]; 70 Vec2& vR1 = listPoints[(m + 1)%5]; 71 Vec2& vR2 = listPoints[(m + 2)%5]; 72 73 if (!IsPointInAngle(vL2, v, vR2, P)) 74 { 75 bCenter = false; 76 } 77 else if (IsSameSide(vL1, vR1, v, P)) 78 { 79 return true; 80 } 81 } 82 83 return bCenter; 84 } 85 86 unsigned int CPixel5StarsRedFlag::CalculatePixel(unsigned int x, unsigned int y) 87 { 88 unsigned int red = 0xffff0000; 89 unsigned int yellow = 0xfffff000; 90 91 float i = (float)x; 92 float j = (float)y; 93 94 for (unsigned int m = 0; m < 5; ++m) 95 { 96 if (IsPointInStar(i, j, m_list_stars[m])) 97 { 98 return yellow; 99 }100 }101 102 return red;103 }
基类IPixelEquation的代码见:Why数学图像生成工具
关于结构体Vec2的定义及相关函数见:二维平面上判断点在三角形内的最优算法
代码中没有太考究图形之间的比例,与实际会略有不符。生成图像如下:
相应软件:
Why数学图像生成工具
相关文章:
算法生成青天白日满地红旗
算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[上]
算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[下]
算法生成五星红旗
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。