对不起,我在处理这个问题时遇到了很多麻烦。
我坚持使用什么数据结构(或数据结构的组合)来存储彼此接壤的多边形排列(如任何真实世界地图)。
我应该澄清一下:我的意思是通过这些多边形的地图(风景)以固定的速度移动一个点。整个景观都被多边形所覆盖 - 没有空间被分类;地图中的每个点都属于某个多边形。这意味着所有多边形在所有边上都与另一个多边形或地图边缘相邻。地图是有界的,但理想情况下,地图的大小或表示多少多边形无关紧要。每个多边形都有一个名称(这很重要,因为每个点现在属于至少两个命名多边形)。在地图中移动的点应始终知道它所在的多边形的名称,并且每当它从一个多边形跨越到另一个多边形的边界时,也应该通知该点。 (如果需要任何其他说明,请发表评论。)
有没有可以接受的方法呢?
- 编辑 -
多边形是固定的。所有点和边缘都需要事先进行硬编码。点和边缘永远不会无法预测或随机变化(如果它们发生变化,它将响应不常发生的固定事件)。
答案 0 :(得分:3)
描述此项的技术术语是planar straight-line graph,其中合适的表示形式为doubly connected edge list(DCEL)。
您的数据结构的一个要求似乎是执行(快速)点位置查询的可能性。 (这个点属于什么多边形?)有经典的解决方案,其中一个可以推荐trapezoidal decomposition。
我不知道" border"的合适解决方案。查询,即找到具有(推测)线性轨迹的交叉点。您可以从点位置问题中进行调整,但这很有可能会很棘手。
无论如何,如果您的多边形具有合理数量的顶点,通过依次尝试所有边来找到具有给定直线的所有交点并不是什么大问题。使用DCEL表示,当您离开多边形时,您知道输入哪一个。
如果我是你,我会从DCEL结构,point-in-polygon算法和线 - 多边形交叉算法(基本上是相同的)开始。
答案 1 :(得分:1)
构建a 2D segment tree,其中每个2D间隔对应于多边形的边界框,值类型对应于多边形本身(边缘列表)。
在代理从p1移动到p2后,对段树运行窗口查询:搜索与p1和p2定义的矩形相交/包含的所有2D间隔(边界框)。
对于这些边界框内的每个多边形,检查它是否包含p2。