[分形学] 谢宾斯基 (Sierpinski) 三角形,也叫垫片
作者:yangw80

新版地址:http://codebus.easyx.cn/yw80/post/sierpinski-triangle

先说一个程序的实现过程:

  1. 随机生成 3 个点 P[0]、P[1]、P[2];
  2. 随机生成 1 个点 P;
  3. 绘制点 P;
  4. 随机生成 [0, 2] 内的整数 n;
  5. 令 P = P 与 P[n] 的中点;
  6. 重复执行步骤 (3)~(5) 三万次。

这个程序很简单,虽然随机性很大,但是结果几乎是完全相似的,会是一个很有趣的图案,也就是传说中的谢宾斯基三角形。以上步骤就是生成谢宾斯基三角形的随机迭代法。

程序代码如下:
  注:为了效果,将步骤(1)的三个点手动指定了。喜欢的话,可以将其修改为随机产生。

// 程序名称:谢宾斯基(Sierpinski)三角形,也叫垫片
// 编译环境:Visual C++ 6.0,EasyX 2011惊蛰版
// 最后更新:2010-11-16
//
#include <graphics.h>
#include <conio.h>
#include <time.h>

void main()
{
	srand((unsigned)time(NULL));						// 设置随机种子
	POINT P[3] = {{320, 50}, {120, 400}, {520, 400}};	// 设定三角形的三个顶点
	POINT p = {rand() % 640, rand() % 480};				// 随机产生当前点

	// 初始化图形模式
	initgraph(640, 480);

	// 绘制三万个点
	int n;
	for(int i = 0; i <= 30000; i++)
	{
		n = rand() % 3;
		p.x = (p.x + P[n].x) / 2;
		p.y = (p.y + P[n].y) / 2;
		putpixel(p.x, p.y, GREEN);
	}

	// 按任意键退出
	getch();
	closegraph();
}

 

执行效果要贴图就没意思了,呵呵。先猜想一下会是什么图案?

更新时间:2010/11/16