计算坐标是否存在于2个其他坐标之间的直线上

时间:2014-12-08 01:19:39

标签: javascript google-maps-api-3

我正在尝试查看Google Maps API是否支持查看是否:

1)有2组坐标,基本上在它们之间画一条直线路线。我已经可以做了。

2)检查第3组坐标是否位于绘制线的x英尺\米范围内。

如果API不支持这个,那么如何确定这个想法呢?谢谢!

1 个答案:

答案 0 :(得分:0)

我们通过两种不同的方式计算三角形的区域来偷偷溜走。

假设你有三个点,P1 =(x1,y1),P2 =(x2,y2),P3 =(x3,y3)。您的目标是找出P3与加入P1,P2的线的接近程度。

该三角形的面积是两边交叉积的1/2。现在忽略1/2。两侧是P2-P1 =(x2-x1,y2-y1)和P3-P1 =(x3-x1,y3-y1)。 (想象一下,所有这些点的z坐标都为零。)然后,其交叉积的唯一非零分量是其z坐标,其值为z =(y2-y1)(x3-x1) - (X2-X1)(Y3-Y1)。三角形的面积是(一半)该数量z的绝对值。

但我们也可以通过传统公式获得该区域:基础的一半乘以高度。基数是从P1到P2的线的(长度)。 P2-P1的点积是该长度的平方,因此b ^ 2 =(x2-x1)^ 2 +(y2-y1)^ 2。 (因为双星号正在打开粗体,所以我必须为"平方"写^ 2。

如果我们让h为三角形的高度(即从P3到直线的距离),那么我们得到三角形的区域有两种不同的方式:b * h的一半和abs的一半(z) )。两半取消,h = abs(z)/ b。我们只需要看看h是否足够小。

为了得到b,我们可以像上面一样计算b ^ 2并取其平方根,但是方程的平方更简单:h ^ 2 = abs(z)^ 2 / b ^ 2。现在我们甚至不需要采取绝对值。

计算简化为:

z = (y2-y1)*(x3-x1) - (x2-x1)*(y3-y1)
bb = (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)
Test that z*z/bb is less than (3 feet) squared.

务必跟踪单位。三角形的边可能是以脚以外的单位给你的。 (而且我们还需要假设一切都足够接近,我们可以将地图视为平面。球面几何是一个完整的“蜡球”!)

还有一个皱纹。您需要验证P3不仅靠近该线,而且还要验证它最接近的线上的点落在端点之间。这样做的简单方法是检查P1和P2处的角度是否为锐角,这是通过拍摄相邻边的点积来实现的。如果角度是锐角,则点积将为正。

Test that (x3-x1)*(x2-x1) + (y3-y1)*(y2-y1) > 0
Test that (x3-x2)*(x1-x2) + (y3-y2)*(y1-y2) > 0