Quadtree

Quadtree (også quadtree , 4-tree , engelsk  quadtree ) er et træ , hvor hver intern node har præcis 4 efterkommere. Quadtrees bruges ofte til rekursivt at opdele et 2D-rum i 4 kvadranter (regioner). Områder er firkanter, rektangler eller har en vilkårlig form. Det engelske udtryk quadtree blev opfundet af Raphael Finkel og John Bentley .i 1974. En lignende opdeling af rummet er kendt som et Q-træ. Fælles træk ved forskellige typer quadtrees:

Klassifikation

Quadtrees kan klassificeres efter den type data, de repræsenterer - rum, punkter, linjer, kurver. De kan også opdeles efter, om træets form afhænger af den rækkefølge, dataene behandles i. Nogle typer quadtrees:

Region quadtree

Region quadtree repræsenterer enhver del af et todimensionelt rum ved at opdele det i 4 kvadranter, underkvadranter og så videre, hvor hvert blad af træet svarer til et bestemt område .  Hver knude i træet har enten 4 børn eller slet ingen (blade). Space-partitionerende quadtrees er ikke fuldt ud træer, fordi positionen af ​​underkvadranterne er uafhængig af dataene. Et mere korrekt navn er præfikstræer ( eng. trie ).  

Et træ med højden n kan bruges til at repræsentere et billede bestående af 2n × 2n pixels, hvor hver pixel har en værdi på 0 eller 1. Træets rod repræsenterer hele billedets område. Hvis ikke alle pixels kun er nuller eller kun enere, går den i stykker. I dette tilfælde svarer hvert ark til et sæt pixels - enten kun nuller eller kun en.

Rumbrydende quadtrees kan også bruges til at repræsentere den variable opløsning af et datasæt. Temperaturinformation kan f.eks. lagres som et quadtree, hvor hver knude gemmer den gennemsnitlige temperatur for sine underknudepunkter.

Hvis træet bruges til at repræsentere et sæt punkter (for eksempel bredde- og længdegraden af ​​positionerne i nogle byer), underinddeles regionerne, indtil bladene ikke indeholder mere end ét punkt.

punkt quadtree

Point quadtree er en type binært træ , der bruges til at gemme information om punkter på et plan .  Træets form afhænger af den rækkefølge, dataene er angivet i. Brugen af ​​sådanne træer er meget effektiv til at sammenligne ordnede punkter i planet, og behandlingstiden er O(log n) .

Nodestruktur

Knuden på quadtreeet, der gemmer information om planets punkter, ligner knudepunktet i et binært træ, med det eneste forbehold, at den første knude har fire børn (en for hver kvadrant) i stedet for to ("højre" og " venstre"). Node-nøglen har to komponenter (for x- og y -koordinater ). Således indeholder en træknude følgende information:

  • 4 pointere: quad['NW'] , quad['NE'] , quad['SW'] , og quad['SE'] ,
  • punkt beskrevet som følger:
    • nøgletast , udtrykker normalt x- og y- koordinater ,
    • værdien værdi , for eksempel et navn.

Edge quadtree

Quadtrees, der gemmer information om linjer ( kant quadtree ), bruges til at beskrive lige linjer og kurver .  Kurverne beskrives ved nøjagtige tilnærmelser ved at opdele cellerne i meget små. Dette kan få træet til at blive ubalanceret, hvilket betyder indekseringsproblemer.

Polygonal kort quadtree

Quadtrees, der gemmer information om polygoner ( eng.  polygonal map quadtree/PMQuadtree ) kan indeholde information om polygoner, inklusive degenererede (der har isolerede hjørner eller ansigter) [1] .

Use cases

Quadtrees er en todimensionel analog af oktanttræer ( eng.  octree ).

Pseudokode

Den følgende kode demonstrerer brugen af ​​quadtrees til at gemme punktinformation. Andre tilgange til byggeri er også mulige.

Datastrukturer

Følgende datastrukturer forventes at blive brugt.

// En simpel struktur til at repræsentere et punkt eller vektorstruktur XY { flyde x; flyde y; funktion __construct( float _x, float _y) {...} } // Axis-aligned bounding box (AABB), halvdimension centreret struktur AABB { XY center; XY halvdimension; funktion __construct( XY center, XY halfDimension) {...} funktion indeholderPunkt( XY p) {...} funktion skærer AABB( AABB anden) {...} }

