混沌分形之謝爾賓斯基(Sierpinski)


本文以使用混沌方法生成若干種謝爾賓斯基相關的分形圖形。

(1)謝爾賓斯基三角形

給三角形的3個頂點,和一個當前點,然后以以下的方式進行迭代處理:

a.隨機選擇三角形的某一個頂點,計算出它與當前點的中點位置;

b.將計算出的中點做為當前點,再重新執行操作a

相關代碼如下:

class SierpinskiTriangle : public FractalEquation { public: SierpinskiTriangle() { m_StartX = 0.0f; m_StartY = 0.0f; m_StartZ = 0.0f; m_triangleX[0] = 0.0f; m_triangleY[0] = FRACTAL_RADIUS; m_triangleX[1] = FRACTAL_RADIUS*sinf(PI/3); m_triangleY[1] = -FRACTAL_RADIUS*sinf(PI/6); m_triangleX[2] = -m_triangleX[1]; m_triangleY[2] = m_triangleY[1]; } void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const { int r = rand()%3; outX = (x + m_triangleX[r])*0.5f; outY = (y + m_triangleY[r])*0.5f; outZ = z; } private: float m_triangleX[3]; float m_triangleY[3]; };

關於基類FractalEquation的定義見:混沌與分形

最終生成的圖形為:

通過這一算法可以生成如下圖像:

(2)謝爾賓斯基矩形

既然能生成三角形的圖形,那么對於矩形會如何呢?嘗試下吧:

class SierpinskiRectangle : public FractalEquation { public: SierpinskiRectangle() { m_StartX = 0.0f; m_StartY = 0.0f; m_StartZ = 0.0f; m_ParamA = 1.0f; m_ParamB = 1.0f; m_rectX[0] = FRACTAL_RADIUS; m_rectY[0] = FRACTAL_RADIUS; m_rectX[1] = FRACTAL_RADIUS; m_rectY[1] = -FRACTAL_RADIUS; m_rectX[2] = -FRACTAL_RADIUS; m_rectY[2] = -FRACTAL_RADIUS; m_rectX[3] = -FRACTAL_RADIUS; m_rectY[3] = FRACTAL_RADIUS; } void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const { int r = rand()%4; outX = (x + m_rectX[r])*0.5f; outY = (y + m_rectY[r])*0.5f; outZ = z; } bool IsValidParamA() const {return true;} bool IsValidParamB() const {return true;} void SetParamA(float v) { m_ParamA = v; m_rectX[0] = FRACTAL_RADIUS*m_ParamA; m_rectX[1] = FRACTAL_RADIUS*m_ParamA; m_rectX[2] = -FRACTAL_RADIUS*m_ParamA; m_rectX[3] = -FRACTAL_RADIUS*m_ParamA; } void SetParamB(float v) { m_ParamB = v; m_rectY[0] = FRACTAL_RADIUS*m_ParamB; m_rectY[1] = -FRACTAL_RADIUS*m_ParamB; m_rectY[2] = -FRACTAL_RADIUS*m_ParamB; m_rectY[3] = FRACTAL_RADIUS*m_ParamB; } private: float m_rectX[4]; float m_rectY[4]; };

圖形如下:

噢,SHIT,毫無規律可言。

那就變動一下吧:

class FractalSquare : public FractalEquation { public: FractalSquare() { m_StartX = 0.0f; m_StartY = 0.0f; m_StartZ = 0.0f; m_rectX[0] = FRACTAL_RADIUS; m_rectY[0] = FRACTAL_RADIUS; m_rectX[1] = FRACTAL_RADIUS; m_rectY[1] = -FRACTAL_RADIUS; m_rectX[2] = -FRACTAL_RADIUS; m_rectY[2] = -FRACTAL_RADIUS; m_rectX[3] = -FRACTAL_RADIUS; m_rectY[3] = FRACTAL_RADIUS; } void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const { int r = rand()%10; if (r < 4) { outX = (x + m_rectX[r])*0.5f; outY = (y + m_rectY[r])*0.5f; } else { outX = x*0.5f; outY = y*0.5f; } outZ = z; } private: float m_rectX[4]; float m_rectY[4]; };

看上去還有點樣。

(3)謝爾賓斯基五邊形

四邊形是不行的,那再試下五邊:

// 五邊形
class SierpinskiPentagon : public FractalEquation { public: SierpinskiPentagon() { m_StartX = 0.0f; m_StartY = 0.0f; m_StartZ = 0.0f; for (int i = 0; i < 5; i++) { m_pentagonX[i] = sinf(i*PI*2/5); m_pentagonY[i] = cosf(i*PI*2/5); } } void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const { int r = rand()%5; outX = (x + m_pentagonX[r])*0.5f; outY = (y + m_pentagonY[r])*0.5f; outZ = z; } private: float m_pentagonX[5]; float m_pentagonY[5]; };

有點樣子,那就以此算法為基礎,生成幅圖像看看:

有人稱謝爾賓斯基三角形為謝爾賓斯基墳垛,當我看到這幅圖時,有一種恐怖的感覺。邪惡的五角形,總感覺里面有數不清的骷髏。

看來二維空間中謝爾賓斯基的單數可以生成分形圖形,而雙數則為無序的混沌。

(4)謝爾賓斯基四面體

再由二維擴展到三維看看:

class SierpinskiTetrahedron : public FractalEquation { public: SierpinskiTetrahedron() { m_StartX = 0.0f; m_StartY = 0.0f; m_StartZ = 0.0f; m_vTetrahedron[0] = YsVector(0.0f, 0.0f, 0.0f); m_vTetrahedron[1] = YsVector(0.0f, 1.0f, 0.0f); m_vTetrahedron[2] = YsVector(YD_REAL_SQRT_3/2, 0.5f, 0.0f); m_vTetrahedron[3] = YsVector(YD_REAL_SQRT_3/6, 0.5f, YD_REAL_SQRT_3*YD_REAL_SQRT_2/3); YsVector vCenter = m_vTetrahedron[0] + m_vTetrahedron[1] + m_vTetrahedron[2] + m_vTetrahedron[3]; vCenter *= 0.25f; m_vTetrahedron[0] -= vCenter; m_vTetrahedron[1] -= vCenter; m_vTetrahedron[2] -= vCenter; m_vTetrahedron[3] -= vCenter; m_vTetrahedron[0] *= FRACTAL_RADIUS; m_vTetrahedron[1] *= FRACTAL_RADIUS; m_vTetrahedron[2] *= FRACTAL_RADIUS; m_vTetrahedron[3] *= FRACTAL_RADIUS; } void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const { int r = rand()%4; outX = (x + m_vTetrahedron[r].x)*0.5f; outY = (y + m_vTetrahedron[r].y)*0.5f; outZ = (z + m_vTetrahedron[r].z)*0.5f; } bool Is3D() const {return true;} private: YsVector m_vTetrahedron[4]; };

(5)其他

謝爾賓斯基三角形是一種很神的東西,我寫過一些生成圖像的算法,常常不知不覺中就出現了謝爾賓斯基三角形。如細胞生長機

再如:

之前我寫過幾篇與謝爾賓斯基分形相關的文章

分形之謝爾賓斯基(Sierpinski)三角形

分形之謝爾賓斯基(Sierpinski)地毯

分形之謝爾賓斯基(Sierpinski)四面體

 


免責聲明!

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



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