チャンクされた QuadTree 地形を作成しており、2 つのノード間で詳細レベルの違いが 1 レベルを超えないようにしようとしています。コンストラクターの現在のコードは次のとおりです。
QuadNode::QuadNode(Rect area, QuadNode * p, QuadRoot * r)
{
Root = r;
Parent = p;
Level = p->Level + 1;
InitializeGeometry(area);
for(int iii = 0; iii < 4; iii++)
Children[iii] = 0;
for(int iii = 0; iii < 4; iii++)
{
if(QuadrantNeedsChild(iii))
Children[iii] = new QuadNode(GetRect(iii), this, Root);
}
}
そして、それはうまくいきます。しかし、2 つの隣接ノード間の差を 1 レベル以下にするために、これをコンストラクターの最後に追加しようとしています。
QuadNode * neighbour;
for(int direction = 0; direction < 4; direction++)
{
neighbour = FindNeighbour(direction);
if(neighbour)
{
while(Level - neighbour->Level > 1)
{
neighbour->Subdivide();
neighbour = FindNeighbour(direction);
//neighbour should now be a child of the previous neighbour
}
}
}
しかし、そのスタックはオーバーフローします。私が考える理由の 1 つは、Children[iii] = new QuadNode(GetRect(iii), this, Root);
ステートメントの代入部分が実行FindNeighbour()
されず、子が適切な隣人を見つけるように設定する必要があるためです。しかし、コードが実際に2neighbour = FindNeighbour(direction);
行目に到達することはなく、何が原因なのかわからないため、それが唯一の問題ではないと思います。
ツリーのベース作成後に新しい関数でその 2 番目のコード スニペットを実行すると、多かれ少なかれ機能しますが、新しく作成されたノード自体がレベル差 > 1 を作成しないようにするために複数のパスが必要です。可能であれば、コンストラクターにこのコードを含めることをお勧めします。誰でもこれを達成する方法を考えることができますか?
QuadrantNeedsChild(int quadrant)
レベルが8を超えないようにするのに役立つ場合に備えて、クラスに関するいくつかのメモ。Subdivide()
単純Children[iii] = new QuadNode(GetRect(iii), this, Root);
にすべての象限で実行されます。FindNeighbour(int direction)
親または祖先を返すことができます。たとえば、D が北隣を探している場合、B が次のように分割されていなければ、その祖父母 (ダイアグラム全体) を取得します。
- - - - - -
| | |
| A | B |
| | |
|- - - - - -|
| | D| |
| C |-----|
| | | |
- - - - - -
サブディバイド機能は、範囲外のクアドラントが指定されている場合、特定のクアドラントまたはすべてのクアドラントをサブディバイドします。
void QuadNode::Subdivide(int quadrant)
{
if(quadrant > -1 && quadrant < 4)
{
if(!Children[quadrant])
Children[quadrant] = new QuadNode(GetRect(quadrant), this, Root);
}
else
for(int iii = 0; iii < 4; iii++)
if(Children[iii] == 0)
Children[iii] = new QuadNode(GetRect(iii), this, Root);
}