使用 Chaos Game 的 Sierpinski Triangle - 不正确的情节(缺失点)

Sierpinksi Triangle using Chaos Game - Incorrect Plot (missing points)

我正在尝试使用 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()

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

The computations of the points to plot seem correct.

不完全是。您的代码存在多个问题。有些是实际的错误,尽管很容易犯。例如,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()