首页 > 代码库 > 算法生成N芒星
算法生成N芒星
前面两个图像生成算法是:道教的太极八卦图和佛教的卐和卍字图。这一节整个洋气的图像:芒星。但愿我别召唤出什么恐怖的禁忌。平时看玄幻小说,经常读到有关六芒星,七芒星,九芒星的技法。芒星是由几个完全的等腰三角形(有时是正三角形)和一个正多边形组成的二维图形。等腰三角形的个数与正多边形的边数相等。由五个等腰三角形和正五边形组成的图形叫“五芒星”(俗称:五角星)。由六个等腰三角形和正六边形组成的图形叫“六芒星”……依此类推。芒星在美学、历史和占卜都有着很大的用处。
芒星在生活中与我们息息相关,我们常说的“五角星”也是芒星的一种。五芒星的五个顶点都代表不同的元素,分别是地、水、火、风及象征人类精神力量的第五元素,而五芒星亦是在魔法中是常被使用的符号,因为其整体一看就像一个人的身体,最顶一点为头部,其余为四肢。在圣经中,人是被创造者,而五芒星也含有被创造之意,这就和四元素及人体相对应。当顶点指向天时,那便代表圣力。
Tantrism派认为,六芒星形中尖端向下的三角形是卡利·玛的象征物“女阴”的符号,除了倒三角形之外,它也表示为鱼、两端尖锐的椭圆形、马蹄、蛋等图形。因此这个倒三角被称为“女阴的图象”即“Yoni Yantra”,其中“Yantra”是Tantrism派所认为的“冥想的图象”,是适用于眼睛的图象,和“适用于耳的图象”-“真言”(Mantra-曼荼罗,象征为八叶莲花)互为表里。倒三角形代表了万物之源-宇宙之母,表示盛满宇宙之母体液(力量)的容器。
在西方,7被认为是一个很有魔力的数字。被神秘学视为意义上更复杂的芒星,力量也更强大的图案。关于七芒星的资料: 1 .七芒星很难被准确地画出,因为七芒星是“不平均却稳定的一体” 2.七芒星分为“正七芒星”与“逆七芒星” 3.关于“七芒星魔法阵”也是众说纷纭 4.七芒星魔法阵的功效被记载得不多,只知道大概可以用来召唤超能。因此没有任何魔法师或者术士敢使用,七芒星因此成了禁忌。传说一笔画出过完美七芒星的人有的说看见了炽天使长米迦勒,有的说看见了地狱魔君路西法,也有人说看见了天堂的生命树,甚至有人说看见了末日。
八芒星与卐字符号是遍布于我国广大地域多个民族的文化符号。有学者认为神秘的卐字符号其实是八角星纹的简化变体,它们都代表了太阳在一个回归年的视循环运动,即一年四季的循环变化。 八角星让人想起罗盘、六分仪、舵,像是朝向八方的宝剑。八角星的八个角代表八个方向,意为绝对的混沌或混沌能量的八种形态(天地风雷水火山泽)。
这篇文章中提供了两套生成芒星的算法,先看第一个:
void CPixelNStar::ResetN(){ m_n = (unsigned int)m_params[0]; if (m_n < 5) { m_n = 5; } else if (m_n > 32) { m_n = 32; } float radius = 400.0f; for (unsigned int i = 0; i < m_n; i++) { m_listPoints[i].x = radius*sinf((i - 0.5f)*2*PI/m_n); m_listPoints[i].y = radius*cosf((i - 0.5f)*2*PI/m_n); }}unsigned int CPixelNStar::CalculatePixel(unsigned int x, unsigned int y){ unsigned int red = 0xffff0000; unsigned int yellow = 0xffffc000; unsigned int gray = 0xff808080; Vec2 P(x - 512.0f, y - 512.0f); bool bCenter = true; for (unsigned int i = 0; i < m_n; i++) { Vec2& v = m_listPoints[i]; Vec2& vL1 = m_listPoints[(i + m_n - 1)%m_n]; Vec2& vL2 = m_listPoints[(i + m_n - 2)%m_n]; Vec2& vR1 = m_listPoints[(i + 1)%m_n]; Vec2& vR2 = m_listPoints[(i + 2)%m_n]; if (!IsPointInAngle(vL2, v, vR2, P)) { bCenter = false; } else if (IsSameSide(vL1, vR1, v, P)) { return red; } } return bCenter ? yellow : gray;}
生成图像有:
五芒星
六芒星
七芒星
八芒星
九芒星
十芒星
十一芒星
十二芒星
十三芒星
二十三芒星
关于结构体Vec2的定义见:二维平面上判断点在三角形内的最优算法
第二种算法为:
void CPixelNLightStar::ResetN(){ m_n = (unsigned int)m_params[0]; if (m_n < 3) { m_n = 3; } else if (m_n > 32) { m_n = 32; } for (unsigned int i = 0; i < m_n; i++) { m_list_sin[i] = sinf((i - 0.5f)*2*PI/m_n); m_list_cos[i] = cosf((i - 0.5f)*2*PI/m_n); }}unsigned int CPixelNLightStar::CalculatePixel(unsigned int x, unsigned int y){ float radius = m_params[1]; float h = radius*m_params[2]; unsigned int red = 0xffff0000; unsigned int yellow = 0xffffc000; unsigned int gray = 0xff808080; float i = x - 512.0f; float j = y - 512.0f; float dis = sqrtf(i*i + j*j); if (dis < radius*cosf(PI/m_n)) { return red; } else if (dis > radius + h) { return gray; } Vec2 tri0(0.0f, radius + h); Vec2 tri1(radius*m_list_sin[0], radius*m_list_cos[0]); Vec2 tri2(radius*m_list_sin[1], radius*m_list_cos[1]); Vec2 P; bool bCenter = true; for (unsigned int m = 0; m < m_n; m++) { P.x = i*m_list_cos[m] - j*m_list_sin[m]; P.y = i*m_list_sin[m] + j*m_list_cos[m]; if (IsPointInTriangle(tri0, tri1, tri2, P)) { return yellow; } } if (dis < radius) { return red; } return gray;}
算法中可以设置芒星半径长度和角的高度,以生成更多样的芒星:
相应软件:
Why数学图像生成工具
之前我写过一篇与芒星有关的图形画法:
数学图形(1.30) 星星
相关文章:
算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[上]
算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[下]
算法生成N芒星