本文以使用混沌方法生成若干种谢尔宾斯基相关的分形图形。

(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.0f;
m_triangleY[] = FRACTAL_RADIUS; m_triangleX[] = FRACTAL_RADIUS*sinf(PI/);
m_triangleY[] = -FRACTAL_RADIUS*sinf(PI/); m_triangleX[] = -m_triangleX[];
m_triangleY[] = m_triangleY[];
} void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const
{
int r = rand()%;
outX = (x + m_triangleX[r])*0.5f;
outY = (y + m_triangleY[r])*0.5f;
outZ = z;
} private:
float m_triangleX[];
float m_triangleY[];
};

关于基类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[] = FRACTAL_RADIUS;
m_rectY[] = FRACTAL_RADIUS; m_rectX[] = FRACTAL_RADIUS;
m_rectY[] = -FRACTAL_RADIUS; m_rectX[] = -FRACTAL_RADIUS;
m_rectY[] = -FRACTAL_RADIUS; m_rectX[] = -FRACTAL_RADIUS;
m_rectY[] = FRACTAL_RADIUS;
} void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const
{
int r = rand()%;
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[] = FRACTAL_RADIUS*m_ParamA;
m_rectX[] = FRACTAL_RADIUS*m_ParamA;
m_rectX[] = -FRACTAL_RADIUS*m_ParamA;
m_rectX[] = -FRACTAL_RADIUS*m_ParamA;
} void SetParamB(float v)
{
m_ParamB = v; m_rectY[] = FRACTAL_RADIUS*m_ParamB;
m_rectY[] = -FRACTAL_RADIUS*m_ParamB;
m_rectY[] = -FRACTAL_RADIUS*m_ParamB;
m_rectY[] = FRACTAL_RADIUS*m_ParamB;
} private:
float m_rectX[];
float m_rectY[];
};

图形如下:

噢,SHIT,毫无规律可言。

那就变动一下吧:

