平滑的 2d 布朗行走与贝塞尔曲线
Smooth 2d brownian walk with Bezier curve
我想生成一个由贝塞尔曲线抑制的 Brownina 运动。
我对第一部分没问题:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
def brownian(steps):
r = norm.rvs(size=(2,) + (steps,))
out = np.empty((2,steps))
np.cumsum(r, axis=-1, out=out)
out += np.expand_dims([0,0], axis=-1)
return out[0], out[1]
x, y = brownian(30)
plt.plot(x, y)
但是如何使用贝塞尔曲线平滑该路径?
我不确定您是否真的想使用贝塞尔曲线,因为贝塞尔曲线不会通过它们的所有点(请参阅 Wikipedia explanation - even in a quadratic curve we don't go through the middle point which is just a "guide"). See more information here。
然而,您可以使用一些数学来创建一条贝塞尔曲线,该曲线可以平滑地移动通过您的所有点。为此,您需要一些 math to figure out where to place the "guides", and then you can draw the actual bezier curve using the bezier drawing code in matplotlib.
如果您只接受任何平滑插值而不仅仅是贝塞尔曲线,那么 scipy already has some code to do that。
您可以使用 Catmull-Rom 样条曲线创建多条三次贝塞尔曲线,这些曲线将在您的步行路径中插入顶点,这些贝塞尔曲线将平滑地连接在一起。详情请参考此link
我想生成一个由贝塞尔曲线抑制的 Brownina 运动。 我对第一部分没问题:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
def brownian(steps):
r = norm.rvs(size=(2,) + (steps,))
out = np.empty((2,steps))
np.cumsum(r, axis=-1, out=out)
out += np.expand_dims([0,0], axis=-1)
return out[0], out[1]
x, y = brownian(30)
plt.plot(x, y)
但是如何使用贝塞尔曲线平滑该路径?
我不确定您是否真的想使用贝塞尔曲线,因为贝塞尔曲线不会通过它们的所有点(请参阅 Wikipedia explanation - even in a quadratic curve we don't go through the middle point which is just a "guide"). See more information here。
然而,您可以使用一些数学来创建一条贝塞尔曲线,该曲线可以平滑地移动通过您的所有点。为此,您需要一些 math to figure out where to place the "guides", and then you can draw the actual bezier curve using the bezier drawing code in matplotlib.
如果您只接受任何平滑插值而不仅仅是贝塞尔曲线,那么 scipy already has some code to do that。
您可以使用 Catmull-Rom 样条曲线创建多条三次贝塞尔曲线,这些曲线将在您的步行路径中插入顶点,这些贝塞尔曲线将平滑地连接在一起。详情请参考此link