Ich brauche eine Methode, um den 3D-Raum in zufällig achsenausgerichtete Kastenformen zu unterteilen. Im Moment teile ich den 2D-Raum zu Testzwecken. Der unmittelbarste Ansatz, den ich gefunden habe, bestand darin, ein Rechteck der Größe (1, 1) zu definieren und dann alle vorhandenen Rechtecke rekursiv in zwei ungleichmäßige Rechtecke aufzuteilen, die sich zwischen Achse X und Y abwechseln.
Das Problem liegt hier auf der Hand. Dieser Ansatz führt zu langen Dehnungslinien (rot markiert).
Was ich möchte, ist etwas organischeres (ich habe ein Beispiel beigefügt)
Sehen Sie, keine langen geraden Linien von oben nach unten oder von links nach rechts.
Die einzige Einschränkung besteht darin, dass ich möglicherweise die minimale Größe des Rechtecks begrenzen möchte, ohne die Granularität der Größen zu beeinträchtigen. dh wenn das kleinste Rechteck 1 Quadratzentimeter als der Sekunden kleinste Raum ist, sollte es nicht 2 Quadratzoll sein.
Idealerweise sollte der Algorithmus also alle drei folgenden Einschränkungen erfüllen:
- Rechtecke sind nicht unendlich klein.
- Rechteckgrößen sind keine diskrete Multiplikation der kleinsten Rechteckgröße. dh wenn das kleinste Rechteck eine Einheit von 3 Quadraten ist, als größere Rechtecke nicht auf 6, 9, 12 usw. beschränkt sind und stattdessen 3,2 oder 4,7 betragen könnten).
- Der Algorithmus läuft in Polynomzeit (muss schnell berechnet werden).
Wie Sie sehen können, habe ich es geschafft, die Welt von diesen Artefakten zu befreien. Die Idee ist sehr ähnlich.
Ungleichmäßiges Gitter (1):
Verhandeln auf Achse x (2):
Verhandeln auf der Achse y (3):
Ergebnis (4):
quelle