第五十三章 比例切割 算法初成
陳東風(fēng)和李爺爺從董明竹家回來后已經(jīng)快10點了。
進(jìn)屋后,李爺爺對他說:“這段時間你嬸嬸不容易,她的事情你要多幫幫她?!?p> “當(dāng)然,我是他侄子,不幫他幫誰?爺爺你放心。”陳東風(fēng)肯定的說。
“那就好,你也知道,這次你文山叔叔去RB治病花了不少錢,光靠兩個人在單位里的幾十塊工資是不夠的。她想經(jīng)商的想法很好,我很支持她?!?p> “現(xiàn)在的萬元戶,哪個不是做小生意的?嬸嬸只要敢闖,現(xiàn)在的華國是遍地黃金?!标悥|風(fēng)對董明竹和李文山以后從商也是很看好的。
“那就好,我老了,不過還是可以為她跑跑關(guān)系的。好了,你去洗漱吧,早點休息?!?p> 陳東風(fēng)現(xiàn)在哪里還能輕易睡得這么早,好不容易抓住靈感的尾巴,說什么也不能把他丟了。
其實陳東風(fēng)在航模的設(shè)計階段,不怕各種數(shù)學(xué)模型和理論計算。他最討厭的是各種葉輪的工程設(shè)計圖紙的繪制。
工程中表達(dá)葉輪表面的方法是投影圖法,通常情況下使用的圓柱坐標(biāo)系中的投影方法是旋轉(zhuǎn)投影以及軸面投影、平面投影。葉輪的軸面投影圖反映了葉輪的總體尺寸和特征,而平面投影相當(dāng)于三視圖里面的俯視圖。需要葉片表面方程:Θ=(r,z)來一步步畫出空間曲線。就算你畫的再好,到了加工現(xiàn)場加工的時候也是晦澀難懂,需要專門的技術(shù)人員分析出一步步的運(yùn)動指令,效率十分低下。
陳東風(fēng)看到了貝塞爾曲線是光滑離散化成一段段的微小的直線段的實質(zhì),如果可以根據(jù)貝塞爾曲線的特征方程,設(shè)計出一套切實可行的算法——把各種曲率的曲線通過命令來生成,那么既可以簡化設(shè)計中制圖的復(fù)雜程度,也可以根據(jù)曲線各個離散化的坐標(biāo)點反推出數(shù)控加工的路徑。所以如果陳東風(fēng)可以設(shè)計的出來那將是一舉兩得的。
70年代現(xiàn)在國際上的流行算法是(以一次方貝塞爾曲線為例)需要在兩個定點A、B之間,在選定特定u的情況下在曲線上找到點C(u)。一個簡單的方法是把u插到每一個基函數(shù)上,計算每個其與基函數(shù)的乘積以及其相應(yīng)的控制頂點,最后將其相加。
雖然這種方法很好,但是缺乏數(shù)值穩(wěn)定性,尤其是在計算伯恩斯坦多項式的時候可能引進(jìn)數(shù)值誤差。當(dāng)然算法都是各個CAD軟件的核心,是不會輕易示人的。
還有就是一款好的CAD軟件不管是算法重要,它的控制核心也是非常重要,當(dāng)然現(xiàn)在陳東風(fēng)也沒考慮到這些,只是想先把算法設(shè)計出來。
陳東風(fēng)也是發(fā)了狠,不設(shè)計出這個算法,連門都懶的出了,過年前的衛(wèi)生也忘記打掃了。好在李爺爺看他鉆研辛虧,毫不計較,盡心盡力的為他做好了后勤工作。
終于,陳東風(fēng)在大年三十前把這套他自己命名的比例切割算法給設(shè)計出來了。靈感來自于華國歷史上著名的數(shù)學(xué)家祖沖之的割圓術(shù),割圓術(shù)目的是等分圓之后取得正多邊形,而他的比例切割是取一個特定的比例來逼近一個特殊的曲線。
簡單來講比例切割算法(以一次貝塞爾曲線為例)的基本觀點是選擇在AB中的一個點C,C將AB分為u:1-u(A到C的距離與AB之間的距離之比是u),讓我們找到?jīng)Q定C在哪里的方法。
從A到B的向量是B-A。因為u是在0和1之間的比率,點C位于u(B-A)。將A的位置加以考慮,點C為A+u(B-A)=(1-u)A+uB。因此,對于給定的u,(1-u)A+uB是在A和B之間的點C,將AB分為u:1-u的兩段。
更加具有普遍性的比例切割算法的想法如下是假設(shè)我們想要找到C(u),u在[0,1]中。由第一個多段線P0-P1-P2-P3...-Pn開始,利用上面的法則找到在線段上的點P1i,P1i在P0i到P0(i+1)的連線上并且將這段線分為u:1-u的兩部分。依次地,我們可以得到n個點10,11,12,...,1(n-1),他們定義了一個新的多段線,一共有n-1段。
新點由1i進(jìn)行標(biāo)記,再次利用上面的規(guī)則我們可以得到第二個多段線,具有n-1個點(20,21,...,2(n-2))和n-2條邊。從這個多段線開始,進(jìn)行第三次,得到新的多段線,由n-2個點30,31,...,3(n-3)和n-3條邊組成。重復(fù)這個過程n次得到一個點n0。
以上想法只是給定了比例切割想法的幾何解釋,而實際計算需要一個具體的計算方法。
首先,對于每一對臨近的控制點,可以畫出一條右上方和右下方的箭頭(類似于楊輝三角),并且在兩個箭頭的交點處寫下一個新點。例如相鄰的兩個點分別為ij 和i(j+1),新點是(i+1)j,右下方(相對應(yīng)的左下方)的箭頭表示將其尾數(shù)ij(相對應(yīng)的為i(j+1))乘以1-u(相對應(yīng)的乘以u),新的點是兩個的和。
因此,從初始的第0列開始,我們計算第1列。之后從第1列得到第2列。最終,在n次計算之后我們最終到達(dá)了一個單個的點n0并且這個點就是在曲線上的點。下面的算法總結(jié)了上面我們討論的內(nèi)容,輸入的是具有n+1個點的數(shù)列P和在0到1之間的u,最終得到在貝塞爾曲線上的點C(u)。
這個計算過程可以用遞歸的方法表示,對于j=0,1,...,n用P0,j表示Pj,也就是P0,j是第0列的第j項元素,在第i列計算第j項如下:P(i,j)=(1-u)P(i-1,j)+uP(i-1,j+1),(i=1,2....,n;j=0,1,2...,n-i)
元素Pi,j是(1-u)Pi-1,j(左上方元素)和 uPi-1,j+1(左下方元素)的和,最終的結(jié)果(在曲線上的點)是Pn,0.在這種想法的基礎(chǔ)上,通過編程就可以得到基本的算法程序。
在這個基本算法的基礎(chǔ)上,陳東風(fēng)還需要對螺旋線、球面螺旋線、雙弧外擺線和星行線、心臟線、圓內(nèi)螺旋線、正弦曲線、太陽線和費馬曲線等等幾百種曲線給出需要選定的控制點數(shù)量和控制比例u。這個工作如果沒有計算機(jī)的幫助的話,估計他這輩子都得耗在這上面了。
“好在,通用的算法已經(jīng)計算出來了,可能有迭代算法效率的不高的問題,但是計算機(jī)應(yīng)該可以克服?!标悥|風(fēng)一邊自言自語,一邊站了起來,往窗外一看天快黑了,正好肚子有點餓,把桌子上堆成小山的草稿紙整理下后,就出了房間。
長風(fēng)浪xo
蠻硬的,可以忽略算式。算法核心思想就是不斷的切割再切割直到得到光滑曲線;算法就是迭代法。