Einfaches Verständnis des BSP-Baums und detaillierte Erklärung der räumlichen Indexideen des Binärbaums

BSP-Baum

Der Binärraum-Partitionierungsbaum (BSP-Baum) wird auch als Binärraum-Partitionierungsbaum oder BSP-Baum bezeichnet

Bild

Bild

Algorithmus zum Generieren eines BSP-Baums aus einer Liste von Polygonen

  • Wählen Sie ein Polygon P aus der Liste aus.
  • Erstellen Sie einen Knoten N im BSP-Baum und fügen Sie P zur Polygonliste des Knotens hinzu.
  • Für andere Polygone in der Liste:
    • Wenn das Polygon vollständig vor der Ebene liegt, die P enthält, verschieben Sie das Polygon in die Knotenliste vor P.
    • Wenn das Polygon vollständig hinter der Ebene liegt, die P enthält, verschieben Sie das Polygon in die Liste der Knoten hinter P.
    • Wenn das Polygon die Ebene schneidet, die P enthält, teilen Sie es in zwei Polygone auf und verschieben Sie sie in die Liste der entsprechenden Polygone hinter und vor P.
    • Wenn das Polygon in der Ebene liegt, die P enthält, fügen Sie es der Liste der Polygone am Knoten N hinzu.
  • Wenden Sie diesen Algorithmus auf die Liste der Polygone vor P an.
  • Wenden Sie diesen Algorithmus auf die Liste der Polygone nach P an.

Nachteile von BSPs

  • Das Generieren eines BSP-Baums kann zeitaufwändig sein.
  • BSP löst das Problem der Bestimmung sichtbarer Oberflächen nicht.

