Algorithm 有没有办法更快地找到给定点的多边形?

Algorithm 有没有办法更快地找到给定点的多边形?,algorithm,computational-geometry,Algorithm,Computational Geometry,我有一个国家一些城市的多边形。对于给定的点,我想检查它位于哪个城市。我们可以假设每个给定的点都位于这个国家,因此它正好位于一个城市 一种方法是迭代每个多边形,并在多边形算法中逐点检查该点是否位于该多边形中。但因为我可能有很多点,而且多边形中的点算法至少有复杂性,所以这不是一种合适的方法 所以我想要一个合适的算法来解决这个问题,假设如下: 每个点正好位于一个城市。 城市边界是固定的,不会每次都改变。 什么算法可以用来解决这个问题?多边形中的点对我来说似乎是必要的。但是为了加速你的算法,用网格划分你

我有一个国家一些城市的多边形。对于给定的点,我想检查它位于哪个城市。我们可以假设每个给定的点都位于这个国家,因此它正好位于一个城市

一种方法是迭代每个多边形,并在多边形算法中逐点检查该点是否位于该多边形中。但因为我可能有很多点,而且多边形中的点算法至少有复杂性,所以这不是一种合适的方法

所以我想要一个合适的算法来解决这个问题,假设如下:

每个点正好位于一个城市。 城市边界是固定的,不会每次都改变。
什么算法可以用来解决这个问题?

多边形中的点对我来说似乎是必要的。但是为了加速你的算法,用网格划分你的空间。你可以有一个通过城市的四边形和一个位于城市内部的四边形,以加快你的检测速度。仅当点位于外部四边形内部而不在内部四边形内部时,才使用多边形算法中的点。Mehdi建议的四叉树可以以非常快的方式实现。但最好的解决方案可能是映射到网格,如下所述,您将得到一个O1解决方案:

您可能也可以加快PIP算法对多边形进行细分

通过适当的舍入函数,您可以使用点的坐标作为二维数组的索引,并在O1中确定它是否位于特定城市、是否不在城市或是否需要进一步调查

示例:点为3.4560,5.1547网格为10x10。城市1是3,4,3,5。城市1的边界穿过3,3,4,3,4,4,5,4,6,3,6,2,6,2,5,2,4,2,3。将点四舍五入为整数,得到3,5,可以用作矩阵的索引,该矩阵在Mat3,5=C1中具有,其中C1表示城市1。您可以将此技巧用于任意选择分辨率的地理坐标

将坐标映射到数组索引的公式:

Coordinate c in [a,b] 
array index i in [0,n-1]
i = floor( (c-a) / ((b-a)/n) )

多边形中的点对我来说似乎是必要的。但是为了加速你的算法,用网格划分你的空间。你可以有一个通过城市的四边形和一个位于城市内部的四边形,以加快你的检测速度。仅当点位于外部四边形内部而不在内部四边形内部时,才使用多边形算法中的点。Mehdi建议的四叉树可以以非常快的方式实现。但最好的解决方案可能是映射到网格,如下所述,您将得到一个O1解决方案:

您可能也可以加快PIP算法对多边形进行细分

通过适当的舍入函数,您可以使用点的坐标作为二维数组的索引,并在O1中确定它是否位于特定城市、是否不在城市或是否需要进一步调查

示例:点为3.4560,5.1547网格为10x10。城市1是3,4,3,5。城市1的边界穿过3,3,4,3,4,4,5,4,6,3,6,2,6,2,5,2,4,2,3。将点四舍五入为整数,得到3,5,可以用作矩阵的索引,该矩阵在Mat3,5=C1中具有,其中C1表示城市1。您可以将此技巧用于任意选择分辨率的地理坐标

将坐标映射到数组索引的公式:

Coordinate c in [a,b] 
array index i in [0,n-1]
i = floor( (c-a) / ((b-a)/n) )

通过处理几何体在垂直轴上的投影,可以获得显著的加速。每个多边形将退化为一个段,您可以将其插入段树中。然后使用查询时间OlogN+K,您将报告通过点的直线交叉的K个多边形

如果多边形不是太大,可以预期尝试的多边形数量将从N减少到√N大概


也可以在X轴上执行此过程,并且只处理两个结果列表共有的多边形,这可能是有利的。这样,您将只测试包含在测试点周围有边界框的多边形。

通过处理几何体在垂直轴上的投影,您可以获得显著的加速。每个多边形将退化为一个段,您可以将其插入段树中。然后使用查询时间OlogN+K,您将报告通过点的直线交叉的K个多边形

如果多边形不是太大,可以预期尝试的多边形数量将从N减少到√N大概


也可以在X轴上执行此过程,并且只处理两个结果列表共有的多边形,这可能是有利的。这样,您将只测试包含在测试点周围有边界框的多边形。

您可以查看四叉树。您可以查看四叉树。