算法生成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的定義及相關函數見:二維平面上判斷點在三角形內的最優算法

生成圖像有:

五芒星

六芒星

七芒星

八芒星

九芒星

十芒星

十一芒星

十二芒星

十三芒星

二十三芒星

      百度上說:任何芒星都可以一筆畫出,並且起筆點和結束點在同一位置。不過這個“一筆”說得太籠統,N芒星需要幾條直線才能畫出?由圖可以看出,N芒星可以由N條線段畫出,但只有N為單數時,才可以由N條線段一筆畫出。而N為雙數時,相當於兩個N/2多邊形的交錯重疊。

 

第一種算法生成的芒星,當N越多時,星尖越短越鈍,所以我雙寫了第二種算法,可以調節星尖的長度:

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幅由程序生成的圖像,總有一幅讓你感到驚艷[下]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM