1

给定由经度和纬度定义的两点 A 和 B,我想确定另一个点 C 是否在~A 和 B 之间。~对于我来说很难定义。我不是说在线 - 它几乎肯定不会。

几何图 http://www.freeimagehosting.net/uploads/b5c5ebf480.jpg

在此图中,点 C 介于 A 和 B 之间,因为它位于点 A 和 B 的法线与它们之间的线(法线用细线表示)之间。D点不是~在~A和B之间,而是~在~B和F之间。

另一种说法是,我想确定三角形 ABC 和 ABD 是否钝。

请注意,这些点将非常靠近 - 通常在 10 米以内。

我认为haversines定律可能会有所帮助,但我不知道haversine的逆是什么。

非常感谢所有的帮助。

4

2 回答 2

3

首先,首先将您的点转换为局部切平面。我们将使用您的三角形比地球半径小得多的事实。(切线空间使得两个坐标中的每一个中的相等增量对应于相等的距离)

这是通过将经度除以 sin(lat) 来完成的:

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 处的角是否钝。就是这样。

注意:我没有测试过这段代码。请通过插入不同的点告诉我它是如何工作的,如果有错误我会修复它。

于 2010-01-28T04:24:34.300 回答
3

如果您的点非常接近(10 米很容易符合条件),您可以将其近似为二维问题,只需计算角度 CAB、θ 和 CBA、φ(使用点积)。如果 θ 和 φ 都小于 π/2,则 C 处于“介于”之间。

cos(θ) = ( AC · AB ) / (| AC | | AB |)

如果该近似值对您来说不够好,您将需要球面三角法,这也不太难。

请注意,如果我正确理解了您的问题,您需要检查角 CAB 和 CBA 是否是锐角,而不是角 ACB 是钝角还是锐角。

于 2010-01-28T04:45:15.237 回答