1. 程式人生 > >風螺旋公切線算法詳解

風螺旋公切線算法詳解

send 目標 繪圖框架 lib page 2.x 相減 水平 tab

風螺旋公切線算法詳解

2017-12-29 劉崇軍 風螺旋線

好久不見,近來一切可好?2017年最後這段時間裏,狂補了一把C#,希望未來能夠從軟件代碼層面實現風螺旋算法的驗證與推廣。今天跟大家分享的這個話題的底圖就是最近一段時間的學習成果:一個基於WPF架構的非常簡單的繪圖框架,以及對風螺旋的自動化繪制進行的實現。閑話少敘,開始今天的主題。

在掌握了風螺旋切線計算的基礎上,就可以開始公切線算法的研究了。公切線的計算是飛行程序模板中非常關鍵的一項內容,因此,在開始模板算法分享之前,詳細回顧一下公切線的算法是非常有必要的。

風螺旋公切線計算首先是基於以下4個基礎設定:

/// 1. 同一程序模塊內,轉彎基礎參數相同。

無論是程序轉彎、還是等待模板,在同一個ICAO標準模板中,轉彎參數是相同的,即轉彎半徑是相同的。

/// 2. 風螺旋的切線與Esita方向相垂直。之前從原理及數學軟件上對此項內容進行了證明,這是公切線的一個基礎條件。

/// 3. Esita方向與對應的基準圓半徑之間的夾角恒等於偏流角DA。ICAO DOC8168中的配圖明確標註了此項內容DA= arcsin(w/v)。

/// 4. Esita的大小與sita角度可以互相換算。距離可以換算成旋轉角度,反之旋轉的角度可以換算為對應的距離。這是本公眾號中多次提及的一個基本概念。風螺旋是假想的航空器的飛行軌跡,對這個軌跡整體進行旋轉時,它的外擴規律符合按照Esita方向等距離外擴的特性,外擴的大小與旋轉過的角度有直接的換算關系。

除以上4個基礎設定以外,公切線計算中按照個人偏好使用了以下的標識來表示風螺旋的參數(如圖1所示):

技術分享圖片

圖1 風螺旋參數示意圖

rotation: 從系統的零度旋轉至風螺旋起點的角度。航空地圖中采用的是磁北為零度,計算機系統中多數以水平向右為零度的起點,順時針角度增大為默認條件。

offset:表示外擴距離的一個量。對於一個風螺旋來說,外擴和旋轉角度可以互相換算,因此,最佳方案是對每一個風螺旋都設定一個初始的系統角度(rotation)和一個初始的外擴距離(offset)。

sita:用來表示從風螺旋起點開始實際的轉彎角度。通過該角度可以換算出從起點開始一共外擴了多少距離,或者用來表示風螺旋中的某個具體位置點。

Esita:與sita角相對應的外擴距離。這個Esita的方向與對應半徑的延長線之間的夾角為偏流角DA,與該位置處風螺旋切線的夾角為90度。

為了更清晰的表示計算關系,對圖1中的關鍵點進行編號得到圖2的內容:

技術分享圖片

圖2 風螺旋公切線的角度關系

圖2中繪制了兩條實心的風螺旋線ws1和ws2,以及與它們對應的無外擴的虛線風螺旋。虛線風螺旋與圓周的交點視為風螺旋的實際起始角度。旋轉與外擴可以相互換算,因此可知,實線風螺旋與虛線風螺旋之間是“等距平行”關系。

由於Esita與風螺旋的切線相垂直(基礎設定2),因此,若兩個風螺旋之間存在有公切線,則必定分別有兩個Esita與公切線相垂直,如圖1中的Esita1和Esita2,它們二者為平行關系。

由於兩個Esita與對應的半徑Radius之間夾角固定為偏流角DA(基礎設定3),因此可知對應半徑之間為平行關系。因為,兩條風螺旋的基礎參數是相同的,因此,兩個半徑是相等的。於是圖2中的abcd是一個平行四邊形。從d點向fc邊做垂線,得到垂足e點,可知defg是一個矩形。

