如何在Matplotlib绘制的三角形内排布点以实现谢尔宾斯基三角形?
实现谢尔宾斯基三角形的点集生成问题
现有代码
import matplotlib.pyplot as plt import numpy as np plt.style.use('_mpl-gallery') fig, ax = plt.subplots() y = np.arange(0,10,.01) x1 = y / np.sqrt(3) x2 = (y - (5 * np.sqrt(3))) / (-np.sqrt(3)) plt.xlim(0,5) plt.ylim(0,5) poly = ax.fill_betweenx(y,x1,x2,where= y <= 2.5*np.sqrt(3)) plt.show(plot)
问题描述
我已经成功画出了三角形,现在想在这个三角形内部生成点集,复现Numberphile频道《混沌游戏》视频里的谢尔宾斯基三角形。我需要创建一个能绘制在已知顶点三角形上的点数组,但不确定当前方法是否正确、高效。
之前尝试参考PolyCollection文档,但碰到了属性使用错误、函数调用错误的问题。刚接触Python,搞不懂get_closed()、get_path()这些函数的前置使用逻辑。
解决方案
不用纠结PolyCollection的复杂方法,混沌游戏的核心逻辑非常直接,基于三角形顶点迭代生成点即可,步骤如下:
先明确你绘制的等边三角形三个顶点坐标:
- A(0, 0)
- B(5, 0)
- C(2.5, 2.5×√3)(对应你代码中y的上限)
按照混沌游戏规则生成点集:
- 随机选一个初始点(直接用任意顶点即可)
- 每次随机挑选一个顶点,移动到当前点与该顶点的中点
- 重复迭代足够多次,收集所有生成的点
完整实现代码
import matplotlib.pyplot as plt import numpy as np # 定义三角形的三个顶点 vertices = np.array([ [0, 0], # 顶点A [5, 0], # 顶点B [2.5, 2.5*np.sqrt(3)] # 顶点C ]) # 设置生成点的数量,越多图形越清晰 num_points = 100000 points = np.zeros((num_points, 2)) # 初始化第一个点(随机选一个顶点) points[0] = vertices[np.random.randint(0, 3)] # 迭代生成所有点 for i in range(1, num_points): # 随机选一个顶点 chosen_vertex = vertices[np.random.randint(0, 3)] # 计算当前点与选中顶点的中点,作为下一个点 points[i] = (points[i-1] + chosen_vertex) / 2 # 绘制谢尔宾斯基三角形 plt.style.use('_mpl-gallery') fig, ax = plt.subplots(figsize=(6, 6)) # 用散点图绘制点,设置点大小为0.1避免重叠 ax.scatter(points[:, 0], points[:, 1], s=0.1, color='black') # 调整坐标轴范围,完整显示三角形 ax.set_xlim(-0.5, 5.5) ax.set_ylim(-0.5, 2.5*np.sqrt(3)+0.5) # 关闭坐标轴刻度,优化视觉效果 ax.set_xticks([]) ax.set_yticks([]) plt.show()
说明
这种方法完全不需要操作多边形路径相关的函数,逻辑简单易懂,而且计算效率极高——生成十万级别的点也能快速完成,完美匹配混沌游戏的实现需求。
内容的提问来源于stack exchange,提问作者NumpyNumber1Fan
相关产品推荐
相关产品推荐

