快速算法找到数百万个多边形的数千个点?

时间:2012-04-27 04:09:22

标签: java algorithm point

我试图通过Web服务找出数百万个多边形点。首先我在java中实现了算法(Point in polygon),但是需要很长时间。然后我在mysql中拆分表并尝试使用多线程来解决它,但仍然效率低下。有没有更快的算法或实现来解决这个问题?

关于多边形的说明。 2D,静态,复杂多边形(也带孔)。

任何建议都将不胜感激。

4 个答案:

答案 0 :(得分:3)

无论多边形函数中的点效率如何,对一百万个多边形测试一个点都需要花费很多时间。

您需要缩小搜索列表的范围。首先为每个多边形创建一个边界框,并仅在该点位于边界框内时选择多边形。

如果多边形不变,您可以将每个多边形转换为一组三角形。测试一个点是否在三角形中的测试应该比测试它是否在任意多边形中要快得多。即使三角形的数量远远大于多边形的数量,它总体上也可能更快。

答案 1 :(得分:3)

如果多边形集合是静态的,首先将它们注册到空间数据结构上可能会有所帮助 - R-tree可能是一个不错的选择,假设多边形不会相互重叠太多。

要测试针对多边形集合的点,首先要找到树中的封闭叶(O(log(n))样式操作),然后只需执行完整的多边形点测试与封闭叶子相关联的多边形。

这种方法应该大大加快每个点测试的速度,但需要额外的设置阶段来构建R树。

希望这有帮助。

答案 2 :(得分:1)

如果你处理数百万个多边形,你需要某种空间分区,或者它会很慢,无论你的命中测试功能如何优化或有多少线程解决你的查询。

什么样的空间划分? 取决于

  • 2D? 3D?
  • 你的多边形是静态的吗?如果没有,请经常更改吗?
  • 你对这套装置做了什么样的要求?
  • 它是什么样的多边形?三角形?凸?凹?复杂?有洞?

我们需要更多信息来帮助您。

修改

这是一个简单的空间分区方案。

假设在给定步骤的2D空间上有一个笛卡尔网格。

添加多边形时:

  • 计算其边界框
  • 查找与边界框相交的所有网格单元格
  • 对于每个单元格,在特殊表格中添加一行。

表格如下:cell_xcell_ypolygon_id。添加适当的索引(至少cell_xcell_y

当然,您希望选择网格步长,因此大多数多边形位于不到10个单元格中,否则您的单元格表将很快变大。

现在很容易在给定点找到多边形:

  • 计算您的观点属于哪个单元格
  • 获取与此单元格关联的所有多边形
  • 对于每个多边形,请使用命中测试功能

这个解决方案远非最优,但易于实现。

答案 3 :(得分:0)

我在这里就是分而治之的情况,你可以尝试制作子多边形或简化一些方面,也许尝试一种启发式的方法,有我的5美分。