2010-01-28 23 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