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

简介

谢宾斯基三角形(Sierpinski triangle)是一种分形,由波兰数学家谢宾斯基在1915年提出。它是一种自相似集。

几种生成方法

方法一:去掉中心

  1. 取一个实心的三角形(多数用等边三角形)
  2. 连接三边中点,将它们分成4个小三角形
  3. 将正中间的三角形挖空
  4. 对其余三个小三角形重复操作1

取一个正方形或其它图形开始,用类似的方法,形状也和谢宾斯基三角形相似,例如:

  1. 取一个实心正方形
  2. 将它分成3个“品”字形的小正方形
  3. 将其余部分“挖空”
  4. 重复步骤1

方法二:Chaos Game

  1. 任取平面上三点,画出这三点
  2. 在平面上任取一点P
  3. 画出P与三角形其中任意一个顶点的连线的中点
  4. 重复2

这种方法简单暴力,但又极其优雅。

 1 / 程序名称:谢宾斯基(Sierpinski)三角形,也叫垫片
 2 // 编译环境:Visual C++ 6.0,EasyX 2011惊蛰版
 3 // 最后更新:2010-11-16
 4 //
 5 #include <graphics.h>
 6 #include <conio.h>
 7 #include <time.h>
 8
 9 int main()
10 {
11     srand((unsigned)time(NULL));                        // 设置随机种子
12     POINT P[3] = {{320, 50}, {120, 400}, {520, 400}};    // 设定三角形的三个顶点
13     POINT p = {rand() % 640, rand() % 480};                // 随机产生当前点
14
15     // 初始化图形模式
16     initgraph(640, 480);
17
18     // 绘制三万个点
19     int n;
20     for(int i = 0; i <= 30000; i++)
21     {
22         n = rand() % 3;
23         p.x = (p.x + P[n].x) / 2;
24         p.y = (p.y + P[n].y) / 2;
25         putpixel(p.x, p.y, GREEN);
26     }
27
28     // 按任意键退出
29     getch();
30     closegraph();
31
32         return 0;
33 }

C源代码实现

方法三:L系统

通过曲线逼近谢宾斯基三角(没看懂维基上的生成规则,555)

贴图:

方法四:杨辉三角

将有4·2n(n≥0) 行的杨辉三角中的奇数染成黑色,当n趋于无穷大时,得到的就是谢宾斯基三角形

例如:n=3时

方法五:元胞自动机

也译作细胞自动机,由冯·诺依曼在20世纪50年代,此后史蒂芬·沃尔夫勒姆对元胞自动机理论作了深入的研究。

元胞自动机有很多规则,这里用“规则90”

考虑无限长度的一维格子表,用黑色格子表示1,白色格子表示0,有无限行这样的一维格子表就形成了“只有上界”的二维格子表。

“规则90”:相邻的三个格子决定下一行中间格子的状态,具体规则如下表:

生成的过程:

其实从从杨辉三角来理解这种方法就不难了。

分形

1973年,曼德勃罗(B.B.Mandelbort)首次提出分维分形(fractal)的设想,其原意具有不规则和支离破碎的几何形状。一般是指“一个粗糙或零碎几何形状,可以分成数部分,且每一份(大约)是整体的缩小版”,此性质称为“自相似”。

数值特征

例如:用无限的周长围住了面积为0的区域

例如:在谢宾斯基三角形中,设初始周长为1单位,初始面积为1单位,则有$S_n=/frac{3}{2}^n$,$C_n=/frac{3}{4}^n$。当n趋于无穷大时,周长为∞,面积为0.

维数(豪斯多夫维)

例如:当一个正方形边长变成3倍时,得到9个他组成的、和它相似的正方形,正方形的维数是2,恰好又$log9/log3=2$

又例如:当一个长方体边长变成2倍时,得到8个由它组成、与它相似的长方体,长方体的度数为3,恰好有$log8/log2=3$

而谢宾斯基三角形的边长变成2倍时,得到三个由它组成、与它相似的图形,根据前面的计算方法,它的豪斯多夫维是$log3/log2\approx 1.585$,不再是整数。

结语

学习《离散数学》看到谢宾斯基三角形,发现POJ1942就是有关它的题目。这样有成功的水一题(可还行)。

题目:The Sierpinski Fractal

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4
 5 const int maxm = (1 << 10) + 10;
 6 const int maxn = (1 << 11) + 10;
 7 char ch[maxm][maxn];
 8 int n;
 9
