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