J'ai besoin d'une méthode pour diviser l'espace 3D en formes de boîtes alignées sur des axes aléatoires. Pour l'instant, je divise actuellement l'espace 2D à des fins de test. L'approche la plus immédiate que j'ai trouvée était de définir un rectangle de taille (1, 1), puis de diviser récursivement tous les rectangles existants en deux rectangles inégaux alternant entre les axes X et Y.
Le problème ici est évident. Cette approche entraîne de longues lignes d'étirement (marquées en rouge)
Ce que je voudrais, c'est quelque chose de plus organique (j'ai inclus un exemple)
Vous voyez, pas de longues lignes droites de haut en bas ou de gauche à droite.
La seule contrainte est que je puisse souhaiter limiter la taille minimale du rectangle sans affecter la granularité des tailles. c'est-à-dire si le plus petit rect est de 1 centimètre carré que la seconde plus petite pièce ne doit pas être de 2 unités carrées.
Donc, idéalement, l'algorithme devrait répondre aux trois contraintes suivantes:
- Les rectangles ne sont pas infiniment petits.
- Les tailles rect ne sont pas une multiplication discrète de la plus petite taille rect. c'est-à-dire que si le plus petit rect est de 3 unités carrées, les plus grands rectes ne sont pas limités à 6, 9, 12 et ainsi de suite, et peuvent donc être de 3,2 ou 4,7, d'ailleurs).
- L'algorithme s'exécute en temps polynomial (doit être calculé rapidement).
Comme vous pouvez le voir, j'ai réussi à débarrasser le monde de ces artefacts. L'idée est très similaire.
Grille non uniforme (1):
Négociation sur l'axe x (2):
Négociation sur l'axe y (3):
Résultat (4):
la source