3D ist was anderes als 2D,
die guten alten Gitterstrukturen, schon für Schach & Co. bekannt, sind dir bewußt?
ist es eigentlich relevant, ob Wand-Strecken doppelt vorkommen?
einmal an Ecken wie P2, wenn Wände an beiden Wege voll berechnet werden,
oder im Extrem zwei erlaubte Wege parallel gedacht mit Abstand einer Wand dazwischen:
…
.p3___p4.
.| #####
.p2___p1.
…
die #-Wand könnte komplett 2x berechnet werden, problematisch oder egal?
wenn Gitter relevant ist/ noch werden könnte, bei 3D sicher nicht selbstverständlich,
dann stelle ich Strecken für Wände komplett in Frage,
einzelne Punkte als Wände sollten reichen, nach und nach gesetzt,
ansonsten halte ich deinen Edit für einen guten Ausgangspunkt,
1)
modelliere die Punkte als Objekte mit Informationen, aus allen Wegstrecken aufgebaut:
es muss eine Methode für Verbindung in die 4 (Himmels-)richtungen geben,
es braucht eine Enum Direction für N, O, S, W oder andere 4 Werte,
eine Methode isEnd() für Punkte wenn nur in eine Richtung verbunden
-
für jede ursprüngliche Wegstrecke 2x Suche nach Wänden,
zu jedem verbundenen Punktepaar A und B einmal mit A, B aufgerufen und einmal mit B, A
die Punkte A_______B, egal wie ausgerichtet, werden zurechtgedacht und es geht dann um die untere Wand davon,
je nach A und B ergibt sich eine generelle Blickrichtung,
2)1) bei A wird geschaut ob von dort nach unten abgebogen wird, dann die Wand dort um 1 zu verkürzen
2)2) bei B wird geschaut ob von dort nach unten abgebogen wird, dann die Wand dort um 1 zu verkürzen
2)3) Wand aus den beiden vorherigen Informationen, der Blickrichtung und den Punkten A und B zusammenrechnen
Beispiel 1:
p2___p1, noch ganz normal, Blickrichtung Norden
(wie bestimmen? Unterschied in x-Koordinate, also Nord oder Süd, p2 liegt westlich von p1, also Nord),
bei beiden Punkten kein Abbiegen nach der Suchrichtung Süden,
aus den Punkten (0,0) und (100,0) ist komplette Wand, etwa (0,-1) und (100,-1) zu berechnen,
die Blickrichtung Norden sorgt für -1 auf y-Koordinate
p1______p2, also andersrum, Blickrichtung nun Süden (da p1 östlicher ist),
nun ist interessant ob die Punkte nach Norden abbiegen
(das muss alles automatisch bestimmt werden, Enum Direction mit Attribut Gegenrichtung usw., einmalig gesetzt, oft benötigt)
p1 biegt nicht ab, p2 biegt aber nach Norden ab,
ohne Abbiegen wäre zu (100,0) und (0,0) die erstellte Wand zu (100,1) und (0,1) (1 auf y wegen Blickrichtung Süden), weil p2 abbiegt dort einen weniger, was durch kreuz und quer umrechnen über welchen der beiden Punkte und welche Blickrichtung zu x um 1 größer führt, also (100,1) und (1,1)
ok, an dieser Stelle auch für mich beim Aufschreiben mal wieder der Komplexitätspunkt erreicht,
aber das sind alles nur einzelne Bestandteile, die man nach und nach einbauen und anhand von Beispielen exakt korrigieren kann,
die Beispiele für Blickrichtung Osten/ Westen spare ich mir mal, dann eben die Wand generell nach x statt y versetzt,
an den Ecken evtl. Korrekturen um 1 für y statt x nun, alles gewechselt,
idealerweise darauf achten dass nicht zuviel Code wiederholt wird, sondern mit Variablen arbeiten,
ModiferWand = (0,1) oder (0,-1) oder (1,0) oder (-1,0) usw.
wichtig bleibt: nur ein Algorithmus dieser Sorte, der für jede Wegstrecke 2x abgespult wird = alle Wände zwischen Punkten gefunden
-
alle Punkte noch einzeln durchgehen,
wenn sie Endpunkte sind, dann noch passende 3er-Endwand ergänzen,
für p1 (100, 0) etwa (101, 1) und (101,-1),
die einzige vorhandene Verbindung solcher Endpunkte gibt wiederum eine gewisse Blickrichtung vor,
aus der sich die Lage der 3er-Wand genau bestimmt