Dreieckiges Koordinatensystem

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Dreieckiges Koordinatensystem

    Kennt jemand ein simples Koordinatensystem für ein Feld bestehend aus gleichseitigen Dreiecken?

    Hintergrund: Mein Neffe hat sich ein Brettspiel ausgedacht. Dieses Spiel möchte er programmieren. Hierbei scheitert er an einem Grundproblem, für das auch ich keine einfache Lösung fand, die Adressierung der Spielfelder und die Beschreibung der Spielzüge.

    Das Spielbrett habe ich der Verständlichkeit als Bild angehängt. Die Figuren ziehen von Feld zu Feld, über die angrenzenden Seiten. Das ermöglich von der mittleren Position aus z.B. 6 Richtungen. Das ganze sollte nach Möglichkeit mit einfacher Integer Addition und Subtraktion realisierbar sein. - Damit waren alle meine Vorschläge raus.

    Kennt jemand so etwas, oder hat wer eine zündende Idee hierfür?


    P.S.: Das wird mit HTML5 und JavaScript für den Browser realisiert.
    Dateien
    * Kann Spuren von Erdnüssen enthalten.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von NSObject ()

  • Hier eine Skizze der Bewegungsfreiheiten.

    Die rote Spielfigur darf sich z.B. bis zu 4 Spielfelder weit bewegen. Die Figur ziehen von Feld zu Feld, von seiner Startposition aus geradlinig über die angrenzenden Seiten des Spielfeldes bis zum Zielfeld. D.h. das Startfeld hat 3 Seiten, es ergeben sich jedoch 6 mögliche Freiheitsgerade bzw. Bewegungsrichtungen.

    P.S.: Das ist nur ein einfaches Beispiel. Es gibt noch mehr Spielfiguren, die auch andere Bewegungsmuster und Aktionen (Schlagen, überspringen, blockieren) beherrschen. Aber es geht ja erstmal um das Grundgerüst.
    Dateien
    * Kann Spuren von Erdnüssen enthalten.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von NSObject ()

  • Nunja wenn Dir das vielleicht hilft:

    Wenn ich das richtig verstanden habe müßte das so gehen:

    X - Schritte, Y
    X + Schritte, Y
    X - ((Schritte / 2) + 1), Y - (Schritte / 2)

    und entsprechend die anderen diagonalen Richtungen

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Ich habe mir das mal umgezeichnet mit Punkten, aber das war dann auch nichts.

    Jedenfalls formuliere ich mal etwas:

    Die Höhe und die Breite eines Dreiecks sind gleich groß. Der Mittelpunkt ist (Breite/2, Höhe/2)

    Ein Spielzug geht in drei Richtungen:1. Dreieckspitze nach oben: links, rechts, unten
    2. Dreieckspitze nach unten: links, rechts, oben

    Bewegung nach links, rechts ist +/-Breite/2
    Bewegung nach unten bzw. oben ist +/-Höhe

    Bis zu vier Schritte können nach folgenden Muster kombiniert werden:
    - links, links, links, links
    - links, oben, links, oben
    - links, unten, links, unten
    - rechts, rechts, rechts, rechts
    - rechts, unten, rechts, unten
    - rechts, oben, rechts, oben
    Spitze nach oben:
    unten, links, unten, links
    unten, rechts, unten, rechts
    Spitze nach unten:
    oben, rechts, oben, rechts
    oben, links, oben, links

    So irgendwie?
  • manoh schrieb:

    Ich habe mir das mal umgezeichnet mit Punkten, aber das war dann auch nichts.
    So eine Idee hatte ich auch, das mit einem Hexagonalen Raster abzubilden. Aber das klappte auch nicht so richtig.

    manoh schrieb:

    Jedenfalls formuliere ich mal etwas:

    Die Höhe und die Breite eines Dreiecks sind gleich groß. (...)
    Nein. Die Höhe ist h = sqrt(a^2-c^2/4)
    * Kann Spuren von Erdnüssen enthalten.
  • Je nachdem was Du eigentlich genau vor hast, braucht man gar kein Plus Minus oder irgendetwas anderes. Man hat ja ein Dreieck und so ein Dreieck hat ein anderes Dreieck als Nachbar. Man kann also nur in drei Richtungen gehen (aus Ansicht des Dreiecks). Die Nachbarn sind links, recht, oben und unten (Draufsicht). Wenn die Spite oben ist, dann ist da halt oben kein Nachbar. D.h. oben, links und rechts = kein Nachbar und unten = Nachbar => Das oberste dreieck...

    Am Anfang hatt man drei Wege zur Auswahl. Der darauffolgende Schritt bietet nur noch zwei Wege und die nächsten beide Schritte jeweils einen Weg (wegen Muster).

    Vermutlich etwas unverständlich in der Kürze ausgedrückt... Aber das Wetter ist schön und raus aus dus Haus...
  • NSObject schrieb:

    Thallius schrieb:

    Nunja wenn Dir das vielleicht hilft: Wenn ich das richtig verstanden habe müßte das so gehen:

    X - Schritte, Y
    X + Schritte, Y
    X - ((Schritte / 2) + 1), Y - (Schritte / 2)

    und entsprechend die anderen diagonalen Richtungen
    Das hab ich nicht verstanden. Sind das die Koordinaten, oder die Bewegung einer Figur?
    Das ist der Index des zweidimensionalen Arrays deines Spielfeldes.

    Ich würde das Spielfeld als solches aufbauen. die erste Zeile hat halt nur 1 Spalte, die zweite dann 3 usw.

    Wenn Du nun bei Feld 4,4 bist wie in Deiner Zeichnung und gehst 4 Schritte nach links oben, bis du nach meiner Formel bei Feld 2,0

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • manoh schrieb:

    Je nachdem was Du eigentlich genau vor hast, braucht man gar kein Plus Minus oder irgendetwas anderes. Man hat ja ein Dreieck und so ein Dreieck hat ein anderes Dreieck als Nachbar. Man kann also nur in drei Richtungen gehen (aus Ansicht des Dreiecks). Die Nachbarn sind links, recht, oben und unten (Draufsicht). Wenn die Spite oben ist, dann ist da halt oben kein Nachbar. D.h. oben, links und rechts = kein Nachbar und unten = Nachbar => Das oberste dreieck...
    Das war eine lyrische Beschreibung des ersten Schritts, aber die Erklärung wie man ohne "...Plus Minus oder irgendetwas anderes." auskommt fehlt da noch.

    manoh schrieb:

    Am Anfang hatt man drei Wege zur Auswahl. Der darauffolgende Schritt bietet nur noch zwei Wege und die nächsten beide Schritte jeweils einen Weg (wegen Muster).
    Irgendwie fehlt mir des Pudels Kern.

    manoh schrieb:

    Vermutlich etwas unverständlich in der Kürze ausgedrückt... Aber das Wetter ist schön und raus aus dus Haus...
    Vermutlich. Und hier ist das Wetter bescheiden.
    * Kann Spuren von Erdnüssen enthalten.
  • Thallius schrieb:

    Das ist der Index des zweidimensionalen Arrays deines Spielfeldes.

    Ich würde das Spielfeld als solches aufbauen. die erste Zeile hat halt nur 1 Spalte, die zweite dann 3 usw.
    Ja, ich hatte das auch schon mal als Pyramide aus ungeraden Zahlen aufgebaut. Also 1. Zeile: 1; 2. Zeile: 1, 2, 3; 3. Zeile: 1, 2, 3, 4, 5; etc. Also von oben, nach unten. - Besser erklärt: {[1],[1,2,3],[1,2,3,4,5]]}
    Aber ich sah da keinen einfachen Weg je eine gerade Bewegung zu definieren, und dabei Fehler zu verhindern, dass die Figur z.B. von Position 3,3 auf 2,2 gezogen wird. Von 4,4 auf 3,3 wäre ja zulässig. Oder von 3,2 auf 2,1. Aber eben 4,5 auf 3,4 nicht.

    Thallius schrieb:

    Wenn Du nun bei Feld 4,4 bist wie in Deiner Zeichnung und gehst 4 Schritte nach links oben, bis du nach meiner Formel bei Feld 2,0
    Wie kommt Du auf die Koordinate 4,4? - Ich komme da aus jeder Richtung auf 7,7, und mit der Formel auf die Endkoordinate 5,1 oder 6,3 !?

    P.S.: Ich hab da mehrfach drüber nachgedacht, und irgendwo muss muss da ein oder mehrere Details fehlen. Wo ist der Ursprung? Wo ist welche Achse? Welcher Zahlenraum? Bei der Eingabe und der Ausgabe? Etc.


    P.S.: Hab mal ein leeres Raster zum darin herum skizzieren angehängt.
    Dateien
    • Raster leer.png

      (22,7 kB, 359 mal heruntergeladen, zuletzt: )
    * Kann Spuren von Erdnüssen enthalten.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von NSObject ()

  • Deinen Post hab ich in seiner würzigen Kürze glatt übersehen. Pardon.

    Das war sein erster Versuch. Das hantieren mit 3x 3-Tupel hat sich schon bei einfachen Zügen als "herausfordernd" und fehlerträchtig herausgestellt. Ich hatte es dann noch mit trilinearen Koordinaten und Polarkoordinaten zu retten versucht, aber eingesehen, dass das zu keiner Vereinfachung führt.
    * Kann Spuren von Erdnüssen enthalten.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von NSObject ()

  • NSObject schrieb:

    Aber ich sah da keinen einfachen Weg je eine gerade Bewegung zu definieren, und dabei Fehler zu verhindern, dass die Figur z.B. von Position 3,3 auf 2,2 gezogen wird.
    Wenn Du von einer Position alle erreichbaren Positionen berechnen möchtest, dass geht einfach. Gerade mittels drei einfachen Funktionen findet Du mit den zwei Achsen vermutlich nicht. Bzw. Du kannst ja eigentlich drei * zwei-Koordinatensysteme haben. Also die Ansicht ändern (drehen). Dann bewegst Du dich immer nur auf einer Achse.

    Sollen da Steine rumgeschoben werden?


    Mein zweiter "wirrer" Vorschlag beruhte auf kein Koordinatensystem. Die Dreiecke kennen doch ihre direkte Nachbarn, kann man ja zuvor berechnen. Hier hatte ich mir das so vorgestellte, dass man "den Stein" mittels den Pfeiltasten von einen Stein zu einem anderen bewegen kann. Bis zu vier Schritte in einem Spielzug.
  • manoh schrieb:

    NSObject schrieb:

    Aber ich sah da keinen einfachen Weg je eine gerade Bewegung zu definieren, und dabei Fehler zu verhindern, dass die Figur z.B. von Position 3,3 auf 2,2 gezogen wird.
    Wenn Du von einer Position alle erreichbaren Positionen berechnen möchtest, dass geht einfach. Gerade mittels drei einfachen Funktionen findet Du mit den zwei Achsen vermutlich nicht. Bzw. Du kannst ja eigentlich drei * zwei-Koordinatensysteme haben. Also die Ansicht ändern (drehen). Dann bewegst Du dich immer nur auf einer Achse.
    Das ist ein plattes 2D Brettspiel. Draufsicht. Kein 3D.

    manoh schrieb:

    Sollen da Steine rumgeschoben werden?
    Ja. Das ist mit "Bewegung" gemeint.
    Wobei "Steine" der falsche Begriff ist, Figuren ist imho treffender. Denn diese verfügen über verschiedene Reichweite, Bewegungsmuster und Aktionen (Schlagen, Springen, Blockieren, etc.).

    manoh schrieb:

    Mein zweiter "wirrer" Vorschlag beruhte auf kein Koordinatensystem. Die Dreiecke kennen doch ihre direkte Nachbarn, kann man ja zuvor berechnen. Hier hatte ich mir das so vorgestellte, dass man "den Stein" mittels den Pfeiltasten von einen Stein zu einem anderen bewegen kann. Bis zu vier Schritte in einem Spielzug.
    Nein. Drag&Drop. Gibt es seit den 80ern. ;)
    * Kann Spuren von Erdnüssen enthalten.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von NSObject ()

  • Die Felder deines Spielfeldes adressierst Du wie folgt: x Reihen mit jeweils y Feldern. y ist ungerade. Es gilt, dass y für jede nächste Reihe (x+1) um 2 Felder kleiner wird. Alle ungeraden y sind Dreiecke mit Spitze nach oben, alle geraden y sind Dreiecke mit Spitze nach unten.

    Deine 6 Bewegungen kannst du auf 3 Achsen durchführen. Ich beschränke mich mal daher nur auf 3 Richtungen, die anderen 3 ergeben sich dann von selbst.

    1) Die erste ist die einfachste: x verändert sich nicht, y erhöht sich (oder erniedrigt sich) pro Schritt um 1.
    2) Die zweite ist etwas komplizierter. Es gibt 2 Fälle
    2a) Beginnst Du auf einem Dreieck mit Spitze nach oben, geht es: x+0/y+1, x+1/y-1, x+0/y+1, ... usw.
    2b) Beginnst Du auf einem Dreieck mit Spitze nach unten, geht es x+1/y-1, x+0/y+1, ... usw.
    Entsprechend, wenn Du auf der gleichen Achse in die andere Richtung gehst.
    3) Die dritte Bewegung ist eigentlich wie die 2., nur umgedreht für die Spitzen nach oben oder unten. Und wieder entsprechend für die andere Richtung.

    Natürlich musst Du immer überprüfen, ob Du nicht an den Rand des Spielfeldes stösst.

    Viel Spass.
  • NSObject schrieb:

    Nein. Drag&Drop. Gibt es seit den 80ern.
    Bei der Umsetzung in SpriteKit, SceneKit oder Unity3D brauchst Du kein (Koordinaten)System. Die Dreiecke müssen nur ihre Nachbarn kennen. Dann lässt sich einfach bestimmen, welche Dreiecke erreichbar sind. Die Animation der Figurbewegung erfolgt dann auf den direkten Weg oder im Zick-Zick, wenn alle Dreiecke angefahren werden sollen.

    Ein Dreieck hat drei Seiten: Spitze oben: links - a, rechts - b, unten - c und Spitze unten: links - b, rechts - a, oben - c (gespieglt an der vertikalen Achse) => Daraus ergeben sich mögliche Bewegungen (4 Schritte): aaaa, bbbb, acac, bcbc, caca, cbcb => ab und ba ist verboten genauso wie acb oder bac. Alles was diese Wege abdecken ist selektierbar.

    NSObject schrieb:

    Das ist ein plattes 2D Brettspiel. Draufsicht. Kein 3D.
    Ich habe nicht 2D oder 3D gemeint. Sondern es gibt drei Achsen: AxisA, AxisB, AxisC => es gibt drei Systeme: SystemA, SystemB, SystemC (1 -> [1], 2 -> [1,2,3], 3 -> [1,2,3,4,5]). Die Position eines Dreiecks Triangle1 ist im SystemA 1/1, im SystemB 3,1 und im SystemC 3,5. Wenn man sich jetzt auf der Achse AxisB um 2 Felder bewegt, dann ist die neue Position im System SystemB 3/3, SystemC 2/3 und SystemA 2/1. Hier muss man sich halt überlegen, wie man die Felder und die drei System am besten verknüpft, so dass man halt ziemlich einfach zwischen den System wechseln kann. Ob das für die Umsetzung mit einer Spieleengine geeignet ist, muss nicht sein. Da würde ich, wie oben gesagt, auf irgendwelche (Koordinaten)System verzichten und auf Beziehungen und Spielwege setzen.


    Vllt. sind jetzt meine zwei Ansätze etwas anschaulicher.