# 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 2$^n$ × 2$^n$ 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). 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

* Compression sans perte d'une image binaire
* De manière générale, compression basique en regroupant les éléments de composition identique ou similaire
* Indexation spatiale
* Détection de collision efficace, en deux dimensions
* Élimination des objets hors du cône de vue d'une surface 3D
* Stockage de données parsemées, tel qu'une information de formatage pour un tableur ou pour quelques calculs matriciels
* Solution de champs multidimensionnels (mécanique des fluides numérique, électromagnétisme)
* Programme de simulation du jeu de la vie de Conway
* Observateur d'état
* Les quadtrees sont également utilisés pour l'analyse d'images fractales

## 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.

### Classe QuadTree

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

### 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.

### Recherche dans une zone

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