是否可以將(x; y)座標系轉換爲定義控制點和節點?Python中,如何將由x定義的樣條曲線轉換爲y;將點列表轉換爲NURB曲線
其主要思想是我試圖開發一個用於空氣風力發電機的python建模工具,並且我想用數學方法將葉片模型化爲曲面,但是定義葉片橫截面的曲線被標準化爲(x; y)座標文件。
現在我已將所有(x; y)點定義爲2D Numpy數組。
是否可以將(x; y)座標系轉換爲定義控制點和節點?Python中,如何將由x定義的樣條曲線轉換爲y;將點列表轉換爲NURB曲線
其主要思想是我試圖開發一個用於空氣風力發電機的python建模工具,並且我想用數學方法將葉片模型化爲曲面,但是定義葉片橫截面的曲線被標準化爲(x; y)座標文件。
現在我已將所有(x; y)點定義爲2D Numpy數組。
您是否確定需要NURBS曲面?據我所知, 它們比b樣條表面的主要優點是它們可以精確地模擬圓弧。我已經使用了多年的翼型,弧線不是 對我來說特別有用。
反正romeric是正確的,他說有什麼類似於scipy.interpolate.splprep
的表面。 但如果你不反對滾動您自己,您可以從形狀(3,M,N),其中「M」爲每節點數的你部分的數據創建一個三維陣列 ,「N」是 部分的數量,第一個維度保存mxn網格上的x,y和z值。 一旦你有,你可以使用scipy.interpolate.RectBivariateSpline
來爲X,Y和Z座標 3個獨立的2D參數曲面。然後編寫一個類 一個類,將它們組合到3D空間中的單個2D表面中,以便當您調用 mysurf.ev(0.5, 0.2)
時,它會評估嵌入在類中的實例並返回(x,y,z)座標。
我已經發布了一個要求here,可能會讓你開始。要嘗試它,請從命令行運行它,或者執行此操作:
from bsplinesurf import DemoBSplineSurf
srf = DemoBSplineSurf()
srf.plot()
您可以使用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中還涉及更多的例程,請看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]])
或NURBS package。對於愛好者來說,Blender和Salome具有完整的Python API,適用於所有NURBS曲線/曲面族,後者基於OpenCascade。