Welche Methode wird zum Speichern großer geometrischer Objekte in einem Quadtree bevorzugt?


15

Wenn Sie geometrische Objekte in einem Quadtree (oder Octree) platzieren, können Sie Objekte, die größer als ein einzelner Knoten sind, auf verschiedene Arten platzieren:

  1. Platzieren Sie die Referenz des Objekts in jedem Blatt, für das es enthalten ist
  2. Platzieren Sie die Referenz des Objekts in dem tiefsten Knoten, für den es vollständig enthalten ist
  3. Sowohl # 1 als auch # 2

Beispielsweise:

Bildbeschreibung hier eingeben

In diesem Bild können Sie den Kreis entweder in alle vier Blattknoten (Methode 1) oder nur in den Wurzelknoten (Methode 2) oder in beide (Methode 3) platzieren.

Welche Methode ist für die Abfrage des Quadtrees üblicher und warum?


1
Auf jeden Fall sollte es eine Referenz sein. Ich beabsichtige zu fragen, ob es zum Zwecke der Abfrage des Quadtrees Verweise in den Blättern, Nicht-Blättern oder beiden geben sollte.
nsantorello

PS Bearbeitet, um hoffentlich die Absichten der Frage klarer zu machen.
nsantorello

Welche Abfrage möchten Sie unterstützen?
Joe

@ Joe Ich interessiere mich besonders für Kollisionserkennung, räumliche Indizierung und Region / Kegelstumpf-Culling.
nsantorello

1
@nsantorello Die Regel kann unterschiedlich sein, je nachdem, welche dieser Abfragen Sie unterstützen möchten. Dies scheint jedoch für die Kollisionserkennung sehr relevant zu sein: stackoverflow.com/questions/4434335/…
Joe,

Antworten:


8

Angenommen, Sie speichern eine Referenz und nicht das Objekt selbst, kann es je nach Anwendung sinnvoll sein, dies anders zu tun.

Wenn Sie beispielsweise Kollisionen mit diesem (durchgezogenen) Kreis berechnen und die Kollision in der unteren linken Ecke auftritt, ist es einfacher, direkt von diesem Blatt aus auf alle Geometrien in diesem Blatt zuzugreifen (Methode 3). (ohne den Baum nach oben durchlaufen und die geerbte Geometrie bestimmen zu müssen). Angenommen, Sie haben nur Quadtrees zum Zeichnen von Geometrie verwendet, und Sie möchten Methode 1 verwenden, da es nur Sinn macht, etwas in den Knoten zu zeichnen, für den es vollständig enthalten ist (es wäre schwieriger, herauszufinden, welcher Abschnitt vorhanden ist für jeden Blattknoten zeichnen und wo).

Was allgemeiner ist, meine einzige Erfahrung mit Quadtrees ist das Schreiben einer N-Body-Simulation, bei der die geometrischen Objekte wirklich nur Punkte waren, die keine Fläche hatten, daher kann ich das nicht definitiv beantworten.


Danke Rafe, ich denke du hast recht, dass es auf die Anwendung ankommt.
nsantorello

6

Einer der Vorteile eines Quadtree besteht darin, dass Sie einen Knoten nicht in seine untergeordneten Knoten aufteilen müssen, wenn alle untergeordneten Knoten die gleichen Informationen enthalten würden. Dies kann viel Speicherplatz einsparen und die Verarbeitung beschleunigen.

Nach diesem Prinzip halte ich es für sinnvoller, es nur im Wurzelknoten zu speichern (Methode 2). Es könnte Ihnen viel Speicherplatz ersparen, und ich denke, es würde auch die Verarbeitung erleichtern. Wenn Sie beispielsweise versuchen, Schnittpunkte des Kreises mit einer Linie zu finden, die durch drei der Blattknoten verläuft, müssen Sie entweder den Schnittpunkt für jeden Blattknoten separat berechnen oder sich daran erinnern, dass Sie diesen Kreis bereits geschnitten haben.

Wenn Sie dagegen Objekte in Blattknoten haben, können Sie Fehlalarme beseitigen (Objekte, die auf Schnittpunkte überprüft werden müssen, da sie sich im richtigen Knoten befinden, sich jedoch nicht schneiden).

Ich denke also, dass beide Ansätze ihren Nutzen haben und ich bin mir nicht sicher, wie ich mich für einen entscheiden soll.

Ich würde wahrscheinlich Ansatz 3 nicht verwenden, da ich keine positiven Ergebnisse sehe.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.