7

我正在寻找一种算法,我可以创建一个地理围栏并检查设备是否正在进入/离开围栏。我已经研究过多边形算法中的点(光线投射和缠绕数),但是是否有任何算法可以应用于圆形和任何不规则形状?重要的限制是时间效率。

谢谢你。

4

5 回答 5

4

Here is the c code algorithm that is simple to understand:

http://alienryderflex.com/polygon/

于 2012-10-09T13:02:02.110 回答
3

圆很容易(至少如果你假设一个局部平坦的表面) - 只是到一个点的绝对距离。

如果您需要速度,通常的方法是级联,您首先检查一个圆,或者围绕该点检查一个正方形,然后是凸多边形,然后是更详细的多边形(如果需要)。

你如何定义不规则形状 - 如果它不是多边形?

ps 请参阅如何测试一个点是否在 2D 整数坐标中的凸多边形内?

于 2012-06-01T21:00:03.947 回答
2

我为python找到了这个解决方案。据我所知,这很有效。

from shapely.geometry import Point, Polygon
import matplotlib.path as mpltPath
from functools import reduce
import operator
import math
coords = [[ 12.934158,77.609316], [ 12.934796,77.609852],[ 12.934183,77.610646], [ 12.933551,77.610100], [12.934158,77.609316]]

#sorting the geofence coords in clockwise direction
center = tuple(map(operator.truediv, reduce(lambda x, y: map(operator.add, x, y), coords), [len(coords)] * 2))
coords = sorted(coords, key=lambda coord: (-135 - math.degrees(math.atan2(*tuple(map(operator.sub, coord, center))[::-1]))) % 360)

#Testing if a point inside or outside
poly = Polygon(coords)
point = Point(12.933556,77.609854)
print(coords)
if(point.within(poly)):
    print("Inside")
else:
    print("Outside")

谢谢你!

于 2020-07-19T04:23:57.643 回答
1

绕组数法

但最重要的是,出于几何正确性和效率的原因,在确定多边形中是否包含点时,应始终首选缠绕数算法。

于 2018-03-06T17:20:42.123 回答
0

看看四叉树、空间索引、四叉树和 r-tree。

于 2012-10-09T13:11:50.423 回答