ws2風螺旋在公切點位置處的Esita可以分成兩部分,EsitaA和EsitaB,前者與ws1中的外擴距離是相等的,後者產生的原因是兩條風螺旋初始條件的差異所造成。若每弧度可以外擴的距離為Edist,則EsitaB可表示為offset2 - offset1 + (rotation1-rotation2) * Edist,即初始外擴距離之差,加上初始角度之差所換算成的外擴距離,就構成了圖2中的EsitaB。圖2中的EsitaA可視為兩條風螺旋共同旋轉過的角度所形成的距離,因為外擴的效率是相同的,相同的外擴角度可以得到相同的外擴距離。rotation1-rotation2這個公式是浪費了兩天多的時間才最終糾錯糾出來的,之前在Flash系統中不存在此問題,C#中的繪圖系統真是復雜許多。rotation1-rotation2代表了以rotation2為基準角度,初始的角度差值。

具體的計算步驟如下:

1、放置風螺旋,計算dc線的角度。

當我們向屏幕中放置一條風螺旋時,它的中心點位置就可視為一個已知條件。設兩個中心點坐標分別為c1(x,y),c2(x,y),那麽,線段ab在軟件系統中的角度為: arctan((c2.y-c1.y)/(c2.x-c1.x)),這裏需要用到反正切函數,獲得一個角度值,稱之為基準線角度,用baseLineAngle來表示,圓心點間的距離用distance來表示。dc線與ab線平行且相等,因此,baseLineAngle就是dc線的方向。

2、計算dg線的角度。

圖2中⊿dce為一個直角三角形,∠cde的值用angle來表示,它等於arcsin(EsitaB/distance)。圖2中逆時針方向角度減小,因此可將線段dg的角度表示為:baseLineAngle – angle - Pi/2 (所有角度值均用弧度來表示),公切線的方向就等於baseLineAngle – angle。

ws1的外擴距離大於ws2時,angle角的值為負值,位置關系如圖3所示:

技術分享圖片

圖3 angle角為負值的情況

此時,∠cdg的值可表示為Pi/2 + angle(因為angle小於零),線段dg的角度可以表示為baseLineAngle -(Pi/2 + angle),化簡後,得到的公式為baseLineAngle – angle- Pi/2。與前面討論的angle大於零時的公式是完全一致的,也就是說不論ws1或ws2外擴距離誰大,dg線的角度始終可以用baseLineAngle – angle - Pi/2來表示,公切線的角度可以用baseLineAngle– angle來表示。

3、計算dg線的長度。

從dg線的角度反推對應的半徑的方向,可采用公式:baseLineAngle - angle - Pi/2 + DA(因為Esita與半徑的夾角總等於DA)。得到圓周半徑方向之後,分別與各自的rotation參數相減,就可以得到風螺旋真實的旋轉角度,用這個旋轉角度sita換算成外擴距離,再加上初始的外擴距離,就可以得到dg線的長度,角度、長度都知道以後,可以得到準確的切點位置。連接兩個切點的坐標,得到的線段即是兩條風螺旋線的公切線。

公切線的計算過程就是這樣,您get到了沒?

另外再附兩張公切線的示意圖,因為手工條件下真是很難想像公切線會出現在什麽地方(以後這個問題將不是問題 :-))

技術分享圖片

技術分享圖片

這兩張圖與前面的圖的區別在於:初始的 rotation 大小關系對調了一下,結論完全相同。這就是自動化計算的魅力所在,哈哈哈。


可以預見的未來中,風螺旋線將成為一門新興的學科,它將與阿基米德螺旋漸開線螺旋共同納入 等距螺旋 的框架,成為幾何課程的一部分,風螺旋相關計算將成為飛行程序設計入門課程的一部分。本公眾號將以此為目標持續努力,全面開源共享。期待在不遠的將來風螺旋線精確計算方法將成為DOC8168的一部分,並且成為飛行程序領域送給 幾何研究領域的一份禮物!

祝大家:新年快樂!

技術分享圖片

微信掃一掃
關註該公眾號

風螺旋公切線算法詳解