我的物体是用蜂窝网格构建的。所有对象都已连接。红线表示每个节点之间的连接。我听说二元空间分区(BSP)树很适合这种类型的问题,但不知道在我的情况下前后是什么。
我使用蜂窝网格系统实现了查找,如图所示(x,y)
class Node {
Point position; //center position
Point grid; //honeycomb grid system
}
class MyObject {
Node lookup(Point grid);
}
当用户在场景中添加更多节点时,我需要一个表示图形的数据结构,以及一种快速确定网格点是否为(MyObject
)的方法:
外面的
在里面
3.在洞内
答案 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)
我的建议:
或者,使用正方形进行近似处理,例如,如下所示: