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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:54:05