我需要一种方法来构造一个带孔的二维多边形

时间:2013-11-27 08:02:22

标签: algorithm data-structures

我的物体是用蜂窝网格构建的。所有对象都已连接。红线表示每个节点之间的连接。我听说二元空间分区(BSP)树很适合这种类型的问题,但不知道在我的情况下前后是什么。

我使用蜂窝网格系统实现了查找,如图所示(x,y)

class Node {
    Point position; //center position
    Point grid; //honeycomb grid system
}

class MyObject {
    Node lookup(Point grid);
}

当用户在场景中添加更多节点时,我需要一个表示图形的数据结构,以及一种快速确定网格点是否为(MyObject)的方法: 外面的 在里面 3.在洞内

enter image description here

2 个答案:

答案 0 :(得分:0)

你在工作的空间有多大?

使用简单的矩形网格模拟整个事物,假设偶数行正确交错。

任何节点都有坐标[x,y]

  • (y%2 == 0)个邻居节点为[x-1,y][x+1,y][x,y+1][x,y-1][x-1,y-1][x-1,y+1]
  • (y%2 == 1)个邻居节点为[x-1,y][x+1,y][x,y+1][x,y-1][x+1,y-1][x+1,y+1]

每个节点可以完整为空,空节点可以检查未选中。最初所有空节点都未未选中

通过以下方式检查节点是否属于某个孔:

  • 如果节点已满 - 它不属于洞,则属于该形状。
  • 如果节点为空将节点标记为已选中
  • 遍历所有邻居节点:
    • 跳过标记为已检查已完成
    • 的节点
    • 以递归方式重复搜索未选中的所有节点
  • 如果递归带您进入任何x<0, y<0, x>MAX_X, y>MAX_Y,则中止。节点在形状
  • 之外
  • 如果递归结束但没有找到游戏区的边缘,则节点属于一个洞

此外,您现在可以重复此过程,将所有已检查的节点转换为外部 hole 以供日后参考。

如果要在开始时索引所有孔,可能更容易在playfield(x==0, y==0, x==MAX_X, y==MAX_Y)的边界处找到所有未检查的空节点,并使用上述算法来标记它们在外面。所有剩余的空节点都是空洞。

根据您的网格大小,您可以将其实现为包含对象状态(甚至char s的结构/对象的2D数组,状态为数字的位),大小为[MAX_X + 1] [MAX_Y +1]如果它的大小合理,或者作为完整节点的列表(向量),每个节点都包含其坐标,状态以及如果您希望这是更加速度最佳的邻居。在这种情况下,搜索形状,找到潜在孔洞的所有邻居节点。具有极端坐标(最低/最高x / y)的边缘节点属于“外部”。跟随他们拥有完整邻居的空邻居,找到形状的外边缘。剩下的都是内边缘,在遵循从它们开始的算法之后,你将拥有所有的“洞”。

答案 1 :(得分:0)

我的建议:

  • 为每个图块分配一个二维笛卡尔空间中的中心位置。
  • 构建包含所有中心位置的二叉搜索树(BST)。
  • 对于查询点,使用该BS​​T找到与最近的占用区块的相对位置。
  • 使用某个几何公式确定该位置是在图块的内部还是外部,例如,如下所示:

或者,使用正方形进行近似处理,例如,如下所示: