Aller au contenu principal
sports_esports Lab Canvas 2D Partitionnement spatial Requête de zone Zéro dépendance

Quadtree — le partitionnement spatial pour accélérer les requêtes de zone, en Canvas 2D

Un nuage de points mobile indexé, à chaque image, dans un quadtree : un nœud se subdivise en quatre dès qu'il dépasse une capacité. La souris définit une zone de requête et l'on visualise que seuls les nœuds intersectant la requête sont visités — les points trouvés s'allument en ambre. Zéro dépendance.

Souris : déplacer la zone de requête + / − : nombre de points Espace : mettre en pause

Chercher sans tout regarder

Une question revient sans cesse dès qu'on manipule des données spatiales : « quels points se trouvent dans cette zone ? ». La réponse naïve teste chaque point un à un — parfait pour quelques dizaines d'éléments, ruineux dès qu'on en a des milliers, et pire encore quand la question se répète à chaque image. Le quadtree répond à ce problème en organisant l'espace lui-même, de sorte qu'une requête ne visite que les régions réellement concernées.

Subdiviser dès qu'une case se remplit

Le principe tient en une phrase : un carré garde jusqu'à N points, puis se subdivise en quatre quadrants dès qu'il déborde, en redistribuant ses points aux enfants. Là où les points sont denses, l'arbre plonge et les cases deviennent minuscules ; là où l'espace est vide, une seule grande case suffit. La structure épouse ainsi la distribution des données — c'est visible à l'écran : les subdivisions se resserrent exactement où les points s'agglutinent.

Une requête qui ignore l'inutile

Quand vous déplacez la souris, le rectangle indigo définit une zone de requête. L'algorithme part de la racine et ne descend que dans les nœuds dont le carré intersecte ce rectangle : un quadrant entièrement hors zone est écarté d'un seul test, avec tous les points qu'il contient. Seuls les points des nœuds effectivement visités sont comparés à la requête, puis mis en évidence en ambre. Le compteur en haut le rend concret : on ne visite qu'une poignée de nœuds là où l'approche naïve testerait la totalité des points.

Le compromis capacité, profondeur et reconstruction

Rien n'est gratuit. Une capacité de nœud faible produit un arbre profond, précis mais coûteux à parcourir et à mémoriser ; une capacité élevée donne un arbre plat qui se rapproche de la recherche linéaire. Et parce que les points bougent, je reconstruis ici l'arbre à chaque image : c'est simple et robuste, mais ce coût de reconstruction devient l'arbitrage central. Selon les cas, on choisit de reconstruire, de mettre à jour l'arbre de façon incrémentale, ou de basculer sur une autre structure (grille régulière, arbre k-d) — il n'y a pas de meilleure structure dans l'absolu, seulement celle qui colle à vos données et à vos requêtes.

Pourquoi ce détail compte pour votre projet

Le partitionnement spatial n'est pas une curiosité d'école : c'est ce qui sépare une carte interactive qui rame d'une carte fluide, une détection de collisions qui tient soixante images par seconde d'une qui s'effondre, un moteur de recherche de proximité tenable d'un qui explose en charge. Choisir la bonne structure de données au bon endroit, mesurer avant d'optimiser et documenter le compromis retenu : c'est exactement la rigueur que j'apporte aux projets où la performance et la montée en charge ne sont pas négociables.

Photo d'Emmanuel BALLERY, fondateur de x10

À propos de l'auteur

Emmanuel BALLERY est le fondateur de x10 solutions. Ces petits jeux sont surtout un plaisir de développeur, codés le week-end — pas une vitrine de mes missions, qui sont bien plus exigeantes. J'y soigne quand même la performance et la lisibilité, par habitude.

Voir plus arrow_forward
rocket_launch

Un vrai projet en tête ?

Ce petit jeu m'amuse, mais il ne dit pas grand-chose de mon métier : mes missions sont bien plus complexes. Si vous avez une application à concevoir ou à fiabiliser, c'est là que je suis vraiment utile.

Discuter de mon projet arrow_forward