Javascript 是否在多边形中找到位置#

Javascript 是否在多边形中找到位置#,javascript,c#,jquery,google-maps,Javascript,C#,Jquery,Google Maps,我正在寻找一个完美的C#算法,它决定一个位置(lat/long)是否在多边形中找到 在谷歌地图上,我创建了多边形形状的不同区域。每个分区都可以用一组坐标表示。例如,下面是牙买加蒙特哥湾(A区)的坐标(经度、纬度组合): )7.454579542,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

我正在寻找一个完美的C#算法,它决定一个位置(lat/long)是否在多边形中找到

在谷歌地图上,我创建了多边形形状的不同区域。每个分区都可以用一组坐标表示。例如,下面是牙买加蒙特哥湾(A区)的坐标(经度、纬度组合):


)7.454579542,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9.9234638,18.4888979,-77.92363,18.492311,-77.914973,18.4951459,-77.918355,18.4971759,-77.972733,18.4985953,-77.916291,18.527569,-77.8997725,18.56178,-77.8962851,18.58578,-77.873843,18.517512,-77.8772736,18.5228297,-77.9253387,18.521568,-77.9531479,18.45699我成功地使用了绕组号:

步骤1:定义多边形的绘制方向

基本上,多边形是静态的,没有方向。然而,考虑在一张纸上画多边形时你所做的动作。从一个位置开始,移动笔为多边形的每一侧绘制一条线。如果不将笔从纸上取下,多边形的每一侧都将以顺时针方向或逆时针方向绘制

我们可以使用此“方向”来确定多边形的边如何围绕点“缠绕”(顺时针缠绕或逆时针缠绕)

用真正的多边形(在一个方向上没有画出),你认为绘制哪个方向并不重要,但重要的是,每个边都被认为是在同一个方向绘制的。

步骤2:将多边形的每一边视为具有两个顶点的单个对象。

如果我们知道多边形的顶点,我们可以确定多边形每一侧的端点

步骤3:确定每一侧穿过该点的方向(如果两侧确实穿过该点)

使用顺时针缠绕查找多边形是否围绕
点的示例:

定义一个
计数器
,以跟踪绕组编号

对于多边形的每一侧,取第一个顶点
顶点1
和第二个顶点
顶点2
(这些点定义每一侧的端点)。 如果
vertex1.x
point.x
,则侧边从
point.x
的左侧开始。 如果
vertex2.x
point.x
,则侧边结束于
point.x
的右侧。 如果该边从左开始到右结束,则该线与该点相交

如果侧面穿过
,我们需要确定它穿过的方向。 以顺时针方向为正方向,侧边必须穿过
点上方
才能被视为正方向。如果
的x位置处的线的y值大于
的y值,则该线在
上方交叉。否则它会在点下方穿过

如果它在上面交叉,则增加
计数器
。如果它在下方交叉,则减小
计数器

注意:请注意,如果直线从左向右通过,则正方向会看到该点上方的直线通过,但如果直线从右向左(在该点下方环绕)通过,则正方向会看到该点下方的直线通过。正方向为顺时针方向

现在对多边形的下一面执行相同的操作,其中
顶点1
将是前一面的
顶点2
,而新的
顶点2
是沿顺时针方向移动时多边形的下一个角点

对多边形的所有边执行此操作

最后,将有一个计数器,其值为正值、负值或0

如果计数器的值为0,则多边形不包含该点,否则将包含该点

这是因为,包含一个点的多边形总是有偶数条边通过该点。2条边或4条边等。在这些边中,一半将从点上方的左向右穿过,另一半将从点下方的右向左穿过


结果为0表示没有边通过该点(因此多边形永远不会与该点的轴相交),或者多边形在两个方向上通过该点的一侧(例如,从左到右,然后从右到左)。因此,绕组编号相互抵消。

我看到的一个简洁的算法,从要检查的点到无穷远处形成一条直线。当您从点移动到无穷远处时,您将计算您穿过的多边形边线的数量。如果你穿过奇数条线,那么点在里面。如果交叉0或偶数,则该点位于外侧。