gpt4 book ai didi

python - Python 样条曲线(使用控制节点和端点)

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

我正在尝试做类似下面的事情(从维基百科中提取的图像)

spline

#!/usr/bin/env python
from scipy import interpolate
import numpy as np
import matplotlib.pyplot as plt

# sampling
x = np.linspace(0, 10, 10)
y = np.sin(x)

# spline trough all the sampled points
tck = interpolate.splrep(x, y)
x2 = np.linspace(0, 10, 200)
y2 = interpolate.splev(x2, tck)

# spline with all the middle points as knots (not working yet)
# knots = x[1:-1] # it should be something like this
knots = np.array([x[1]]) # not working with above line and just seeing what this line does
weights = np.concatenate(([1],np.ones(x.shape[0]-2)*.01,[1]))
tck = interpolate.splrep(x, y, t=knots, w=weights)
x3 = np.linspace(0, 10, 200)
y3 = interpolate.splev(x2, tck)

# plot
plt.plot(x, y, 'go', x2, y2, 'b', x3, y3,'r')
plt.show()

代码的第一部分是从the main reference中提取的代码但没有解释如何使用这些点作为控制结。

这段代码的结果是下图。

enter image description here

点是样本,蓝线是考虑了所有点的样条。红线是对我不起作用的那条。我试图将所有中间点作为控制节点考虑在内,但我做不到。如果我尝试使用 knots=x[1:-1] 它就是行不通的。如果有任何帮助,我将不胜感激。

简而言之问题:如何将所有中间点用作样条函数中的控制结?

注意:最后一张图片正是我所需要的,它是我所拥有的(样条曲线通过所有点)和我所需要的(带控制结的样条曲线)之间的区别。有任何想法吗? enter image description here

最佳答案

如果你想要评估一个bspline ,您需要为样条找出合适的节点向量,然后手动重建 tck 以满足您的需求。

tck 代表节点t + 系数c + 曲线度数ksplrep 计算通过给定控制点的三次曲线的 tck。所以你不能用它来做你想做的事。

下面的函数将向您展示我对 a similar question I asked some time ago. 的解决方案,根据您的需要进行调整。

有趣的事实:代码适用于任何维度的曲线(1D、2D、3D、...、nD)

import numpy as np
import scipy.interpolate as si


def bspline(cv, n=100, degree=3):
""" Calculate n samples on a bspline

cv : Array ov control vertices
n : Number of samples to return
degree: Curve degree
"""
cv = np.asarray(cv)
count = cv.shape[0]

# Prevent degree from exceeding count-1, otherwise splev will crash
degree = np.clip(degree,1,count-1)

# Calculate knot vector
kv = np.array([0]*degree + list(range(count-degree+1)) + [count-degree]*degree,dtype='int')

# Calculate query range
u = np.linspace(0,(count-degree),n)

# Calculate result
return np.array(si.splev(u, (kv,cv.T,degree))).T

测试它:

import matplotlib.pyplot as plt
colors = ('b', 'g', 'r', 'c', 'm', 'y', 'k')

cv = np.array([[ 50., 25.],
[ 59., 12.],
[ 50., 10.],
[ 57., 2.],
[ 40., 4.],
[ 40., 14.]])

plt.plot(cv[:,0],cv[:,1], 'o-', label='Control Points')

for d in range(1,5):
p = bspline(cv,n=100,degree=d)
x,y = p.T
plt.plot(x,y,'k-',label='Degree %s'%d,color=colors[d%len(colors)])

plt.minorticks_on()
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.xlim(35, 70)
plt.ylim(0, 30)
plt.gca().set_aspect('equal', adjustable='box')
plt.show()

结果:

An opened spline of various degrees

关于python - Python 样条曲线(使用控制节点和端点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28279060/

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