在
这个问题
我向社区询问了
scipy.interpolate.splev
如何计算样条线基础。我的目标是通过预先计算a
splev
来更快地计算样条线
bspline basis
并通过执行以下操作来生成曲线
basis
到
control point
点积。
从那时起
一个新的
scipy.interpolate.BSpline
插值器
被添加到
scipy
它带有
basis_element
功能
,我认为它可以用于返回用于计算样条线的基础。
因此,例如使用代码 来自此处 并输入以下输入:
import numpy as np
# Control points
cv = np.array([[ 50., 25., 0.],
[ 59., 12., 0.],
[ 50., 10., 0.],
[ 57., 2., 0.],
[ 40., 4., 0.],
[ 40., 14., 0.]])
kv = [0, 0, 0, 0, 1, 2, 3, 3, 3, 3] # knot vector
n = 10 # 10 samples (keeping it simple)
degree = 3 # Curve degree
我可以计算以下 bspline 基础:| ||使用
[[ 1. 0. 0. 0. 0. 0. ]
[ 0.2962963 0.56481481 0.13271605 0.00617284 0. 0. ]
[ 0.03703704 0.51851852 0.39506173 0.04938272 0. 0. ]
[ 0. 0.25 0.58333333 0.16666667 0. 0. ]
[ 0. 0.07407407 0.54938272 0.36728395 0.00925926 0. ]
[ 0. 0.00925926 0.36728395 0.54938272 0.07407407 0. ]
[ 0. 0. 0.16666667 0.58333333 0.25 0. ]
[ 0. 0. 0.04938272 0.39506173 0.51851852 0.03703704]
[ 0. 0. 0.00617284 0.13271605 0.56481481 0.2962963 ]
[ 0. 0. 0. 0. 0. 1. ]]
与
np.dot
和
basis
在曲线上返回10个样本:
control points
问题
[[ 50. 25. 0. ]
[ 55.12654321 15.52469136 0. ]
[ 55.01234568 11.19753086 0. ]
[ 53.41666667 9.16666667 0. ]
[ 53.14506173 7.15432099 0. ]
[ 53.1882716 5.17901235 0. ]
[ 51.58333333 3.83333333 0. ]
[ 47.20987654 3.87654321 0. ]
[ 42.31790123 6.7345679 0. ]
[ 40. 14. 0. ]]
:是否可以从
中提取如上所述的基础?
scipy.interpolate.BSpline
显然我必须使用错误,因为当我尝试时我得到这样的东西:
Obviously I must be using it wrong, because when I try I get something like this:
from scipy.interpolate import BSpline
b = BSpline.basis_element(kv)
print b(np.linspace(kv[0],kv[-1],n)) # i'm not sure what these values represent
[ 0. 0.00256299 0.04495618 0.16555213 0.28691315 0.28691315
0.16555213 0.04495618 0.00256299 0. ]
你几乎就在那里了,但你需要做一些事情来获得你想要的结果:
-
分别计算每个基函数。
BSpline.basis_element
函数创建了一个 单一 基函数,你需要为你的样条曲线计算所有基函数。 -
在样条曲线域上评估每个基函数。
BSpline.basis_element(knots)(x)
返回在x
处计算的单个基函数,你需要在你的所有样本点上对其进行计算以获得完整的基矩阵。
以下是实现方法:
import numpy as np
from scipy.interpolate import BSpline
# 控制点
cv = np.array([[ 50., 25., 0.],
[ 59., 12., 0.],
[ 50., 10., 0.],
[ 57., 2., 0.],
[ 40., 4., 0.],
[ 40., 14., 0.]])
kv = [0, 0, 0, 0, 1, 2, 3, 3, 3, 3] # 节点向量
n = 10 # 10 个样本(保持简单)
degree = 3 # 曲线阶数
# 创建 B 样条基
spline_basis = [BSpline.basis_element(kv[i:i+degree+2])
for i in range(len(kv)-degree-1)]
# 在样本点上评估基函数
x = np.linspace(kv[0], kv[-1], n)
basis_matrix = np.array([basis(x) for basis in spline_basis]).T
print(basis_matrix)
这将打印出你之前计算的相同的基矩阵。然后,你可以使用此基矩阵和控制点来计算样条曲线:
# 计算样条曲线点
spline_points = np.dot(basis_matrix, cv)
print(spline_points)
这将打印出与以前相同的样条曲线点。
简而言之,你需要为你的样条曲线创建每个基函数,在你的样本点上对其进行评估,并将结果排列成矩阵。希望这会有所帮助!
标签:python,numpy,scipy From: 45927965