10 Stimmen

Beste Datenstruktur für ein unveränderliches persistentes 3D-Gitter

Ich experimentiere damit, ein Spiel in einem funktionalen Programmierstil zu schreiben, was bedeutet, dass der Spielzustand mit rein funktionalen, unveränderlichen Datenstrukturen dargestellt wird.

Eine der wichtigsten Datenstrukturen wäre ein 3D-Gitter, das die Welt darstellt und in dem Objekte an jeder beliebigen [x,y,z]-Gitterposition gespeichert werden können. Die Eigenschaften, die ich mir für diese Datenstruktur wünsche, sind:

  • Unveränderlich
  • Schnelle dauerhafte Aktualisierungen - d.h. die Erstellung einer neuen Version des gesamten Gitters mit kleinen Änderungen ist billig und wird durch die gemeinsame Nutzung von Strukturen erreicht. Das Netz kann groß sein, so dass das Kopieren beim Schreiben keine praktikable Option ist.
  • Effizienter Umgang mit spärlichen Bereichen / identischen Werten - leere/unbesiedelte Gebiete sollten keine Ressourcen verbrauchen (um große Freiflächen zu ermöglichen). Bonuspunkte, wenn es auch effizient ist, große "Blöcke" identischer Werte zu speichern
  • Unbegrenzt - kann je nach Bedarf in jede Richtung wachsen
  • Schnelles Lesen / Nachschlagen - d. h. das Objekt bzw. die Objekte an der Position [x,y,z] schnell auffinden kann
  • Schnelle Volumenabfragen d.h. schnelles Durchsuchen einer Region [x1,y1,z1] -> [x2,y2,z2], wobei idealerweise die Sparsamkeit ausgenutzt wird, damit leere Räume schnell übersprungen werden

Gibt es Vorschläge für die beste Datenstruktur, die dafür verwendet werden kann?

P.S. Ich weiß, das ist vielleicht nicht die beste praktisch Weg, ein Spiel zu schreiben, ich mache es nur als Lernerfahrung und um meine Fähigkeiten mit FP...... zu erweitern.

1voto

CapelliC Punkte 58673

Ich würde es mit einem Octtree versuchen. Die Randkoordinaten jedes Knotens sind implizit in der Strukturplatzierung enthalten, und jeder nicht terminale Knoten behält 8 Teilbäume, aber keine Daten. Sie können also "unioning", um Platz zu gewinnen.

Ich denke, dass Unveränderlich y Unbegrenzt sind (im Allgemeinen) widersprüchliche Anforderungen.
Wie dem auch sei... um einen Apfelbaum zu züchten, müssen Sie die Wurzel ersetzen.

Andere von Ihnen gestellte Anforderungen sollten erfüllt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X