0

我正在尝试使用 Chaos 游戏在 Python 中生成一个 Spierpinki 三角形。要绘制的点的计算似乎是正确的,但不是绘制了数千个点,而是仅绘制了 10 个左右。

import math
import numpy as np
import random as rand
import matplotlib.pyplot as plt

# Defining vertices
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])]])

# Defining Starting point
T = np.array([[0.5, 0], [0, 0.5]])
x = np.array([rand.random() - 0.5, rand.random() - 0.5]).reshape(2, 1)

res = np.zeros((2, 1))
n = 10000
for i in range(n):
    for j in range(2):
        k = rand.randint(0, 2)
        res = np.expand_dims(res, axis=0)
        res = np.multiply(T, np.subtract(x[j], v[:, k])) + v[:, k]
        xx = [x for (x, y) in res]
        yy = [y for (x, y) in res]
        plt.plot(xx, yy, 'b.')

plt.show()

谢尔平克西三角图

4

1 回答 1

2

首先,欢迎来到 SO。你的问题很好解释。您的代码是独立的。多么棒的第一个问题。

要绘制的点的计算似乎是正确的。

不完全的。您的代码存在多个问题。有些是实际的错误,尽管很容易犯。例如,rand.randint(0,2)在区间 [0, 2) 上为您提供一个随机整数。请注意,您永远无法以这种方式获得 2,并且您的第三个顶点永远不会被选中。

更大的问题是代码的复杂性。一个内部循环j不会改变任何东西。矩阵乘法以彼此减去 2 个点。等等。它变得如此复杂,以至于您永远不会注意到x/res永远不会更新,以至于您一遍又一遍地绘制相同的点。你应该努力更简单地表达想法。优雅的数学符号可以作为代码的起点,但很少是终点。

这是您的代码的简化版本。

import numpy as np
import matplotlib.pyplot as plt

# Defining vertices
t = np.linspace(0, (2 * np.pi), 4)
v = np.array([[np.cos(t[0]), np.cos(t[1]), np.cos(t[2])],
              [np.sin(t[0]), np.sin(t[1]), np.sin(t[2])]])

# Defining Starting point
x = np.array([0., 0.])

# Loop
for k in np.random.randint(3, size=1000):
    x += 0.5 * (v[:, k] - x)
    plt.plot(x[0], x[1], 'b.')

plt.show()

在此处输入图像描述

于 2021-11-22T18:49:02.950 回答