class FractalSquare : public FractalEquation
{
public:
FractalSquare()
{
m_StartX = 0.0f;
m_StartY = 0.0f;
m_StartZ = 0.0f; m_rectX[] = FRACTAL_RADIUS;
m_rectY[] = FRACTAL_RADIUS; m_rectX[] = FRACTAL_RADIUS;
m_rectY[] = -FRACTAL_RADIUS; m_rectX[] = -FRACTAL_RADIUS;
m_rectY[] = -FRACTAL_RADIUS; m_rectX[] = -FRACTAL_RADIUS;
m_rectY[] = FRACTAL_RADIUS;
} void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const
{
int r = rand()%;
if (r < )
{
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[];
float m_rectY[];
};

看上去还有点样。

(3)谢尔宾斯基五边形

四边形是不行的,那再试下五边:

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

有点样子,那就以此算法为基础,生成幅图像看看:

有人称谢尔宾斯基三角形为谢尔宾斯基坟垛,当我看到这幅图时,有一种恐怖的感觉。邪恶的五角形,总感觉里面有数不清的骷髅。

看来二维空间中谢尔宾斯基的单数可以生成分形图形,而双数则为无序的混沌。

(4)谢尔宾斯基四面体

再由二维扩展到三维看看:

class SierpinskiTetrahedron : public FractalEquation
{
public:
SierpinskiTetrahedron()
{
m_StartX = 0.0f;
m_StartY = 0.0f;
m_StartZ = 0.0f; m_vTetrahedron[] = YsVector(0.0f, 0.0f, 0.0f);
m_vTetrahedron[] = YsVector(0.0f, 1.0f, 0.0f);
m_vTetrahedron[] = YsVector(YD_REAL_SQRT_3/, 0.5f, 0.0f);
m_vTetrahedron[] = YsVector(YD_REAL_SQRT_3/, 0.5f, YD_REAL_SQRT_3*YD_REAL_SQRT_2/); YsVector vCenter = m_vTetrahedron[] + m_vTetrahedron[] + m_vTetrahedron[] + m_vTetrahedron[];
vCenter *= 0.25f; m_vTetrahedron[] -= vCenter;
m_vTetrahedron[] -= vCenter;
m_vTetrahedron[] -= vCenter;
m_vTetrahedron[] -= vCenter; m_vTetrahedron[] *= FRACTAL_RADIUS;
m_vTetrahedron[] *= FRACTAL_RADIUS;
m_vTetrahedron[] *= FRACTAL_RADIUS;
m_vTetrahedron[] *= FRACTAL_RADIUS;
} void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const
{
int r = rand()%;
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[];
};

(5)其他

谢尔宾斯基三角形是一种很神的东西,我写过一些生成图像的算法,常常不知不觉中就出现了谢尔宾斯基三角形。如细胞生长机

再如:

之前我写过几篇与谢尔宾斯基分形相关的文章

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

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

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

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

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

    谢尔宾斯基三角形(英语:Sierpinski triangle)是一种分形,由波兰数学家谢尔宾斯基在1915年提出,它是一种典型的自相似集.也有的资料将其称之为谢尔宾斯基坟垛. 其生成过程为: 取一个 ...

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

    前面讲了谢尔宾斯基三角形,和这一节的将把三角形变为正方形,即谢尔宾斯基地毯,它是由瓦茨瓦夫·谢尔宾斯基于1916年提出的一种分形,是自相似集的一种. 谢尔宾斯基地毯的构造与谢尔宾斯基三角形相似,区别仅 ...

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

    前面讲了谢尔宾斯基三角形,这一节的将对二维三角形扩展到三维,变成四面体.即将一个正四面体不停地拆分,每个正四面体可以拆分成四个小号的正四面体.由二维转变到三维实现起来麻烦了许多.三维的谢尔宾斯基四面体 ...

  4. 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫

    定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...

  5. python---使用递归实现谢尔宾斯基三角形及汉诺塔

    渐入佳境. # coding: utf-8 import turtle ''' # =================turtle练手== def draw_spiral(my_turtle, lin ...

  6. 小练手:用HTML5 Canvas绘制谢尔宾斯基三角形

    文章首发于我的知乎专栏,原地址:https://zhuanlan.zhihu.com/p/26606208 以前看到过一个问题:谢尔宾斯基三角形能用编程写出来么?该怎么写? - 知乎,在回答里,各方大 ...

  7. python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)

    插图工具使用Python内置的turtle模块,为什么叫这个turtle乌龟这个名字呢,可以这样理解,创建一个乌龟,乌龟能前进.后退.左转.右转,乌龟的尾巴朝下,它移动时就会画一条线.并且为了增加乌龟 ...

  8. Python使用递归绘制谢尔宾斯基三角形

    谢尔宾斯基三角形使用了三路递归算法,从一个大三角形开始,通过连接每一个边的中点,将大三角型分为四个三角形,然后忽略中间的三角形,依次对其余三个三角形执行上述操作. 运行效果: 源代码: 1 impor ...

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

    IFS是分形的重要分支.它是分形图像处理中最富生命力而且最具有广阔应用前景的领域之一.这一工作最早可以追溯到Hutchinson于1981年对自相似集的研究.美国科学家M.F.Barnsley于198 ...

随机推荐

  1. mysql索引原理剖析

    一.索引的原理 所谓索引,即是快速定位与查找,那么索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(B+树相比B树,其非叶子节点占用更小的空间,可以有更多非叶子节点存放在再内存中,减少大量的IO ...

  2. 21.python中的闭包和装饰器

    python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 以下说明主要针对 python ...

  3. BZOJ 3812主旋律

    求一个图中强联通图的个数. 一看就是容斥啦,但这种二进制高端操作还是学习一下Candy?dalao 注释在代码里 好久没更了... #include<bits/stdc++.h> usin ...

  4. BZOJ.1028.[JSOI2007]麻将(贪心)

    题目链接 枚举对子,枚举每张牌,先出完它的刻子,剩下的出顺子.\(O(n^3)\). 不是这样 -> 出完所有刻子,最后出顺子.(日常zz) 优先仨相同的,然后顺子,有一次且一定要用一次机会补顺 ...

  5. HDU.5181.numbers(DP)

    题目链接 参考. \(Description\) 将\(1,2,\cdots,n(n\leq 300)\)依次入栈/出栈,并满足\(m(m\leq 90000)\)个形如\(x\)要在\(y\)之前出 ...

  6. css实现背景图片模糊

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Codeforces Round #369 (Div. 2) C. Coloring Trees 动态规划

    C. Coloring Trees 题目连接: http://www.codeforces.com/contest/711/problem/C Description ZS the Coder and ...

  8. nexus-maven- repository-index.zip手动下载与设置

    问题描述: 在启动eclipse的时候,在maven控制台经常会看到更新nexus-maven-repository-index.zip,用 eclipse更新速度会很慢,甚至有不能完成下载的情况:  ...

  9. PDCA管理方法论

    PDCA管理方法论 PDCA管理循环,由日本的高管们在1950年日本科学家和工程师联盟研讨班上学到的戴明环改造而成,最先是由休哈特博士提出来的,由戴明把PDCA发扬光大,并且用到质量领域,故称为质量环 ...

  10. [Node.js]操作redis

    摘要 在实际开发中,免不了要操作mysql,mongodb,redis等数据存储服务器.这里先简单介绍如何操作redis. 一个例子 关于redis服务端的安装这里不再介绍,重点不在这里.感兴趣的可以 ...