簡體   English   中英

Python,如何將x; y點列表定義的樣條線轉換為NURB曲線

[英]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軟件包 對於更高級的東西, BlenderSalome具有適用於所有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM