2

私は四分木を作っているので、そこにオブジェクトを挿入するのを手伝う必要があります。私はそれを行うという概念を理解していますが、再帰とJavaが変数を渡す方法は得意ではありません。

ルートと呼ばれるノードを含むQuadtreeクラスがあります。Nodeクラスには、その中に4つのノードがあります。これはそれを構成する4つのクワッドです。クワッドツリーを作成するとルートノードが作成され、createChildrenQuads()を呼び出すまで、各ノード内の4つのノードは作成されません。ただし、ルートノードの場合、クワッドツリーを作成するときにそのメソッドが呼び出されます。

したがって、アイテムをノードに挿入する方法についての私の思考プロセスは次のとおりです。

  1. ルートノードから開始します
  2. 各ノードの場合:
    1. 現在のノードの子クワッドのどれが現在のアイテムに適合するかを確認してください
    2. それらの1つに収まる場合は、そのノードに挿入します(再帰メソッドを呼び出して最初からやり直します)
    3. いずれにも当てはまらない場合は、現在のノードのオブジェクトのリストに追加して実行します

これに基づいて、私はこれを作成しました:

public void insert(Entity e) {
    insert(root, e);
}

private void insert(Node n, Entity e){
    Rectangle temp = e.getRectangle();

    if (!n.childrenHaveBeenCreated())
        n.createChildrenQuads(n.m_quadRect);

    //first check which node it can go into

    if ( n.NW.m_quadRect.contains(temp)) {
        n.NW = insert(n.NW, e);
        return;
    }

    if ( n.NE.m_quadRect.contains(temp)) {
        n.NE = insert(n.NE, e);
        return;
    }

    if ( n.SW.m_quadRect.contains(temp)) {
        n.SW = insert(n.SW, e);
        return;
    }

    if ( n.SE.m_quadRect.contains(temp)) {
        n.SE = insert(n.SE, e);
        return;
    }

    n.m_objects.add(e);
}

四分木に関しては、私が持っているロジックは問題ないと思います。コードをデバッグすると、すべてが正常に機能しているように見えます。ただし、私の問題は、Javaがパラメーターを参照ではなく値で渡すことであると考えています。そのため、正しい場所にパラメーターを追加しても、ローカル変数であるため、「保存」されません。それが問題だと思いますが、間違っている可能性があります。

そこで、insertメソッドが現在のノードを返すように少し変更して、すべてが正しく「保存」されるようにしました。これは私が思いついたものです:

public void insert(Entity e) {
    root = insert(root, e);
}

private Node insert(Node n, Entity e) {
    Rectangle temp = s.getRectangle();

    if (!n.childrenHaveBeenCreated())
        n.createChildrenQuads(n.m_quadRect);

    //first check which node it can go into

    if ( n.NW.m_quadRect.contains(temp)) {
        n.NW = insert(n.NW, e);
        return n;
    }

    if ( n.NE.m_quadRect.contains(temp)) {
        n.NE = insert(n.NE, e);
        return n;
    }

    if ( n.SW.m_quadRect.contains(temp)) {
        n.SW = insert(n.SW, e);
        return n;
    }

    if ( n.SE.m_quadRect.contains(temp)) {
        n.SE = insert(n.SE, e);
        return n;
    }

    n.m_objects.add(e);
    return n;
}

しかし、私はまだ同じ問題を抱えています。今、私は自分の問題が何であるかわかりません。

これをゲームに使用していて、すべてのクワッドがある場所の周りに輪郭を描くようにしています。クリックしてエンティティをクワッドツリーに追加できます。私のコードの両方のバージョンは同じように動作するようです。クワッドツリーにエンティティを追加すると、エンティティが追加されてそこにとどまるため、Javaが参照を渡す方法が原因で、エンティティが「保存」されないという私の理論は間違っていると思います。

ただし、私のコードは(少なくとも私の心の中では)各エンティティを可能な限り低いレベルでクアッドツリーに配置し、ツリーを下るときに各ノードに新しい子クワッドを作成する必要があります。ただし、実際に発生するのは、新しいエンティティを現在のクワッドに追加するだけで、ツリーをまったく下がらないように見える場合や、レベルが1〜2下がる場合があります。これは、簡単に数個下がることができる場合です。より多くのレベル。

誰かがコードや私のロジックに何か問題があるのを見ることができますか?

4

1 に答える 1

3

それがあなたのプログラムを構成した方法だと思います。四分木はすべての四分円をテストしますが、常に最後に要素を追加します...したがって、再帰的に一番下に向かいますが、戻る途中で常に最後に実行されるn.m_objects.add(e); ため、場所が変更されます再帰を戻る途中で追加されます。あなたはそれをより多くのものに変える必要がありますIf (..) else if (...) else (...)

于 2011-10-20T01:08:52.557 に答える