python利用《深奥的简洁》一书中的方法画Sierpinski三角形

写在前面

最近听了樊登老师讲的《深奥的简洁》这本书,里面讲了一个画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()

结果

python利用《深奥的简洁》一书中的方法画Sierpinski三角形_第1张图片

你可能感兴趣的:(应用,python)