通过坐标在笛卡尔平面上搜索几何形状

时间:2015-04-04 09:57:06

标签: c++ algorithm computational-geometry

我在笛卡尔平面上有一个算法问题。我需要有效地搜索与给定点相交的几何形状。有几种形状(矩形,圆形,三角形和多边形),但那些并不重要,因为确定实际点包含在这里不是问题,我将自己实现。问题在于确定哪些形状需要验证以包含给定点。迭代我在平面上的所有形状并在每个形状上运行点包含方法是低效的,因为形状实例的数量将非常大。我的第一个想法是将平面划分为段(平面是有限的,但对于任何类型的3D阵列来说都太大),并且当向数据库添加形状时,我将确定它将与哪些段相交并将它们保存在对象中形状。然后,当给出包含验证的点时,我只需要确定该点所在的段,然后仅验证包含与该段相交的对象。

这是要走的路吗?我不知道我描述的方法是否是最佳的,或者我是否错过了什么。任何帮助将不胜感激..

提前致谢

P.S。:我将用C ++编写。这并不是真正相关的,因为它更像是一个算法问题,但如果有人好奇,我想把它说出来......

1 个答案:

答案 0 :(得分:0)

这里可以使用网格化方法。

将平面视为光栅图像,使用扫描转换算法绘制所有形状,确保所有像素均被填充。对于每个图像像素,请保留填充它的形状列表。

然后查询很简单:找到查询点落在O(1)的位置的像素,并检查列表中的每个形状,及时O(K),其中K是列表长度,大约等于交叉形状的数量。

如果您的图片由像素组成,并且您有M个平均区域为A像素的对象,则需要存储N²+M.A个列表元素(形状)标识符+下一个链接)。您将选择像素大小以实现精度和存储成本之间的良好折衷。在任何情况下,您必须将自己限制在N²<Q.M,其中Q是查询总数,否则初始化图片的费用可能会超过总查询时间。

如果您的场景非常稀疏(空间多于形状),您可以使用quadtree使用图像的压缩表示。