Der Zweck von BSP

  • Es wird zur Kollisionserkennung in 3D-Videospielen und in der Robotik verwendet.

  • Es wird für Raytracing verwendet

  • Dabei geht es um die Verarbeitung komplexer räumlicher Szenen.

    KD-Baum

    Ideen für den räumlichen Index eines Binärbaums

    Intuition

    Wie finden wir anhand einer Reihe vorhandener Beispieldaten und eines abgefragten Datenpunkts (roter fünfzackiger Stern) die 15 Punkte, die dem fünfzackigen Stern am nächsten liegen?
    1.png

    Lassen Sie die programmatische Umsetzung für einen Moment außer Acht und denken Sie darüber nach, wie sich ein Mensch subjektiv verhält. Nun, er wird auf jeden Fall die Entfernung jedes Punktes in der Nähe des Fünfecks berechnen und dann die 15 nächstgelegenen auswählen. Dies erfordert möglicherweise nur zwanzig oder dreißig Entfernungsberechnungen anstelle von 300.
    2.png

    Wie in der Abbildung gezeigt, werden nur die Punkte im violetten Kreis berechnet.

    Aha! Hier kommt das Problem. Das von uns erwähnte „in der Nähe“ beinhaltet bereits das Konzept der Entfernung. Wie können wir ohne Berechnung wissen, welcher Punkt „in der Nähe“ zum fünfzackigen Stern liegt? Warum erkennen wir „in der Nähe“ sofort und Computer nicht? Denn wenn wir dieses Bild betrachten, ist die Eingabe, die wir erhalten, ein Bild mit dem Konzept der Entfernung, aber wenn der Computer Berechnungen durchführt, erhält er Koordinatendaten ohne das Konzept der Entfernung. Wenn Sie möchten, dass jemand künstlich die 15 nächstgelegenen Koordinaten aus 300 Koordinatensätzen auswählt, ohne ihm ein Bild zu geben, kann er sich keine Mühe machen und muss alle 300 Koordinaten einmal berechnen.

    Auf diese Weise müssen wir die trockenen Koordinatendaten verarbeiten, den Raum in kleine Teile aufteilen und die Informationen auf vernünftige Weise speichern, damit wir „nahe“ Punkte leicht lesen können.

    schneiden

    Dieses gefährliche Kaninchen ist zurück! Es hat heute vier Tattoos bekommen, Herzen, Halbmonde, Sterne und Tränen, unten ist sein Foto.
    3.jpg

    Beantworten wir eine einfache Frage: Welches Tattoo kommt einem Herz auf diesem Foto am nächsten? Denken Sie daran, dass wir im vorherigen Artikel die Größe und das Gewicht jedes Kaninchens als Merkmal ausgewählt haben; dieses Mal ist es anders. In diesem Problem sind die Merkmale jedes Tattoos die Koordinaten der horizontalen und vertikalen Achsen auf der Fotoebene.

    Wenn wir für dieses Problem eine grobe Berechnung durchführen, müssen wir die Entfernung dreimal berechnen (jeweils einmal für den Mond, die Tränen und die Sterne). Als nächstes müssen wir den gesamten Raum gleichmäßig nach links und rechts sowie nach oben und unten aufteilen und den unterteilten kleinen Raum in Form eines Binärbaums aufzeichnen, damit wir benachbarte Punkte schnell lesen und speichern können Betrag der Berechnung.

    Ok, schneiden wir das Kaninchen in der Mitte vertikal in zwei Hälften
    4.jpg

    Dann von der Mitte her vierteln
    5.jpg

    Vertikal in Achtel teilen
    6.jpg

    Zum Schluss noch einmal horizontal schneiden. Diesmal sind einige Felder komplett leer, also verwerfen wir sie und erhalten 14 Kopien:
    7.jpg

    Dann machen wir das ausgeschnittene Bild entsprechend der Beziehung von oben, unten, links und rechts in einen Binärbaum. Jeder Knoten des Baums ist ein Diagramm, und seine beiden Zweige sind Teilgraphen, die durch diesen Graphen gleichmäßig geteilt werden.
    8.jpg

    Es ist ersichtlich, dass diese Baumstruktur viele lokale Informationen enthält, da jeder ihrer Knoten gleichmäßig nach oben und unten oder links und rechts unterteilt ist. Wenn also der Abstand zwischen zwei Punkten im Baum relativ gering ist, ist dies der Fall tatsächlich Die Entfernung ist relativ gering.

    suchen

    Als nächstes müssen wir anhand dieses Binärbaums das Tattoo finden, das dem Herzen am nächsten liegt.

    Beginnen Sie ganz oben im Baum und suchen Sie nach unten, um den untersten Knoten zu finden, der ein Herz enthält. Diese Operation ist sehr einfach, da jede Unterteilung entweder entlang einer bestimmten vertikalen Linie x = a oder entlang einer horizontalen Linie y = a erfolgt. Sie müssen also nur beurteilen, ob die x- oder y-Achsenkoordinaten des Liebesherzens größer als a oder sind kleiner als a, und Sie wissen, dass es sich um Zweige links oder rechts handelt.
    9.jpg

    Nachdem wir die Liebe gefunden hatten, stiegen wir den gleichen Weg hinauf. Ich bin nur einen Abschnitt hinaufgestiegen und habe zwei Tätowierungen auf dem Gesäß gefunden
    10.png

    Hier ist zu erkennen, dass bei 8 gleichen Teilungen das Liebesherz und der Mond im gleichen Bereich liegen. Sie sind in gewisser Weise „nah“, aber wir sind uns noch nicht sicher, ob sie am nächsten sind, also klettern Sie weiter nach oben, um sie zu finden. Erklimmen Sie weiter zwei weitere Knoten, und es gibt keine anderen Tätowierungen als das Herz und den Mond. In diesem Knoten unten
    11.png

    Wir haben festgestellt, dass der Abstand zwischen dem Herzen und dem Mond (rote Linie) kleiner ist als der Abstand zwischen dem Herzen und der Trennlinie (blaue Linie), das heißt, egal, was sich auf der rechten Seite der Trennlinie befindet, das Tattoo auf dieser Seite kann nicht näher am Herzen sein. Daher kann man davon ausgehen, dass die Figur, die dem Liebesherz am nächsten ist, der Mond ist.

    Auf diese Weise berechnen wir den Abstand zwischen Herz und Mond und den Abstand zwischen Herz und Trennlinie nur einmal, anstatt den Abstand zwischen Herz und den anderen drei Tattoos separat zu berechnen. Und Sie sollten wissen, dass die Berechnung des Abstands zwischen dem Herzen und der Trennlinie sehr einfach ist, dh die Differenz (Absolutwert) zwischen der x-Koordinate des Herzens und der x-Koordinate der Trennlinie, wodurch a gespart wird viel im Vergleich zur Berechnung des Abstands zwischen zwei Punkten Berechnungen.

    Problem

    Ah, aber es kann auch sein, dass diese Suche nach dem nächstgelegenen Punkt nicht so reibungslos verlief. Nachdem wir in der obigen Berechnung den Mond gefunden haben, der näher am Herzen liegt, stellen wir fest, dass der Abstand zwischen dem Herzen und der Trennlinie relativ groß ist, sodass wir sicher sind, dass der Mond tatsächlich am nächsten ist. Bei einem näheren Tattoo auf der anderen Seite der Trennlinie ist die Situation jedoch etwas komplizierter.

    Sagen wir einfach dieses Kaninchen, ich habe zwei weitere Tattoos hinzugefügt, ein Blatt und einen Kreis.
    12.png

    Diese beiden Tätowierungen werden entsprechend zur binären Baumteilung hinzugefügt. Wir wollten das Tattoo finden, das dem Herzen am nächsten liegt, also suchten wir weiter nach unten, um zuerst das Herz zu finden.
    13.jpg

    Wir fanden ein Blatt Papier und notierten das dem Herzen am nächsten gelegene Tattoo im besuchten Knoten und den entsprechenden Abstand. Jetzt ist das Papier noch leer.
    14.png

    Als ich einen Abschnitt hinaufstieg, stellte ich fest, dass sich in einem anderen Zweig dieses Abschnitts ein Mond befand, also rannte ich hinunter, um die Koordinaten des Mondes zu überprüfen, berechnete den Abstand zwischen dem Herzen und dem Mond und hielt ihn auf Papier fest (Grafik = Mond). , Abstand = d1) (Grafik = Mond , Abstand=�1).

    Gehen Sie zurück zum Knoten im blauen Kreis, klettern Sie nach oben und klettern Sie weiter nach oben. Wir finden, dass d1�1 (rote Linie) größer ist als der Abstand zwischen dem Liebesherz und der Trennlinie (blaue Linie).
    new1.png

    Das heißt, dass es möglicherweise nähere Punkte auf der anderen Seite der Trennlinie gibt. Beginnen Sie also bei einem anderen Zweig und suchen Sie nach unten, um ... zu finden.
    16.png

    In einem anderen Zweig gehen wir zurück zum Kreis und berechnen die Entfernung d2 von ihm zum Herzen. Dabei stellen wir fest, dass d2 > d1, was weiter als der Mond ist, also verwerfen wir es.

    Wenn wir einen weiteren Abschnitt nach oben gehen, stellen wir fest, dass d1 (rote Linie) größer ist als der Abstand zwischen dem Liebesherz und der Trennlinie (blaue Linie).
    new2.png

    Am anderen Ende der Tangente könnte es also eine nähere Tätowierung geben, also suchen wir den anderen Zweig entlang ...
    18.png

    Habe die Blätter gefunden. (Glücklicherweise werden in diesem Zweig nur Blätter gefunden. Wenn mehr Grafiken vorhanden sind, ist eine mehrschichtige Rekursion erforderlich. Der spezifische Prozess wird in den folgenden ausführlichen Kapiteln erläutert.) Um den Abstand zwischen Blättern und Herzen zu berechnen, erhalten wir d3, und finde heraus, dass d3<d1 näher als der Mond ist, also aktualisiere die Aufzeichnung auf dem Papier als (Tätowierung=Blatt, Abstand=d3).

    Als wir einen weiteren Abschnitt hinaufstiegen, stellten wir fest, dass d3 kleiner ist als der Abstand zwischen dem Liebesherz und der Trennlinie, sodass die Daten auf der anderen Seite nicht berücksichtigt werden müssen.
    new3.png

    Dieses Mal sind wir auf die Spitze des Baumes geklettert und haben die Suche abgeschlossen. Das auf dem Papier aufgezeichnete (Blatt, d3) ist das nächstgelegene Tattoo und die entsprechende Entfernung.
    20.png

    Epilog

    Wenn wir im obigen Algorithmus einen Punkt gefunden haben, der näher als die Trennlinie liegt, besteht keine Notwendigkeit, weiter nach Punkten auf der anderen Seite der Trennlinie zu suchen, da diese nur weiter entfernt sind. Durch die Aufteilung des gesamten Raums und die Aufzeichnung in einer Baumstruktur müssen wir daher nur einige Bereiche in der Nähe des Problempunkts durchsuchen, um den nächstgelegenen Datenpunkt zu finden, wodurch viele Berechnungen eingespart werden.

    Referenz [ [Quantifizierungs-Klassenzimmer] Ideen des KD-Baum-Algorithmus - JoinQuant Quantisierungs-Klassenzimmer - JoinQuant ]

Supongo que te gusta

Origin blog.csdn.net/weixin_43925768/article/details/129138298
Recomendado
Clasificación