[英]Python. How to get the x,y coordinates of a offset spline from a x,y list of points and offset distance
[英]Python, how to convert spline defined by x;y list of point into NURB curve
是否可以將(x; y)坐標系轉換為NURBS定義控制點和結?
主要思想是我正在嘗試使用python開發用於風力發電機的建模工具,並且我想在數學上將葉片建模為NURBS曲面,但是將定義葉片橫向截面的曲線歸一化為(x; y)坐標文件。
現在,我將所有(x; y)點定義為2D Numpy數組。
您可以為此使用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()
元組tck
包含您的結向量和控制點(系數)。 SciPy中還有更多涉及的例程,請看這里 。
請注意,這些僅適用於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]])
或NURBS軟件包 。 對於更高級的東西, Blender和Salome具有適用於所有NURBS曲線/曲面系列的完整Python API,后者基於OpenCascade 。
確定要使用NURBS曲面嗎? 據我所知,它們相對於b樣條曲面的主要優勢在於它們可以精確地建模圓弧。 我使用機翼已有很多年了,弧線對我來說並不是特別有用。
無論如何,當scipy.interpolate.splprep
表面沒有與scipy.interpolate.splprep
類似的東西時,他是正確的。 但是,如果您不反對自己滾動,則可以根據形狀為(3,m,n)的截面數據創建3D數組,其中'm'是每個截面的點數,'n'是截面,第一個維度在mxn網格上保存x,y和z值。 一旦有了這些,就可以使用scipy.interpolate.RectBivariateSpline
為x,y和z坐標創建3個單獨的2D參數化曲面。 然后編寫一個類,將它們組合成3D空間中的單個2D曲面,這樣,例如,當您調用mysurf.ev(0.5, 0.2)
,它將評估類中嵌入的3個RectBivariateSpline
實例並返回(x,y, z)坐標。
我在這里發布了要點,可能會讓您入門。 若要嘗試,請從命令行運行它,或執行以下操作:
from bsplinesurf import DemoBSplineSurf
srf = DemoBSplineSurf()
srf.plot()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.