2010-01-28 49 views
1

給定兩點A和B,由經度和緯度定義我想確定另一個點C是否在〜A和B之間〜〜在〜之間很難定義。我不是說就行 - 幾乎肯定不會。確定球形三角形是否爲鈍

Geometric diagram http://www.freeimagehosting.net/uploads/b5c5ebf480.jpg

在該圖中,點C是〜A和B之間〜因爲它是點A的法線和B(由細線表示的法線)它們之間的線之間。 D點不在〜A和B之間,但是在〜B和F之間。

另一種說法是,我想確定三角形ABC和ABD是否爲鈍角。

請注意,這些點會非常接近 - 通常在10米範圍內。

我在想,haversines的規律可能會有所幫助,但我不知道haversine的反義詞是什麼。

非常感謝您的幫助。

+0

細線是經線? – 2010-01-28 04:16:34

+0

不,細線是AB線的法線。該圖表示的情況可能會旋轉任何數量。 – Sarge 2010-01-28 04:22:02

+1

您對該問題的定義不正確。你不需要知道ABC是否是鈍的,但是CAB和CBA的角度是否是鈍的。想象一下,如果C非常接近AB,那麼三角形將是鈍的,但是C仍然是「內部」的,正如你所說的那樣。 – 2010-01-28 04:34:10

回答

3

首先,將您的點轉換爲本地切平面。我們將使用你的三角形比地球半徑小得多的事實。 (正切空間是這樣的,在所述兩個座標等於增量對應於相等的距離)

這是通過由SIN(LAT)除以longtitudes完成:

A_local_x = A_lat_rads; 
A_local_y = A_lon_rads/sin(A_lat_rads); 

然後,

計算長度:

double ABsquared = (A_local_x - B_local_x)*(A_local_x - B_local_x) + (A_local_y - B_local_y)*(A_local_y - B_local_y); 
double BCsquared = ..., ACsquared. 

最後:

bool obtuse = (ABsquared+BCsquared < ACsquared) || (ABsquared+ACsquared < BCsquared); 

如你所說,鈍意味着「它不在行內」。我並不是在檢查三角形ABC是否鈍,而是在B和A處的角度是否是鈍角。而已。

說明:我還沒有測試過這個代碼。請通過插入不同點來告訴我它是如何工作的,如果有問題我會解決它。

+2

不錯。當然,你的距離公式應該加上正方形。切線飛機是否能保證角度得到保留?或者在一個系統中只有相等的距離==平面上的距離相等? – 2010-01-28 08:46:25

+0

謝謝,糾正了「 - 」。哎呀。 角度 - 是的。他們被保留。這就像將附近的所有點映射到一個切平面。 – 2010-01-28 13:22:20

+0

Pavel:對於我在實施這個答案時拋出的簡單問題,它效果很好。謝謝。 – Sarge 2010-01-28 13:56:52

3

如果你的點是非常接近的米— 10S可以輕鬆晉級—你可以接近它作爲一個2-d的問題,只是計算角度CAB,θ和CBA,φ(使用dot product)。如果θ和φ都小於π/2,那麼C就是「之間」。

COS(θ)=(AC&middot; AB)/(| AC | | AB |)

如果這近似是不是你不夠好,你將需要spherical trigonometry,這也不算太難。

請注意,如果我正確理解您的問題,則需要檢查角度CAB和CBA是否尖銳,而不是角度ACB是鈍角還是尖銳。

+0

是的,Alok,你正確地理解了這個問題。 – Sarge 2010-01-28 04:53:49

+0

+1;然而,這需要翻譯成三維笛卡爾座標(重要的)。看到我的答案如何避免它。 – 2010-01-28 08:22:55