首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python,如何将x;y点列表定义的样条转换为NURB曲线

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

Stack Overflow用户
提问于 2015-10-20 15:18:51
回答 2查看 3.5K关注 0票数 2

是否可以将(x;y)坐标系统转换为NURBS定义控制点和节点?

主要的想法是,我试图在python中开发一个用于空气风力发电机的建模工具,我希望将叶片建模为一个NURBS曲面,但是定义叶片横截面的曲线被归一化为(x;y)坐标文件。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-30 12:24:18

你确定你需要NURBS曲面吗?据我所知,与b样条曲面相比,它们的主要优点是能够精确地模拟圆弧。多年来,我一直在研究翼型,而弧形飞机对我来说并不是什么特别有用的东西。

无论如何,romeric是正确的,当他说,没有类似于scipy.interpolate.splprep的表面。但是,如果你不反对滚动你自己的,你可以创建一个三维数组从你的剖面数据(3,m,n),其中'm‘是每个区段的点数,'n’是分段的数目,第一个维度包含x,y和z值在own网格上。一旦有了它,就可以使用scipy.interpolate.RectBivariateSpline为x、y和z坐标创建3个独立的2D参数曲面。然后编写一个类,将它们组合成一个3D空间中的2D曲面,以便当您调用mysurf.ev(0.5, 0.2)时,它计算嵌入在类中的3个RectBivariateSpline实例,并返回一个(x,y,z)坐标。

我已经发布了一个Gist 这里,可能会让你开始。要尝试它,可以从命令行运行它,或者执行以下操作:

代码语言:javascript
复制
from bsplinesurf import DemoBSplineSurf
srf = DemoBSplineSurf()
srf.plot()
票数 2
EN

Stack Overflow用户

发布于 2015-10-20 17:50:55

为此您可以使用scipy.interpolate

代码语言:javascript
复制
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()

元组tck包含节点向量和控制点(系数)。在SciPy中还有更多涉及到的例程,请看这里

请注意,这些只适用于b样条曲线。据我所知,对于SciPy中的曲面,没有等效的方法。如果您想使用曲面,这取决于您的需求,您可以使用伊格利特

代码语言:javascript
复制
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]])

或者NURBS软件包搅拌机萨洛姆对于所有NURBS曲线/曲面族都有完整的Python,后者基于OpenCascade

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33240475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档