Python使用混沌游戏生成Sierpinski三角仅绘制少量点问题求助
问题原因及修复方案
原代码的核心逻辑不符合混沌游戏生成谢尔宾斯基三角的规则,具体错误及修改如下:
错误点
- 没有实现迭代逻辑:混沌游戏要求每次生成的新点作为下一次计算的起始点,原代码全程使用固定的初始x计算,没有更新x的值
- 冗余内层循环:j循环遍历维度是多余操作,单次迭代只需要计算一个二维坐标点
- 数组维度操作错误:反复对res做扩维操作导致数组结构混乱,能提取到的有效坐标极少
- 绘图逻辑不合理:每次生成单个点就调用plt.plot,运行效率低还容易出现渲染问题
修复后代码
import math import numpy as np import random as rand import matplotlib.pyplot as plt # 定义等边三角形三个顶点 t = np.linspace(0, 2 * math.pi, 4) v = np.array([[math.cos(t[0]), math.cos(t[1]), math.cos(t[2])], [math.sin(t[0]), math.sin(t[1]), math.sin(t[2])]]) # 初始化存储所有点的数组,提前分配空间避免反复扩容 n = 10000 points = np.zeros((n, 2)) # 随机初始点 points[0] = np.array([rand.random() - 0.5, rand.random() - 0.5]) for i in range(1, n): # 随机选一个顶点 k = rand.randint(0, 2) # 新点 = 当前点和选中顶点的中点,对应混沌游戏规则 points[i] = (points[i-1] + v[:, k]) / 2 # 一次性绘制所有点 plt.scatter(points[:, 0], points[:, 1], s=0.5, c='b') plt.axis('equal') plt.axis('off') plt.show()
修复说明
- 提前分配了存储所有点的数组,迭代过程中直接更新数组内容,避免维度混乱
- 严格遵循混沌游戏规则:每次用前一个点和随机顶点取中点得到新点,实现正确的迭代逻辑
- 去掉了冗余的内层循环,单次迭代只做一次点计算
- 改用scatter一次性绘制所有点,设置小点尺寸s=0.5,渲染出来的谢尔宾斯基三角更清晰
- 增加了
plt.axis('equal')保证三角不会被拉伸变形,运行代码即可生成完整的10000个点构成的谢尔宾斯基三角分形图案
内容的提问来源于stack exchange,提问作者karlembeast
相关产品推荐
相关产品推荐

