鄭坤,時光志,周毅,牛志剛
(中海油能源發(fā)展股份有限公司 采油服務分公司,天津 300452)
船體型線設計對船舶阻力性能有直接的影響,決定了設計船能否達到航速要求。成功的型線設計的一個必要條件是型線的三向光順。AutoCAD提供了良好的交互式圖形設計工具,但是在船體型線設計時,AutoCAD不能將船體的三向視圖聯(lián)系起來,船體型線光順過程只能對每個視圖逐個修改,不僅繁瑣,而且難以保證三視圖數(shù)據(jù)的統(tǒng)一。為此,考慮采用AutoCAD提供的二次開發(fā)工具ObjectARX,通過型線的非均勻有理B-樣條(NURBS)曲線表達及三次樣條整體光順方法,實現(xiàn)船體型線三向光順程序設計。
NURBS曲線可以用統(tǒng)一的函數(shù)關系式表達直線段、圓弧和自由曲線。對直線段、圓弧及樣條曲線進行拼接,就可以表達各種復雜的船體型線,其中涉及到關于NURBS的反算,升階,節(jié)點插入與刪除,求導,拼接等算法[1-2]。
船體型線較為復雜,可以基于NURBS曲線的優(yōu)良特性,更準確的表達。船體橫剖線對于艏部尾部線型比較復雜的情況,可采用自由曲線、直線段、圓弧等組合的NURBS曲線表達(見圖1a)、b));對于有平行中體,且平行中體處舭部為圓弧的船型,將橫剖線表達為由1/4圓與直線段組合NURBS曲線(見圖1c))。對于有平行中體的船型,半寬水線由首尾圓弧(方尾尾部除外),自由曲線,以及平行中體處的直線段構(gòu)成,見圖2。
圖1 用拼接的NURBS曲線表達橫剖線
圖2 半寬水線的NURBS表達
有些船型的首部輪廓在設計吃水與結(jié)構(gòu)吃水之間為直線段,因而將其首部輪廓由直線和自由曲線拼接組成,見圖3b),方尾船型的尾部輪廓由直線與自由曲線拼接組成,見圖3a)。
圖3 艏艉輪廓線的NURBS表達
將各船體型線統(tǒng)一用NURBS表達以后,在對船體的計算時不用考慮是否間斷或曲線的具體形狀,因而更利于計算機程序?qū)崿F(xiàn)。此外這樣表示的型線更易應用于靜水力、艙容、穩(wěn)性插值曲線等的計算。
ObjectARX提供了函數(shù)setNurbsData(),該函數(shù)的參數(shù)為NURBS的節(jié)點矢量(knots)、控制頂點(control points)、權(quán)值(weights)、節(jié)點數(shù)以及曲線的次數(shù)等[3]。創(chuàng)建AcDbSpline對象,調(diào)用該函數(shù)給實體賦值,并將該AcDbSpline對象添加到AutoCAD的當前數(shù)據(jù)庫中,即可在AutoCAD里創(chuàng)建一條NURBS曲線。程序中定義了樣條類class vacNurbs, 各種算法通過該類實現(xiàn),將該類的節(jié)點矢量,控制頂點,權(quán)值等信息通過setNurbsData()函數(shù)傳遞給AutoCAD,由AutoCAD實現(xiàn)型線的交互式光順。通過ObjectARX提供的函數(shù)getNurbsData()得到AutoCAD中的曲線信息,實現(xiàn)自己定義的樣條與AutoCAD之間的數(shù)據(jù)交換。
三向光順就是要在改變一個視圖的時候,另外兩個視圖自動作相應的變化,即將3個視圖聯(lián)系起來,保持數(shù)據(jù)的統(tǒng)一。首先由ObjectARX的數(shù)據(jù)庫反映者類(AcDbDatabaseReactor)派生出一個新類vacAcDbDatabaseReactor, 重載該類的objectModified()、objectAppended()以及objectEraserd()3個虛函數(shù),用以響應數(shù)據(jù)庫中實體被修改、添加與刪除的消息。在程序初始化階段將該反映者類的一個對象添加到當前數(shù)據(jù)庫中,用于跟蹤用戶對AutoCAD的數(shù)據(jù)庫的各項操作。
以修改橫剖線為例。首先根據(jù)objectModified()的參數(shù)dbObj(被修改實體的ID)判斷是哪條線被修改(假設為ST1,其縱向位置為stPos),給定精度為ESP=1e-6,然后根據(jù)由dbObj對應的曲線(修改后的橫剖線)與原橫剖線各型值點對比,判斷哪些水線處的型值點變化量大于ESP(設為WL0~WL1),則這些水線需要重算。將對應的半寬水線WL0~WL1在stPos處的型值點替換為新的型值,重新反算生成新的半寬水線??v剖線的變化與橫剖線相似。這樣就可以實現(xiàn)在修改橫剖線時,半寬水線與縱剖線的自動變化。
同理,可以實現(xiàn)修改半寬水線時,橫剖線與縱剖線隨修改的自動變化。綜上所述,便可以實現(xiàn)在AutoCAD平臺上船體型線的三向光順。
2.3.1 通過拐點數(shù)及位置判斷型線的光順性
如果船體的型線是光順的,則相應的拐點連線也應該是光順的,所以程序通過vacAcDbDatabaseReactor類的objectModified()函數(shù)在型線修改時計算出新的曲線的拐點所在位置,并繪制到型線圖上,用來實時檢驗修改是否使型線更為光順,見圖4,“”代表拐點位置。
圖4 某LNG運輸船橫剖線拐點示意
2.3.2 通過曲率曲線判斷型線的光順性
曲線的光順與否將直接反應在曲率上,所以可以用曲率來檢驗型線是否真正光順。圖5中上方圖形為型線,下方為該型線的曲率。
圖5 NURBS曲線的曲率
型線整體光順的方法有很多,傳統(tǒng)的能量法和最小二乘法只能保證光順后的曲線比未光順的曲線曲率變化更均勻,而不易實現(xiàn)對曲線型值點位置、導數(shù)以及拐點的數(shù)目與位置的控制。這里在ObjectARX實現(xiàn)AutoCAD交互式三向光順程序的基礎上,引入一種可以控制曲線的型值點、一階導數(shù)、二階導數(shù)的型線光順方法,以提升型線光順效率。
三次力學樣條具有簡潔的表達式,其二階導數(shù)為線性關系式[4]。用三次力學樣條可以很好的描述斜率變化不大的曲線。常規(guī)船型的半寬水線的斜率一般都不會太大,因而可以用三次樣條來描述?;谝陨显颍紫韧ㄟ^船體的半寬水線(NURBS曲線)形成一條三次樣條,對該三次樣條進行光順,最后將得到的三次樣條曲線的型值點作為新的半寬水線的型值點,反算得到光順后的半寬水線(NURBS曲線)的控制頂點,進而實現(xiàn)對半寬水線的光順。
采用單目標非線性約束優(yōu)化的方法對三次樣條做優(yōu)化計算。將曲線的橫坐標作為已知量,以各型值點的縱坐標和一階導數(shù)為自由變量,以能量為目標函數(shù),約束條件分為兩部分,第一部分為固定約束,使得得到的縱坐標與一階導數(shù)值之間滿足三彎矩方程,另一部分為可變約束,用于控制曲線的型值點,一階導數(shù),二階導數(shù)的值。
將三次樣條看成梁,因彎曲而產(chǎn)生的內(nèi)力為
(1)
式中:EI為梁的剛度系數(shù);κ為曲率。
一般認為,梁的彎曲內(nèi)力越小,樣條越光順[5]。但是內(nèi)力最小的時候顯然為1條直線,所以還要考慮因位移而產(chǎn)生的內(nèi)力,即假定梁在每一節(jié)點處的受力與位移都滿足hooker定律,即
(2)
式中:βi為各節(jié)點處剛性系數(shù);Pi為光順前的型值點;Qi為光順后的型值點。
假設三次樣條S(x)滿足
S(xi)=yii=0,1,…,n-1
(3)
將目標函數(shù)定為E=Ein+Edisp,其中自由變量最高次項為2,線性約束,所以程序中采用二次規(guī)劃對曲線進行優(yōu)化,其目標函數(shù)為
s.t.
v=(y0,m0,y1,m1,…,yn-1,mn-1)
(4)
式中:nE與nI分別為等式和不等數(shù)約束個數(shù);yi與mi分別對應各型值點處的縱坐標與一階導數(shù)值。
3.3.1 固定約束
約束矩陣的固定部分即為三次樣條的三彎矩方程組,是n-1個等式約束。三彎矩方程組為
(5)
將式(5)寫成Am=f的形式,把y向量插入到v′向量中對應位置得到v向量,即v=(y0,m0,y1,m1,…,yn-1,mn-1),同時在A陣中插入相應的行與列。然后將等式右邊向量移到等式左邊,將gk用yk,yk+1表示,把gk中yk,yk+1的系數(shù)加到A陣的相應位置,形成約束矩陣R0v=b0,此時b0為零向量(即該約束為等式約束)。該約束矩陣保證生成的曲線為過點(xk,yk),并且在(xk,yk)處導數(shù)為mk。
3.3.2 可變約束
將約束矩陣添加一行,該行除了第2k列為1外全部為0,將向量b的與該約束對應的元素設為Y,并修改等式約束的個數(shù),這樣就可以使樣條通過點(Xk,Y)。
若將該行除了第2k+1列為1外全部為0,將向量b的與該約束對應的元素設為D,并修改等式約束的個數(shù),這樣就可以使樣條在點(Xk,Yk)處導數(shù)為D。
在xk處,二階導數(shù)滿足
(6)
以上為加入等式約束的方法。加入不等式的方法與之類似,但要將大于號改為小于號(兩邊同乘-1)。將生成的約束矩陣交換行,使前nE個為等式約束,后nI個為不等式約束。
3.3.3 初始解的計算
二次規(guī)劃要求初始解可行,因而不可以簡單地將原樣條對應的向量做為初始解。這里通過二階段法求得。
在光順半寬水線時,首先要求輸入期望的拐點位置。端點處要求型值不變,平行中體處要求導數(shù)為零,指定權(quán)值(用于調(diào)整光順后曲線與原曲線的偏離程度)后程序就可以對所選的半寬水線進行光順計算。只要輸入正確的約束條件以及恰當?shù)倪x取權(quán)值,該算法在滿足光順性的前提下可以很好的滿足設計要求。對于多數(shù)的橫剖線,只要將其x與y坐標轉(zhuǎn)置,該算法也適用。圖6、7為2個光順實例。圖中上方為型線,下方為曲率,其中變化緩和的為光順后的型線的曲率。
圖6 曲線中無指定拐點
若將型值點的權(quán)值設為一個相對較小的數(shù),可以得到非常光順的曲線,但是實際中的船體型線并非曲率變化越均勻越好,所以應當綜合考慮,調(diào)整權(quán)值使得曲線在光順后不會與原船體型線相差太大。對于有拐點的曲線,如果要求光順后的曲線在某點處的曲率方向與原方向相反。優(yōu)化的目標為彎曲內(nèi)能與變形內(nèi)能的和最小,此時優(yōu)化的結(jié)果將是使該點處的二階導數(shù)為零。如圖7所示,通過下方的曲率圖可以看出,中間豎線表示的期望拐點位置,曲線右端的曲率與期望的曲率方向相反,光順后的曲線在此處曲率接近于零。如果在約束中指定這些點處的二階導數(shù)的值可以控制曲率線的形狀,但是事先難以估計該點處的二階導數(shù)的值。
圖7 期望的曲率方向與原方向相反
實踐證明,上述方法能夠快速、準確的實現(xiàn)船體型線的三向光順,這不僅可以提高的型線設計的效率,而且可以保證精度要求。實船型線光順的實例見圖8~11,圖中“”代表拐點位置。通過拐點數(shù)及拐點的位置,可以看出曲線的光順程度。
圖8 某LNG運輸船光順前的艏部型線
圖9 某LNG運輸船光順后的艏部型線
圖10 某LNG運輸船光順前的艉部型線
圖11 某LNG運輸船光順后的艉部型線
1)采用拼接NURBS曲線表達船體型線不僅使得計算簡單,易于程序?qū)崿F(xiàn),而且可以較為精確的描述船體型線,有利于對船體做進一步計算。
2)AutoCAD平臺提供了有效的二次開發(fā)方法,通過對AutoCAD二次開發(fā)可以實現(xiàn)船體型線數(shù)據(jù)的三示圖聯(lián)動,并形成基于拐點和曲率曲線的光順性檢驗方法。
3)以三次力學樣條為工具,可以很好的實現(xiàn)對NURBS曲線的光順,提升型線光順效率,解決型線光順繁瑣的調(diào)整問題。