2 回答
TA贡献1797条经验 获得超6个赞
让我建议对您的网格稍作修改。目前,您为每个单元存储单元中心所属的多边形。相反,存储与单元格重叠的所有多边形。然后,每当您看到一个单元格只有一个重叠的多边形时,您就不需要进行任何包含测试。网格可以通过保守光栅化的方法构建(请注意,引用的文章不是针对保守的,而是针对一般光栅化的)。
网格的效率与单个多边形单元格和总单元格的比率相关(因为这是不必执行多边形包含测试的概率)。存储本身非常便宜。您可以使用密集数组并持续访问单元格。因此,从理论的角度来看,您应该拥有尽可能多的单元格(因为单元数越多,单多边形单元格比率就会增加)。在实践中,您可能会发现缓存和其他内存效应可能会使大型网格变得不切实际。但是,除了测试之外,没有其他好的方法可以知道。因此,只需在几台不同的机器上尝试几种尺寸并尝试找到合适的尺寸即可。
如果我不得不猜测,我会说您的单元格应该是方形的,并且面积约为平均多边形面积的 1% - 5%。此外,与许多细长多边形相比,可以更有效地处理更紧凑的多边形。
TA贡献1853条经验 获得超18个赞
选择任意点并从该点笔直向下画一条线。您命中的第一个多边形边会告诉您该点所在的多边形。
因此,如果您不想进行多边形测试,那么与其将空间划分为规则网格,不如先将其切割成垂直切割的条带,这些条带穿过所有多边形交叉点。
现在,在每个条带内,没有多边形边交叉或结束,因此您可以从下到上制作所有这些边的有序列表。
如果要查找包含点的多边形,请使用 x 坐标进行二分搜索以找到合适的条带。然后在跨越条带的边列表中,您可以使用 y 坐标进行二分搜索以找到该点下方最近的一条,并告诉您该点所在的多边形。
谷歌“梯形分解”可以找到很多关于类似技术的信息。
- 2 回答
- 0 关注
- 195 浏览
添加回答
举报