写在前面
最近听了樊登老师讲的《深奥的简洁》这本书,里面讲了一个画Sierpinski三角形的方法,这个方法我大概分了三步:
第一步:平面上任意画一个三角形,令这个三角形的三个点分别是点1,点2,点3。
第二部:在平面上再找一个点,令其为点0。
第三步:在数字1,2,3中随机抽一个数字,假如第一次抽到1(或2或3),则取三角形的点1(或点2或点3)和点0的中心点,令这个中心点为点c,然后再在数字1,2,3中随机抽一个数字,假如这一次抽到2(或1或3),则取三角形的点2(或点1或点3)和点c的中心点,再令这个中心点为新的点c。然后将随机抽数→取中心点→令中心点为新的点c→随机抽数→…这一步重复无限多次后,会出现Sierpinski三角形。
我感觉很神奇,就用python模拟了一遍,想着能画出来就画出来,画不出来也无所谓。没想到真的画出来了。
代码
#encoding=utf-8
import random
import matplotlib.pyplot as plt
import numpy as np
'''
spot_1, spot_2, spot_3是三个点的坐标,它们构成一个三角形
zeroSpot是平面上再找的一个点的坐标
'''
spot_1 = (0, 0)
spot_2 = (80, 0)
spot_3 = (50, 50)
zeroSpot = (20, 20)
# 这个方法是输入两个点,返回这两个点的中心点的坐标
def centerSpot(spotOne, spotTwo):
x = (spotOne[0] + spotTwo[0]) / 2
y = (spotOne[1] + spotTwo[1]) / 2
return (x, y)
# 初始化现有点的x轴坐标
# 初始化现有点的y轴坐标
x_label = [spot_1[0], spot_2[0], spot_3[0], zeroSpot[0]]
y_label = [spot_1[1], spot_2[1], spot_3[1], zeroSpot[1]]
cspot = zeroSpot
# 将随机抽数→取中心点→令中心点为新的点c→随机抽数→......这一步重复10000次
for i in range(10000):
ran = random.choice([1, 2, 3])
if ran == 1:
cspot = centerSpot(spot_1, cspot)
elif ran == 2:
cspot = centerSpot(spot_2, cspot)
else:
cspot = centerSpot(spot_3, cspot)
x_label.append(cspot[0])
y_label.append(cspot[1])
x_label = np.array(x_label)
y_label = np.array(y_label)
# 绘图
plt.plot(x_label, y_label, '.', linewidth='1')
plt.show()