Python,如何转换由x定义的样条曲线; y将列表转换为NURB曲线

时间:2015-10-20 15:18:51

标签: python numpy nurbs

可以将(x; y)坐标系转换为 NURBS 定义控制点和结吗?

主要思想是我正在尝试在python中开发一个用于空气风力发电机的建模工具,我想要在数学上将刀片建模为 NURBS 曲面,但是定义刀片横向的曲线将节标准化为(x; y)坐标文件。

现在我将所有(x; y)点定义为2D Numpy数组。

2 个答案:

答案 0 :(得分:4)

您可以使用scipy.interpolate

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import splev, splrep

x = np.linspace(0, 10, 10) # x-coordinates
y = np.sin(x) # y-coordinates
tck = splrep(x, y) # get bspline representation given (x,y) values
x2 = np.linspace(0, 10, 200) # new set of values, just to check
y2 = splev(x2, tck) # evaluate the y values of new coordinates on NURBS curve
plt.plot(x, y, 'o', x2, y2) 
plt.show()

enter image description here

元组tck包含你的结矢量和控制点(系数)。在SciPy中还有更多涉及的例程,看看here

请注意,这些仅适用于bspline曲线。据我所知,SciPy中没有等效的表面方法。如果您想使用曲面,根据您的要求,您可以使用igakit

from igakit.cad import ruled, circle
c1 = circle(angle=(0,np.pi/2.))
c2 = circle(radius=2,angle=(0,np.pi/2.))
print "knot vector:", c1.knots
print "control points:", c1.control
srf = ruled(c1,c2)
plt.plot(srf)
plt.show() 

knot vector: (array([ 0.,  0.,  0.,  1.,  1.,  1.]),)
control points: array([[  1.00000000e+00,   0.00000000e+00,   0.00000000e+00, 1.00000000e+00],
   [  7.07106781e-01,   7.07106781e-01,   0.00000000e+00, 7.07106781e-01],
   [  2.22044605e-16,   1.00000000e+00,   0.00000000e+00, 1.00000000e+00]])

enter image description here

NURBS package。对于更高级的东西BlenderSalome,所有NURBS曲线/曲面族都有完整的Python API,后者基于OpenCascade

答案 1 :(得分:2)

您确定需要NURBS曲面吗?据我所知, 它们相对于b样条曲面的主要优点是它们可以精确建模 圆弧。我已经使用翼型工作了很多年,并且弧形不是什么东西 这对我特别有用。

无论如何,当romeric表示没有类似scipy.interpolate.splprep的表面时,romeric是正确的。 但是,如果你不反对自己滚动,你可以创建一个3D数组 从您的截面数据(3,m​​,n),其中' m'是每个部分的分数,' n'是个 部分的数量,第一个维度在m x n网格上保存x,y和z值。 完成后,您可以使用scipy.interpolate.RectBivariateSpline进行创建 x,y和z坐标的3个独立的2D参数曲面。然后写 将这些组合成3D空间中的单个2D表面的类,以便在您调用时 例如mysurf.ev(0.5, 0.2),它评估3 RectBivariateSpline 嵌入在类中的实例并返回(x,y,z)坐标。

我发布了一个可以帮助您入手的要点here。要尝试它,请从命令行运行它,或执行以下操作:

from bsplinesurf import DemoBSplineSurf
srf = DemoBSplineSurf()
srf.plot()