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