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