10 inline void draw(int x, int y, int n)
11 {
12     if (n == 1)
13     {
14         ch[x][y] = ‘/‘; ch[x][y + 1] = ‘_‘; ch[x][y + 2] = ‘_‘; ch[x][y + 3] = ‘\\‘;
15         ch[x - 1][y + 1] = ‘/‘; ch[x - 1][y + 2] = ‘\\‘;
16         return;
17     }
18     draw(x, y, n - 1);
19     draw(x, y + (1 << n),n - 1);
20     draw(x - (1 << (n - 1)), y + (1 << (n - 1)), n - 1);
21 }
22
23 void solve()
24 {
25     while (scanf("%d",&n) == 1 && n)
26     {
27         int row = 1 << n, col = 1 << (n + 1);
28         for (int i = 0; i < row; i++)
29             for (int j = 0; j < col; j++)  ch[i][j] = ‘ ‘;
30         draw(1 << n, 0, n);
31         for (int i = 1; i <= row; i++)
32         {
33             int last;
34             for (int j = 0; j < col; j++)  if (ch[i][j] != ‘ ‘)  last = j;
35             for (int j = 0; j <= last; j++)   printf("%c", ch[i][j]);
36             printf("\n");
37         }
38         printf("\n");
39     }
40 }
41
42 int main()
43 {
44     solve();
45
46     return 0;
47 }

AC代码

参考链接:

1、中国大学mooc  刘铎  离散数学

2、https://www.cnblogs.com/ljh2000-jump/p/5883295.html

3、https://www.codebus.cn/yangw/post/sierpinski-triangle

4、维基百科 谢宾斯基三角形

原文地址:https://www.cnblogs.com/lfri/p/10128073.html

时间: 2024-08-23 22:12:20

谢宾斯基三角形的几种生成方法的相关文章

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

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

混沌分形之谢尔宾斯基(Sierpinski)

本文以使用混沌方法生成若干种谢尔宾斯基相关的分形图形. (1)谢尔宾斯基三角形 给三角形的3个顶点,和一个当前点,然后以以下的方式进行迭代处理: a.随机选择三角形的某一个顶点,计算出它与当前点的中点位置: b.将计算出的中点做为当前点,再重新执行操作a 相关代码如下: class SierpinskiTriangle : public FractalEquation { public: SierpinskiTriangle() { m_StartX = 0.0f; m_StartY = 0.0

分形之谢尔宾斯基(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

分形--谢尔宾斯基地毯

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

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

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

兔斯基 经典语录

本文参考与百度兔斯基 兔斯基 经典语录 1. 疼痛使我有活着的感觉. 兔斯基 2.难过的时候,可曾想起过我? 3. 孤单是一种态度. 4. 命运是存在的,只不过有的人不敢去相信,有的人不屑去相信罢了. 5. 压力都是自己给的. 6. 距离并不可怕,可怕的是心越来越远. 7. 很多事情都不是以快乐为目的的,甚至与快乐无关. 8. 据说每个人一生中都能遇到两万个与自己相配得人,我的那两万人又在哪里? 9. 永远不要期望什么,因为你往往什么都得不到. 10. 单身就是一个人在食堂吃馄饨. 兔斯基 11

纯CSS3实现兔斯基简单害羞表情

前言 很不巧前天突然就感冒了,都怪自己吃太多饼干导致上火了.整个人都无精打采.本来想多做几个兔斯基表情的,但身体发热很难受.所以就只完成一个简单点的表情耍一耍. 正文 先看一下这个简单到不能再简单的小表情吧: 这里我就直接分享代码吧: html结构: <div class="tuzki_container"> <div class="tuzki"> <div class="leftear"></div&g

卡辛斯基的警告

1. 1978年5月25日,美国西北大学的工程教授巴克利·克利斯(Buckley Crist),收到了邮政局退回的一个包裹.这个包裹寄往芝加哥大学,但是收件人"查无此人".克利斯教授不记得寄过它,可是发件人却写着自己的名字.他叫来了学校的保安.保安打开了包裹,里面是一颗炸弹,立刻爆炸了.保安身受重伤.此后的18年,这样的案件一再发生.凶手一共寄出了16枚邮件炸弹,共炸死3人,炸伤23人.袭击对象主要是大学的理工科教授,所以凶手被称为"大学炸弹客"(Unabomber