Die Grafik, die angezeigt wird ist in einem Linienformat mit
fliesskommadarstellung der Stützpunkte gespeichert.
Für das Einarbeiten der internen Züge in die Grafik und
für das Umwandeln der benutzer-gezeichneten Züge in die interne Darstellung benutze ich eine
Gitterdarstellung.
Vor jedem Zug wird die Lininegrafik in das Gitter gemalt, dann darin
der neue Zug ausgeführt und dann die neue Linie wieder in die
Lininendarstellung übertragen und noch etwas geglättet. Die
alten Linien aus der Liniendarstellung bleiben erhalten.
In der Gitterdarstellung kann jeder Punkt mit 8 Nachbarn verbunden
werden (also auch diagonal). Es werden darin dan auch bits fuer
besetzte Diagonalverbindungen gespeichert, sonst könnten sich auch
Linien überschneiden, die keine gemeinsamen Gitterunkte haben.
Umsetzen von internen Zügen in
die Grafik:
Bei Punkten mit bereits 2 Verbindungen muss eine passende Abgangsstelle
am Punkt gewählt werden, damit die neue Linie auf der
gewünschen Seite zwischen den bereits vorhandenen Linien abzweigt.
Wenn durch die neue Verbindung eine Fläche zerteilt wird,
müssen später die unabhängigen Netzte in dieser
Fläche in der richigen Teilfläche liegen. Das erreiche ich,
indem ich vorher Hilfslinien male, die der Hauptline den Weg so
versperren, dass sie nur noch in geeigneter Weise um die Netze
herumlaufen kann.
5 Fälle werden unterschieden:
- A und B sind noch nicht (indirekt) verbunden
- A==B und hat noch keine Verbindung
- A==B und hat schon eine Verbindung
- verbinde A und B über die Aussenfläche des Netzes
- verbinde A und B über eine Innenfläche des Netzes (dann
liegen A und B am Pfad, der die Fläche umschliesst)
Je nach Fall ist das Verfahren zum zeichnen der Hilfslinien etwas
unterschiedlich. im ersten Fall brauchen keine Hilfslinen gezeichnet
werden, die Hauptlinine kann einfach den günstigsten Weg
wählen.
Im Fall 4 etwa verbinde ich Alle Netzte die in der neuen Fläche
liegen sollen mit dem Pfadstück das zwischen A->B liegt; die
anderen mit dem Aussenrand, und das Pfadstück B->A auch mit dem
Aussrenrand. Dann erst wird der Weg fuer die Hauptlinine ermittelt, und
dann die Hilflinien wieder gelöscht. Aussenrand ist entweder der
umschliessende Pfad der Verbindungsfläche oder, wenn es die
Aussenfläche ist, der Spielfeldrand.
Der "günstigsten Weg" ist immer einer , der noch möglichst
viel Platz zwischen allen linien/punkten lässt. Ich berechne zu
beginn für jeden Gitterpunkt der minimalen Abstand zu einm
Besetzten Punkt, und in der Wegfindungsfunktion werden aus dies Werten
die Kosten für einen möglichen Weg berechnet
Wenn der Zug auf dem Gitterbrett nicht ausgeführt werden kann,
wiel es zu eng ist, dann wird das Gitter vergrössert. Spiele mit 8
Startpunkten lassen sich oft auf einem Gitter mit 100x100 punkten
durchspielen, wenn die Grafik zwischen den Zügen immer
aufgeräumt wird, d.h. die Linien so verzogen werden, dass sie
möglichst viel Platz lassen. Ohne diese Aufräumen würdes
es oft schon früh so eng werden , das auf dem Bildschirm kaum
noch etwas zu erkennen ist.
Umsetzen des Benutzergemalten Zugs in
die interne Darstellung
hier müssen , wenn die Punkte bereits 2 Verbindungen haben, die
passenden kantenindices aus der Abgangsrichtung ermittelt werden.
Ich teste ausser im Fall 1(der oberen Liste) ob die neuen Linie recht
oder Links herum dreht (bei selbstverbindung, oder in kombination mit
bisheriger Verbindung von A und B), um im internen Zug A und B in der
richtign Reihenfolge einzusetzen. Fuer die Teilnetze in der Fläche
erfolgt dann ein Punkt in Fläche Test um zu ermitteln in welcher
Teilfläche sie gehören.
Das Aufraumen erfolgt in der linienbasierten Darstellung