gpt4 book ai didi

python - 使用 SciPy 拟合贝塞尔曲线

转载 作者:太空狗 更新时间:2023-10-29 17:24:14 33 4
gpt4 key购买 nike

我有一组近似于二维曲线的点。我想使用带有 numpy 和 scipy 的 Python 来找到一个近似适合这些点的立方贝塞尔路径,我在其中指定两个端点的确切坐标,并返回其他两个控制点的坐标。

我最初认为 scipy.interpolate.splprep() 可能会做我想做的事,但它似乎迫使曲线通过每个数据点(我想你会想要插值)。我假设我在这方面走错了路。

我的问题与此类似:How can I fit a Bézier curve to a set of data? ,除了他们说他们不想使用 numpy。我的偏好是在 scipy 或 numpy 的某个地方找到我需要的东西。否则,我计划使用 numpy 实现从该问题的答案之一链接的算法:An algorithm for automatically fitting digitized curves (pdf.第 622 页)。

感谢您的任何建议!

编辑:我知道三次贝塞尔曲线不能保证通过所有点;我想要一个通过两个给定端点并尽可能靠近指定内部点的一个。

最佳答案

下面是用 numpy 做贝塞尔曲线的方法:

import numpy as np
from scipy.special import comb

def bernstein_poly(i, n, t):
"""
The Bernstein polynomial of n, i as a function of t
"""

return comb(n, i) * ( t**(n-i) ) * (1 - t)**i


def bezier_curve(points, nTimes=1000):
"""
Given a set of control points, return the
bezier curve defined by the control points.

points should be a list of lists, or list of tuples
such as [ [1,1],
[2,3],
[4,5], ..[Xn, Yn] ]
nTimes is the number of time steps, defaults to 1000

See http://processingjs.nihongoresources.com/bezierinfo/
"""

nPoints = len(points)
xPoints = np.array([p[0] for p in points])
yPoints = np.array([p[1] for p in points])

t = np.linspace(0.0, 1.0, nTimes)

polynomial_array = np.array([ bernstein_poly(i, nPoints-1, t) for i in range(0, nPoints) ])

xvals = np.dot(xPoints, polynomial_array)
yvals = np.dot(yPoints, polynomial_array)

return xvals, yvals


if __name__ == "__main__":
from matplotlib import pyplot as plt

nPoints = 4
points = np.random.rand(nPoints,2)*200
xpoints = [p[0] for p in points]
ypoints = [p[1] for p in points]

xvals, yvals = bezier_curve(points, nTimes=1000)
plt.plot(xvals, yvals)
plt.plot(xpoints, ypoints, "ro")
for nr in range(len(points)):
plt.text(points[nr][0], points[nr][1], nr)

plt.show()

关于python - 使用 SciPy 拟合贝塞尔曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12643079/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com