我已经在数据点xp和yp上创建了一个开放、夹紧、立方B样条。
样条是由跨越xp域的向量u参数化的。
我的目标是确定在xp域中给定“x”坐标处的B样条的“y”坐标。
当我在计算tck之后将值“4”传递给splev时,与参数4对应的x和y坐标的值都会返回,这是生成参数曲线时预期的行为。
我能够使用牛顿法确定给定“x”坐标的参数u的值;然而,这是间接的,并且需要比我的最终应用程序允许的更多的计算时间。
有人能建议一种更直接的方法来确定给定“x”的B样条上的“y”坐标吗?
下面的图像显示了指导多边形和由上述代码生成的B样条曲线。在x=4处的橙色点对应于我希望直接确定B样条曲线上y值的点。黑色点是将4作为参数传递时B样条曲线的值。
样条是由跨越xp域的向量u参数化的。
我的目标是确定在xp域中给定“x”坐标处的B样条的“y”坐标。
当我在计算tck之后将值“4”传递给splev时,与参数4对应的x和y坐标的值都会返回,这是生成参数曲线时预期的行为。
我能够使用牛顿法确定给定“x”坐标的参数u的值;然而,这是间接的,并且需要比我的最终应用程序允许的更多的计算时间。
有人能建议一种更直接的方法来确定给定“x”的B样条上的“y”坐标吗?
import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate
xp = [0., 0.71428571, 1.42857143, 2.14285714, 2.85714286, 3.57142857, 4.28571429, 5.]
yp = [0., -0.86217009, -2.4457478, -2.19354839, -2.32844575, -0.48680352, -0.41055718, -3.]
length = len(xp)
t = np.linspace(0., xp[-1], length - 2, endpoint=True)
t = np.append([0, 0, 0], t)
t = np.append(t, [xp[-1], xp[-1], xp[-1]])
tck = [t, [xp, yp], 3]
u = np.linspace(0, 5., 1000, endpoint=True)
out = interpolate.splev(u, tck)
x_value_in_xp_domain = 4.
y_value_out = interpolate.splev(x_value_in_xp_domain, tck)
plt.plot(xp, yp, linestyle='--', marker='o', color='purple')
plt.plot(out[0], out[1], color = 'teal')
plt.plot(x_value_in_xp_domain, y_value_out[1], marker='o', color = 'orangered')
plt.plot(y_value_out[0], y_value_out[1], marker='o', color = 'black')
plt.axvline(x=x_value_in_xp_domain, color = 'orangered')
plt.show()
下面的图像显示了指导多边形和由上述代码生成的B样条曲线。在x=4处的橙色点对应于我希望直接确定B样条曲线上y值的点。黑色点是将4作为参数传递时B样条曲线的值。
提供一些有用的参考资料:
https://github.com/kawache/Python-B-spline-examples
https://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/B-spline/bspline-curve.html
http://web.mit.edu/hyperbook/Patrikalakis-Maekawa-Cho/node17.html