Algorithm 我需要一种方法来构造一个有洞的二维多边形

Algorithm 我需要一种方法来构造一个有洞的二维多边形,algorithm,data-structures,Algorithm,Data Structures,我的对象是在蜂窝网格中构建的。所有对象都是连接的。红线表示每个节点之间的连接。我听说二进制空间分区(BSP)树可以很好地解决这类问题,但不确定在我的例子中前后是什么 我已经使用蜂窝网格系统实现了查找,如图(x,y)所示 我需要一个数据结构来表示用户在场景中添加更多节点时的图形,以及一种快速确定网格点是否为的方法(对照MyObject): 1.外部 2.在…内 3.洞内 您工作的空间有多大 用一个简单的矩形网格模拟整个过程,假设偶数行是交错的 任何节点都有坐标[x,y] 对于(y%2==0)相邻

我的对象是在蜂窝网格中构建的。所有对象都是连接的。红线表示每个节点之间的连接。我听说二进制空间分区(BSP)树可以很好地解决这类问题,但不确定在我的例子中前后是什么

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

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


您工作的空间有多大

用一个简单的矩形网格模拟整个过程,假设偶数行是交错的

任何节点都有坐标
[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]
每个节点可以是满的或空的,也可以检查或不检查空节点。最初,不会检查所有空节点

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

  • 如果节点已满-它不属于孔,则属于形状
  • 如果节点为空,则将节点标记为选中状态
  • 迭代所有邻居节点:
    • 跳过标记为已选中或已满的节点
    • 递归地重复搜索所有未选中的节点
  • 如果递归将您带入任何
    xMAX\u Y
    ,则中止。节点位于形状外部
  • 如果递归结束时未找到运动场的边,则节点属于孔
此外,现在可以重复该过程,将所有选中的节点转换为外部节点或孔,以供以后参考

如果您想在开始时为所有孔建立索引,则可以更容易地在运动场边界处找到所有未检查的空节点(
x==0,y==0,x==MAX\u x,y==MAX\u y
),并使用上述算法将它们标记为外部。所有剩余的空节点都是孔

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

我的建议:

  • 在二维笛卡尔空间中为每个平铺指定一个中心位置
  • 构建包含所有中心位置的二叉搜索树(BST)
  • 对于查询点,使用该BST查找到最近占用的磁贴的相对位置
  • 使用一些几何公式确定该位置是在瓷砖内部还是外部,如:
或者,使用正方形进行近似处理,例如,如下所示:


我需要美味的早晨咖啡,但我不知道如何使用科斯塔的咖啡机,但是当我不可避免地在天花板上弄到咖啡渣和牛奶时,我可以尝试在请求帮助之前煮一杯咖啡。对于您的问题,您也需要这样做-展示您迄今为止所做的尝试,无论是代码(最佳)还是您所做的任何研究如果您想使用ready implementation boost提供的几何图形库。了解更多关于更大问题的信息,可能有助于了解最佳解决方案。@AleksanderFular boost在我的平台上不可用。不过,C++11 std的东西还可以。@Bojangles到目前为止,我的代码只是一个在图片中绘制的线段列表。我想这对这个问题没有多大帮助。
class Node {
    Point position; //center position
    Point grid; //honeycomb grid system
}

class MyObject {
    Node lookup(Point grid);
}