S5G4 球上的大圓路徑
從北京飛到紐約可不是要飛越太平洋,而是要經過北極圈。這可不是因為怕飛機掉到太平洋中,而是因為這是走球面上兩點最近的的大圓路徑。對于這類立體幾何問題,用 GGB 呈現(xiàn)就直觀很多。更有趣的是自己動手來做看看時,更可體會到更多數學原理。
?
你將學會
球面極坐標的觀念
站在巨人肩膀上,學會改編優(yōu)良作品
了解球面上的地圖是由很多折線段構成
利用序列來繪制經緯線
利用叉積來取得球面上的大圓
將球面上xyz坐標轉換為極坐標
學習指引
二、地球上的經緯度如何解讀
在探究球面上大圓的距離前,先來認識所謂的經緯度的到底是指那些角度?

問:如何確定? E 116°、 N 40°? 的位置?
答:可從赤道與本初子午線的交會點 A,沿著赤道往東 116°,再往北移動 40°?,所到的位置就是? E 116°、 N 40°。

三、參考他人作品
在 GGB 的最佳學習資料就是 GGB 官網,上面有很多優(yōu)秀作品。我第一次看到 GGB 上刻畫著世界地圖時,也覺得很神奇,這到底如何做到的。而要解決這個困惑,其實就是打開他人作品觀看源代碼。接著在一步步拆解反思他人的指令到底是什么意思,就可學到很多技巧。

問:如何畫出地球上的地圖?
答:這些地圖,主要是有很多折線來完成。而這些折線的檔案主要取至自于 Rafael Losada Liste 的作品。?https://ggb123.cn/m/uT3czZnE
他在這系列的第二、三個作品都很精美,鼓勵大家去研究。本文只先利用他第一個地圖的基礎來發(fā)展練習。

問:如何解讀這些折線?
答:這個地圖共有 206 個折線檔案,我們先來看其中一小段折線。以臺灣為例,這段折線共有 9 個點。其中開頭與結尾都是 (5;2.125;0.426)?,所以連成一個封閉曲線。
Taiwan?=?折線((5;?2.125;?0.426),?(5;?2.115;?0.398),?(5;?2.107;?0.383),?(5;?2.098;?0.398),?(5;?2.096;?0.411),?(5;?2.106;?0.428),?(5;?2.121;?0.442),?(5;?2.128;?0.436),?(5;?2.125;?0.426))
問:這折線的每個點是如何解讀?
答:這是空間中的極坐標表示,要注意,每個坐標內用 ;來隔開。
問:如何找到臺灣的折線的呢?
答:首先,臺灣的最北端為富貴角大約位在?東經 121.5?,?北緯 25.25?。因此,將 121/180*3.1416?得到?2.11 ,?北緯 25.25/180*3.1416=0.44 。接著在找尋 (5; 2.121?后,再去檢查?第三個位置大約 0.44??烧业??(5;?2.121;?0.442)?。

四、如何繪制經緯線
?目的:利用Sequence,可以完成這些經緯線。

問:如何繪制赤道?
答:先利用 Circle 來繪制空間中的大圓,但空間中的圓要給一個垂直與圓所在平面的向量。因此先定 vy ?來繪制赤道 Lat0。
vz?=?向量((0,0,1))
R = 5
Lat0?=?圓周(O,R,vz)
問:如何繪制經線?
答:先繪制個子午線,再將這個大圓繞z軸旋轉。
vy?=?向量((0,1,0))
Long0?=?圓周(O,R,vy)
Longs?=?序列(旋轉(Long0,?pi/6*k,?直線(O,vz)),k,0,5)

問:如何繪制緯線?
答:每條緯線所對應圓的圓心與半徑都不相同。因此先繪制球心 Os,接著再設定半徑 Rs,再利用這些圓心與半徑畫緯線 Lats。
Os?=?序列((0,0,?R*sin(pi/6?*k)),k,-2,2)
Rs?=?序列(R*cos(pi/6*k),k,-2,2)
Lats?=?序列(圓周(Os(k),?Rs(k),?直線(O,vz)),?k,?1,5)
五、如何繪制大圓
目的:大圓為通過圓心 O點,要繪制這個圓的關鍵在于取得O,A,B 的法向量。

問:如何取得大圓的圓???
答:先利用 [叉積]?取得過 O,A,B 平面的法向量,再利用此向量來繪制過 A, B的大圓。接著利用 [圓弧] 指令,就可畫過大圓的圓弧。
Earth?=?球面(O,R)
A?=?描點(Earth)
B?=?描點(Earth)
nAB?=?叉積(向量(O,A),向量(O,B))
cOAB?=?圓周(O,A,B)
arcOAB?=?圓弧(O,A,B)
六、如何繪制過地圖上中點的小圓?
目的:這題的關鍵在于取得 A,B 兩點的經緯度坐標。

問:如何取得經緯度坐標?
答:利用反三角函數。緯度為 asin(z/R), ?經度為 atan(y/x)
LongA?=?atand(y(A)/x(A))
LatA = asind(z(A)/R)
LongB?=?atand(y(B)/x(B))
LatB?=?asind(z(B)/R)
LongM?=?(LongA+LongB)/2?
LatM?=??(LatA+LatB)/2
M?=?(R;LongM;LatM)?
問:為何上面取得的經緯度來計算中點 M 時,不一定會出現(xiàn)在兩點中間?
答:因為反三角函數的值域的限制,這時通過 [如果]?來將角度調整為 -180?到 180。這時獲得正確的位置后,就可用?[三點圓弧] 來繪制圓弧。
LongAp?=?如果(x(A)?>?0,?atand(y(A)?/?x(A)),?如果(y(A)?>?0,?180°?+?atand(y(A)?/?x(A)),?-(180°)?+?atand(y(A)?/?x(A))))
LongBp?=?如果(x(B)?>?0,?atand(y(B)?/?x(B)),?如果(y(B)?>?0,?180°?+?atand(y(B)?/?x(B)),?-(180°)?+?atand(y(B)?/?x(B))))
LongMp?=?如果(abs(LongAp?-?LongBp)?<?π,?(LongAp?+?LongBp)?/?2,?(LongAp?+?LongBp)?/?2?+?180°)
Mp?=?(R;LongMp;LatM)
cArcAMB?=三點圓弧(A,Mp,B)
小結
基于上面結果,大家可嘗試增加些復選框,并試著利用地球半徑 6371 來模擬地球上兩點的大圓距離。

相關鏈接
【GGB】https://ggb123.cn/classic/uvvgrqjv
【Bili】https://www.bilibili.com/video/bv1pk4y167d6