Quadtree

Un Quadtree

Un quadtree ou arbre quaternaire (arbre Q) est une structure de données de type arbre dans laquelle chaque nœud a quatre fils. Les quadtrees sont le plus souvent utilisés pour partitionner un espace bidimensionnel en le subdivisant récursivement en quatre nœuds.

Les quadtrees sont l'analogie bidimensionnelle des octrees. Le nom est formé à partir de quad et de tree (arbre, en anglais). Chaque nœud d'un quadtree subdivise l'espace qu'il représente en quatre sous-espaces.

Types

Les quadtrees peuvent être classés selon le type de données qu'ils représentent, incluant régions, points, lignes et courbes. Voici quelques types communs de quadtrees :

Le quadtree «région»

Le quadtree «région» représente une partition de l'espace en deux dimensions en décomposant la région en quatre quadrants égaux, puis chaque quadrant en quatre sous-quadrants, et ainsi de suite, avec chaque «nœud terminal» comprenant des données correspondant à une sous-région spécifique. Chaque nœud de l'arbre a exactement : soit quatre enfants, soit aucun (cas d'un nœud terminal). Le quadtree «région» est un type d'arbre préfixe.

Un quadtree «région» ayant une profondeur n peut être utilisé pour représenter une image de 2n × 2n pixels, où la valeur de chaque pixel est 0 ou 1. Le nœud parent représente l'image tout entière. Si les pixels d'une région donnée ne sont pas tous à 0 ou tous à 1, celle-ci est subdivisée. Dans une telle représentation d'une image, chaque nœud terminal représente un bloc de pixels qui sont tous à 0 ou tous à 1.

Un quadtree «région» peut également être utilisé comme une représentation de résolution variable d'un champ de données. Par exemple, les températures d'une zone peuvent être stockées dans un quadtree, dans lequel chaque nœud terminal stocke la température moyenne de la sous-région qu'il représente.

Si un quadtree «région» est utilisé pour représenter un ensemble de points (par exemple, les latitudes et longitudes d'un groupe de villes), les régions sont subdivisées jusqu'à ce que chaque nœud terminal ne contienne plus qu'un point.

Le quadtree «point»

Le quadtree «point» est une adaptation d'un arbre binaire, utilisé pour représenter une donnée «point» à deux dimensions (par exemple, une coordonnée géographique). Il partage les caractéristiques de tous les quadtrees tout en étant un véritable arbre, puisque le centre d'une subdivision est toujours sur un point. La forme de l'arbre dépend de l'ordre dans lequel les données sont traitées. Une telle représentation est souvent très efficace en comparaison des données «points» ordonnées bidimensionnelles, opérant habituellement en un temps O(log n).

Structure d'un nœud d'un quadtree «point»

Le nœud d'un quadtree «point» est similaire à celui d'un arbre binaire, avec cette grosse différence : le premier possède quatre pointeurs (un pour chaque quadrant), tandis que le second n'en possède que deux («gauche» et «droite»). Une autre différence, une clé est habituellement décomposée en deux parties, se référant aux coordonnées x et y. Un nœud contient donc les informations suivantes :

  • quatre pointeurs : quad['NO'], quad['NE'], quad['SO'] et quad['SE']
  • un point, qui à son tour contient :
    • une clé : habituellement des coordonnées (x,y)
    • une valeur : par exemple, un nom.

Le quadtree «bord»

Les quadtrees «bord» sont spécifiquement utilisés pour stocker des lignes, plutôt que des points. Les courbes sont approximées en subdivisant les cellules jusqu'à une très fine résolution. Ceci peut résulter en des arbres extrêmement déséquilibrés, annulant ainsi l'intérêt de l'indexation.

Le quadtree «carte polygonale»

Le quadtree «carte polygonale» (ou CP-quadtree) est une variante d'un quadtree, utilisée pour stocker des collections de polygones potentiellement dégénérés (c'est-à-dire, ayant des sommets ou des bords isolés)[1]. Il existe trois classes principales de CP-quadtrees, variant en fonction de quelles informations ils stockent à l'intérieur de chaque «nœud noir». Les CP3-quadtrees peuvent stocker n'importe quelle quantité de «bords non-coupants» et au plus un point. Les CP2-quadtrees sont les mêmes que les CP3-quadtrees, excepté que tous les bords doivent partager le même point final. Pour finir, les CP1-quadtrees sont similaires aux CP2-quadtrees, mais les «nœuds noirs» peuvent contenir un point et ses bords ou juste un ensemble de bords partageant un point (mais vous ne pouvez pas avoir un point et un ensemble de bords qui ne contiennent pas ce point).

Quelques utilisations courantes de quadtrees

Pseudo-code

Le pseudo-code suivant montre une implémentation possible d'un quadtree gérant uniquement les points. Il existe d'autres approches valables.

Prérequis

Il est supposé que les structures suivantes sont utilisées.

// Objet de coordonnées simples pour représenter des points et des vecteurs
struct XY
{
  float x;
  float y;

  function __construct(float _x, float _y) {...}
}

// Zone de délimitation alignée sur l'axe, représentée par sa demi-dimension et son centre
struct AABB
{
  XY center;
  XY halfDimension;

  function __construct(XY center, XY halfDimension) {...}
  function containsPoint(XY p) {...}
  function intersectsAABB(AABB other) {...}
}

Classe QuadTree

Cette classe représente à la fois un quadtree et son nœud parent.

class QuadTree
{
  // Constante arbitraire indiquant combien d'éléments peuvent être stockés dans ce nœud de quadtree
  constant int QT_NODE_CAPACITY = 4;

  // Zone de délimitation alignée sur l'axe (représentée par sa demi-dimension et son centre)
  // représentant les limites de ce quadtree
  AABB boundary;

  // Points de ce nœeud de quadtree
  Array of XY [size = QT_NODE_CAPACITY] points;

  // Enfants
  QuadTree* northWest;
  QuadTree* northEast;
  QuadTree* southWest;
  QuadTree* southEast;

  // Méthodes
  function __construct(AABB _boundary) {...}
  function insert(XY p) {...}
  function subdivide() {...} // créer quatre enfants permettant de diviser ce quadrant en quatre quadrants d'égales dimensions
  function queryRange(AABB range) {...}
}

Insertion

La méthode suivante permet d'insérer un point dans le quadrant approprié d'un quadtree, réalisant une partition si nécessaire.

class QuadTree
{
  ...

  // Insérer un point dans le QuadTree
  function insert(XY p)
  {
    // Ignorer les objets qui n'appartiennent pas à ce quadtree
    if (!boundary.containsPoint(p))
      return false; // l'objet ne doit pas être ajouté

    // S'il reste de la place dans ce quadtree, y ajouter l'objet
    if (points.size < QT_NODE_CAPACITY)
    {
      points.append(p);
      return true;
    }

    // Sinon, subdiviser le quadtree, puis ajouter le point au nœud qui l'acceptera
    if (northWest == null)
      subdivide();

    if (northWest→insert(p)) return true;
    if (northEast→insert(p)) return true;
    if (southWest→insert(p)) return true;
    if (southEast→insert(p)) return true;

    // Sinon, le point ne peut être inséré, pour une raison inconnue (cela ne devrait jamais arriver)
    return false;
  }
}

Recherche dans une zone

La méthode suivante permet de trouver tous les points à l'intérieur d'une «zone de recherche».

class QuadTree
{
  ...

  // Trouver tous les points apparaissant à l'intérieur d'une «zone de recherche»
  function queryRange(AABB range)
  {
    // Préparer le tableau de résultats
    Array of XY pointsInRange;

    // Tout interrompre si la «zone de recherche» n'intersecte pas ce quadrant
    if (!boundary.intersectsAABB(range))
      return pointsInRange; // liste vide

    // Vérifier les objets à ce niveau de quadrant
    for (int p := 0; p < points.size; p++)
    {
      if (range.containsPoint(points[p]))
        pointsInRange.append(points[p]);
    }

    // Terminer ici, s'il n'y a pas d'enfant
    if (northWest == null)
      return pointsInRange;

    // Sinon, relancer la recherche sur les 4 enfants et ajouter les points trouvés
    pointsInRange.appendArray(northWest→queryRange(range));
    pointsInRange.appendArray(northEast→queryRange(range));
    pointsInRange.appendArray(southWest→queryRange(range));
    pointsInRange.appendArray(southEast→queryRange(range));

    return pointsInRange;
  }
}

Notes et références

Notes

  1. Hanan Samet et Robert Webber. "Storing a Collection of Polygons Using Quadtrees". ACM Transactions on Graphics July 1985: 182-222. InfoLAB. Web. 23 mars 2012
  2. Tomas G. Rokicki, « Un algorithme pour la compression de l'espace et du temps », (consulté le )
  3. Henning Eberhardt, Vesa Klumpp, Uwe D. Hanebeck, Density Trees for Efficient Nonlinear State Estimation, Proceedings of the 13th International Conference on Information Fusion, Édimbourg, Royaume-Uni, juillet 2010.

Références générales

  1. Raphael Finkel et J.L. Bentley, « Quad Trees: A Data Structure for Retrieval on Composite Keys », Acta Informatica, vol. 4, no 1,‎ , p. 1–9 (DOI 10.1007/BF00288933)
  2. Mark de Berg, Marc van Kreveld, Mark Overmars, et Otfried Schwarzkopf, Computational Geometry, Springer-Verlag, (ISBN 3-540-65620-0) Chapter 14: Quadtrees: p. 291–306.
  3. Hanan Samet et Robert Webber, « Storing a Collection of Polygons Using Quadtrees », (consulté le )

Voir aussi

Articles connexes

Liens externes

Sur les autres projets Wikimedia :

Read other articles:

2 Samuel 9Kitab Samuel (Kitab 1 & 2 Samuel) lengkap pada Kodeks Leningrad, dibuat tahun 1008.KitabKitab 1 SamuelKategoriNevi'imBagian Alkitab KristenPerjanjian LamaUrutan dalamKitab Kristen10← pasal 8 pasal 10 → 2 Samuel 9 (atau II Samuel 9, disingkat 2Sam 9) adalah bagian dari Kitab 2 Samuel dalam Alkitab Ibrani dan Perjanjian Lama di Alkitab Kristen. Dalam Alkitab Ibrani termasuk Nabi-nabi Awal atau Nevi'im Rishonim [נביאים ראשונים] dalam bagian Nevi'im (נבי�...

 

 

Carlos Alberto Parreira Carlos Alberto ParreiraInformasi pribadiNama lengkap Carlos Alberto Gomes ParreiraTanggal lahir 27 Februari 1943 (umur 81)Tempat lahir Rio de Janeiro, BrasilKepelatihanTahun Tim 1967 Ghana1975 Fluminense1978–1982 Kuwait1983 Brasil1984 Fluminense1985–1988 Uni Emirat Arab1988–1990 Arab Saudi1990–1991 Uni Emirat Arab1991 Bragantino1991–1994 Brasil1994–1995 Valencia1995–1996 Fenerbahçe1996 São Paulo1997 MetroStars1998–1999 Arab Saudi1999–2000 Flum...

 

 

Open space in Bristol, England, UK This article is about the public open space and transport interchange. For the central area of Bristol, see Bristol city centre. The Centre, BristolView of northern end of The Centre, March 2018, before removal of Colston statueLocation within Central BristolFormer name(s)Tramways CentreMaintained byBristol City CouncilLocationBristol, EnglandPostal codeBS1Coordinates51°27′14″N 2°35′50″W / 51.4540°N 2.5972°W / 51.4540; -2....

Japanese professional wrestler Command BolshoiBolshoi in April 2014BornOsaka, Osaka[1][2]Professional wrestling careerRing name(s)Bolshoi 666[3][4]Bolshoi Kid[5]Bolshoi Santa[6]Bolshoi Yoneyama[7]Command Bolshoi[5]Command Yoneshoi[8]Douton Bolshoi[9]Hawaiian Bolshoi[10]Miko-san[10]Piko[11]Queen Bolshoi[12]T-1 Mask[13]Western Bolshoi[10]Billed height1.47 m (4...

 

 

Japanese manga series Jahy redirects here. Not to be confused with Jahi. The Great Jahy Will Not Be Defeated!First tankōbon volume cover, featuring Jahy in her small formジャヒー様はくじけない!(Jahī-sama wa Kujikenai!)GenreComedy[1][2]Slice of life[1]Supernatural[2] MangaWritten byWakame KonbuPublished bySquare EnixEnglish publisherNA: Square EnixMagazineMonthly Gangan JokerDemographicShōnenOriginal runAugust 22, 2017 – presentVolume...

 

 

Cet article est une ébauche concernant le cyclisme. Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants. Grand Prix Slovenian IstriaNoms officiels2014-2018 GP Izoladepuis 2019 GP Slovenian IstriaGénéralitésSport Cyclisme sur routeCréation 2014Nombre d'éditions 10 (en 2024)Périodicité annuelle (mars)Type / Format Course d'un jourLieu(x) SlovénieCatégorie 1.2 (depuis 2014)Circuit UCI Europe TourSite web offic...

2020 American musical comedy drama streaming television series Julie and the PhantomsGenre Musical Comedy drama Created byDan Cross and David HogeBased onJulie e os Fantasmasby Paula Knudsen, Tiago Mello, and Fabio DanesiStarring Madison Reyes Charlie Gillespie Owen Patrick Joyner Jeremy Shada Jadah Marie Sacha Carlson Savannah May Music byDavid LawrenceCountry of originUnited StatesCanadaOriginal languageEnglishNo. of seasons1No. of episodes9ProductionExecutive producers Kenny Ortega Dan Cro...

 

 

Not to be confused with Ærø. This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Årø Denmark – news · newspapers · books · scholar · JSTOR (February 2...

 

 

Major League Baseball team season 2005 Washington NationalsLeagueNational LeagueDivisionEastBallparkRobert F. Kennedy Memorial StadiumCityWashington, D.C.Record81–81 (.500)Divisional place5thOwnersMajor League BaseballGeneral managersJim BowdenManagersFrank RobinsonTelevisionMASNWDCA (UPN 20)WTTG (Fox 5)(Mel Proctor, Ron Darling, Kenny Albert)RadioWFEDWWZZ(Charlie Slowes, Dave Shea) ← 2004 Seasons 2006 → The 2005 Washington Nationals season was the first for the ...

Sowo Engelhardia Engelhardia spicataTaksonomiDivisiTracheophytaSubdivisiSpermatophytesKladAngiospermaeKladmesangiospermsKladeudicotsKladcore eudicotsKladSuperrosidaeKladrosidsKladfabidsOrdoFagalesFamiliJuglandaceaeGenusEngelhardia Blume, 1826 Tipe taksonomiEngelhardia spicata Tata namaStatus nomenklaturnomen conservandum Sinonim takson Alfaropsis Iljinsk. Pterilema Reinw. [1]Ex taxon author (en)Lesch. lbs Engelhardia atau pohon sowo adalah genus pohon dalam keluarga Juglandaceae, bera...

 

 

First-level administrative division of Russia Republic in Far Eastern, RussiaRepublic of Sakha (Yakutia)RepublicРеспублика Саха (Якутия)Other transcription(s) • YakutСаха Өрөспүүбүлүкэтэ • RomanizationSaxa Öröspüübülükete FlagCoat of armsAnthem: State Anthem of the Sakha RepublicCoordinates: 66°24′N 129°10′E / 66.400°N 129.167°E / 66.400; 129.167CountryRussiaFederal districtFar Eastern ...

 

 

City in Aukštaitija, LithuaniaMolėtaiCity Coat of armsMolėtaiLocation of MolėtaiCoordinates: 55°14′N 25°25′E / 55.233°N 25.417°E / 55.233; 25.417Country LithuaniaEthnographic regionAukštaitijaCounty Utena CountyMunicipalityMolėtai district municipalityCapital ofMolėtai district municipalityFirst mentioned1387 Feb. 17[1]Granted city rights1539Population (2022) • Total5,716Time zoneUTC+2 (EET) • Summer (DST)UT...

Hypericaceae Hypericum tetrapterum Klasifikasi ilmiah Kerajaan: Plantae (tanpa takson): Angiospermae (tanpa takson): Eudikotil (tanpa takson): Rosidae Ordo: Malpighiales Famili: HypericaceaeJuss. Genera Lihat teks Hypericaceae atau Suku Mampat-mampatan adalah salah satu suku anggota tumbuhan berbunga. Menurut Sistem klasifikasi APG II suku ini dimasukkan ke dalam bangsa Malpighiales, klad euRosidae I. Wikimedia Commons memiliki media mengenai Hypericaceae. Daftar Genus Tribus Cratoxyleae Cra...

 

 

Fruit that has been preserved by anaerobic fermentation in brine or immersion in vinegar Chanh muối, a type of pickled lime, aging in glass containers Pickled fruit refers to fruit that has been pickled.[1] Pickling is the process of food preservation by either anaerobic fermentation in brine or immersion in vinegar. Many types of fruit are pickled.[1] Some examples include peaches, apples, crabapples, pears, plums, grapes, currants, tomatoes and olives.[1][2]...

 

 

Russian ice dancer Sergei NovitskiKhokhlova and Novitski in 2009Full nameSergei Nikolayevich NovitskiOther namesNovitskyBorn (1981-05-16) 16 May 1981 (age 42)Moscow, Russian SFSR, Soviet UnionHeight1.80 m (5 ft 11 in)Figure skating careerCountryRussiaBegan skating1986Retired2010 Medal record Figure skating: Ice dancing Representing  Russia World Championships 2008 Gothenburg Ice dancing European Championships 2010 Tallinn Ice dancing 2009 Helsinki Ice dancing 2008 Zag...

Cet article est une ébauche concernant la Chine. Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants. Hunnan qu 浑南区 Administration Pays Chine Province ou région autonome Liaoning Préfecture Shenyang Statut administratif District Code postal 110000[1] Indicatif +86 (0) Démographie 410 000 hab. (2010) Densité 510 hab./km2 Géographie Coordonnées 41° 46′ 12″ nord, 123°...

 

 

История Канады — история страны, которая занимает северную часть североамериканского континента[1]. Первоначально страна была населена автохтонным населением, затем Канада благодаря иммиграции из Европы превратилась в официально двуязычную федерацию, мирным п�...

 

 

Les versions LX et LD de la Dodge Charger comporte les modèles de 2006 à 2023, soit la sixième et la septième génération de la Charger. Histoire La première Charger était une voiture d'exposition de 1964 basée sur la Dodge Polara et équipée d'un moteur V8 Wedge 426. La première Charger de production, basée sur la Dodge Coronet, a été présentée comme un modèle de 1966. Il y avait plusieurs véhicules différents portant la plaque signalétique Charger, construites sur trois p...

Law firms based in London Fieldfisher LLPHeadquartersLondon, United KingdomNo. of offices26[1]No. of lawyersApprox. 1,200[2]No. of employeesApprox. 1,800[3]Major practice areasGeneral practiceKey peopleRobert Shooter (Managing Partner)David Wilkinson(Senior Partner)Revenue£290 million (2020/21)[4]Profit per equity partner£860,000 (2019/20)[4]Date founded1835 (Field Roscoe & Co.)1865 (Waterhouse & Co.)1969 (me...

 

 

У этого термина существуют и другие значения, см. Ясный (значения). Космодром Ясный Космодром Ясный. Общий вид. Расположение  Россия Руководящий орган Министерство обороны Российской Федерации Космодром Ясный Медиафайлы на Викискладе Ясный — российский космодр�...