混沌分形之谢尔宾斯基(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)四面体

时间: 2024-10-04 22:16:52

混沌分形之谢尔宾斯基(Sierpinski)的相关文章

分形之谢尔宾斯基(Sierpinski)三角形

谢尔宾斯基三角形(英语:Sierpinski triangle)是一种分形,由波兰数学家谢尔宾斯基在1915年提出,它是一种典型的自相似集.也有的资料将其称之为谢尔宾斯基坟垛. 其生成过程为: 取一个实心的三角形.(多数使用等边三角形) 沿三边中点的连线,将它分成四个小三角形. 去掉中间的那一个小三角形. 对其余三个小三角形重复1. 核心代码: static void SierpinskiTriangle(const Vector3& v1, const Vector3& v2, cons

分形之谢尔宾斯基(Sierpinski)地毯

前面讲了谢尔宾斯基三角形,和这一节的将把三角形变为正方形,即谢尔宾斯基地毯,它是由瓦茨瓦夫·谢尔宾斯基于1916年提出的一种分形,是自相似集的一种. 谢尔宾斯基地毯的构造与谢尔宾斯基三角形相似,区别仅在于谢尔宾斯基地毯是以正方形而非等边三角形为基础的.将一个实心正方形划分为的9个小正方形,去掉中间的小正方形,再对余下的小正方形重复这一操作便能得到谢尔宾斯基地毯.如下图:       核心代码: static void SierpinskiCarpet(const Vector3& v, Vect

分形之谢尔宾斯基(Sierpinski)四面体

前面讲了谢尔宾斯基三角形,这一节的将对二维三角形扩展到三维,变成四面体.即将一个正四面体不停地拆分,每个正四面体可以拆分成四个小号的正四面体.由二维转变到三维实现起来麻烦了许多.三维的谢尔宾斯基四面体看上去比谢尔宾斯基三角形更像坟冢. 核心代码: static void SierpinskiTetrahedron(const Vector3* pSrc, Vector3* pDest) { Vector3 v01 = (pSrc[0] + pSrc[1])*0.5f; Vector3 v02 =

分形--谢尔宾斯基地毯

谢尔宾斯基地毯的构造与谢尔宾斯基三角形相似,区别仅在于谢尔宾斯基地毯是以正方形而非等边三角形为基础的.将一个实心正方形划分为的9个小正方形,去掉中间的小正方形,再对余下的小正方形重复这一操作便能得到谢尔宾斯基地毯. js实现思路和我之前写的分形--谢尔宾斯基三角形的类似. js效果: 贴关键代码: 1.画点 function point(x,y){ this.x = x; this.y = y; } 2.画线 function drawLine (ctx,point1,point2) { ctx

谢尔宾斯基三角形,“混沌游戏”实现 2014-10-22

请教了一下@李劲 学长用啥图形库,学长推荐了EasyX,我就试了试做这个,原物是从<混沌与分形——科学的新疆界>p24页看到的. 本来还想做的更动态一些,但是没搞清楚画出的线如何删掉,干脆就不划线了.用上下键可调速. 疑问: ①.如何有效地将程序暂停很短的时间?貌似Sleep函数只能最短暂停10ms左右.我用空循环模拟了暂停,但在VS的Release生成时就毫无效果,不知道是空循环的问题还是其他问题(我怀疑后者). ②.TCHAR如何用itoa等函数?(有wcscpy等TCHAR类型可使用的函

谢宾斯基三角形的几种生成方法

简介 谢宾斯基三角形(Sierpinski triangle)是一种分形,由波兰数学家谢宾斯基在1915年提出.它是一种自相似集. 几种生成方法 方法一:去掉中心 取一个实心的三角形(多数用等边三角形) 连接三边中点,将它们分成4个小三角形 将正中间的三角形挖空 对其余三个小三角形重复操作1 取一个正方形或其它图形开始,用类似的方法,形状也和谢宾斯基三角形相似,例如: 取一个实心正方形 将它分成3个“品”字形的小正方形 将其余部分“挖空” 重复步骤1 方法二:Chaos Game 任取平面上三点

混沌分形之迭代函数系统(IFS)

IFS是分形的重要分支.它是分形图像处理中最富生命力而且最具有广阔应用前景的领域之一.这一工作最早可以追溯到Hutchinson于1981年对自相似集的研究.美国科学家M.F.Barnsley于1985年发展了这一分形构型系统,并命名为迭代函数系统(Iterated Function System,IFS),后来又由Stephen Demko等人将其公式化,并引入到图像合成领域中.IFS将待生成的图像看做是由许多与整体相似的(自相似)或经过一定变换与整体相似的(自仿射)小块拼贴而成.算法: 1.

混沌分形之逻辑斯蒂(Logistic)映射系统

前几天,有个同事看到我生成的一幅逻辑斯蒂分岔图像后,问我:“这是咪咪吗?”我回答:“淫者见淫.”好吧,这里将生成几种分岔映射图形,包括逻辑斯蒂映射系统,正弦映射系统和曼德勃罗映射系统.实际上这几种图形算不上分形,只不过它与我写的其他分形对象使用相同的基类,所以也将其列入混沌分形的范畴. 关于基类FractalEquation的定义及相关软件见:混沌与分形 (1)逻辑斯蒂映射系统 // 逻辑斯蒂映射系统 class LogisticMap : public FractalEquation { pu

苹果iOS手机暗藏间谍软件的揭秘者:扎徳尔斯基

大家知道,苹果iOS手机的短消息服务器(SMS)是用硬件加密的,看起来很安全.但是,Jonathan Zdziarski发现苹果公司有意地放进去一个"文件转发服务器"(file-relay),可以避开SMS的硬件保护机制,留给自己使用. 苹果公司并不否认这个事实,但是,强调这种避开硬件保护的系统设计是为了系统"诊断"使用.可是,实际情况不是这样的. 扎德尔发现,这个所谓的"诊断程序"可以采用无线方式激活,也就是说,在用户完全不知情的情况下,比如,