QuadTree-klassen

Klassen repræsenterer selve 4-træet og rodnoden.

klasse QuadTree { // Konstant - antallet af elementer, der kan lagres i en node konstant int QT_NODE_CAPACITY = 4; // En akse-justeret afgrænsningsboks // viser grænserne for træets AABB - grænse; // Points Array af XY [størrelse = QT_NODE_CAPACITY] punkter; // Efterkommere af QuadTree* nordvest; QuadTree* nordøst; QuadTree* sydvest; QuadTree* sydøst; // Methods function __construct( AABB _boundary) {...} function insert( XY p) {...} function subdivide() {...} // Opret 4 børn, der deler kvadranten i 4 lige dele funktion queryRange( AABB- område) {...} }

Indsæt

Følgende metode indsætter et punkt i den relevante kvadrant af træet, opdeling om nødvendigt.


klasse QuadTree { ... // Indsæt punkt funktion indsæt( XY p) { // Ignorer objekter, der ikke er i træet, hvis (!boundary.containsPoint(p)) returnerer false ; // Objekt kan ikke tilføjes // Indsæt hvis der er plads if (points.size < QT_NODE_CAPACITY) { punkter tilføje(p); returnere sandt ; } // Dernæst skal du opdele området og tilføje et punkt til enhver knude , hvis (nordvest == null ) underinddele(); if (nordvest->indsæt(p)) returnerer sand ; if (nordøst->indsæt(p)) returnerer sand ; if (sydvest->indsæt(p)) returnerer sand ; if (sydøst->indsæt(p)) returnerer sand ; // Af en eller anden grund kan indsættelsen mislykkes (hvilket den egentlig ikke burde) returnere false ; } }

Indtastning af området

Den følgende metode finder alle punkter inden for et bestemt interval.

klasse QuadTree { ... // Find punkter inden for rækkevidde funktion queryRange( AABB range) { // Forbered et array for resultatet Array af XY pointsInRange; // Annuller hvis rækkevidde ikke matcher kvadrant hvis (!grænse.insersectsAABB(område)) returnerer pointInRange; // Tom liste // Tjek aktuelle niveauobjekter for ( int p := 0; p < points.size; p++) { if (range.containsPoint(point[p])) pointsInRange.append(points[p]); } // Stop hvis der ikke er flere børn hvis (nordvest == null ) returnerer pointInRange; // Tilføj alle underordnede point pointsInRange.appendArray(nordvest->queryRange(interval)); pointsInRange.appendArray(nordØst->queryRange(interval)); pointsInRange.appendArray(sydvest->queryRange(interval)); pointsInRange.appendArray(sydøst->queryRange(interval)); returnere pointInRange; } }

Se også

Links

Noter

  1. Hanan Samet og Robert Webber. "Lagring af en samling af polygoner ved hjælp af Quadtrees". ACM Transactions on Graphics Juli 1985: 182-222. infolab . Web. 23. marts 2012
  2. Tomas G. Rokicki. En algoritme til at komprimere rum og tid (1. april 2006). Hentet 20. maj 2009. Arkiveret fra originalen 2. oktober 2012.
  3. Henning Eberhardt, Vesa Klumpp, Uwe D. Hanebeck, Density Trees for Efficient Nonlinear State Estimation , Proceedings of the 13th International Conference on Information Fusion, Edinburgh, Storbritannien, juli 2010.

Kilder

  1. Raphael Finkel og JL Bentley. Quad Trees: A Data Structure for Retrieval on Composite Keys  //  Acta Informatica : journal. - 1974. - Bd. 4 , nr. 1 . - S. 1-9 . - doi : 10.1007/BF00288933 .
  2. Mark de Berg, Marc van Kreveld, Mark Overmars og Otfried Schwarzkopf. Beregningsgeometri  (ubestemt) . — 2. reviderede. - Springer-Verlag , 2000. - ISBN 3-540-65620-0 . Kapitel 14: Quadtrees: pp. 291-306.
  3. Samet, Hanan; Webber, Robert [ http://infolab.usc.edu/csci585/Spring2008/den_ar/p182-samet.pdf Lagring af en samling af polygoner ved hjælp af

Quadtrees] (juli 1985). Dato for adgang: 23. marts 2012. Arkiveret fra originalen 2. oktober 2012.

Eksterne links