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