You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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的上限)
  • 按照混沌游戏规则生成点集:

    1. 随机选一个初始点(直接用任意顶点即可)
    2. 每次随机挑选一个顶点,移动到当前点与该顶点的中点
    3. 重复迭代足够多次,收集所有生成的点

完整实现代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:20:32