Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - HexFeld erstellen


Sylexx - So 21.03.10 18:27
Titel: HexFeld erstellen
Hallo,

ich beschäftige mich z.Z. mit der Erstellung eines sechseckigen Feldes, welches 61 Kreise beinhaltet. Es handelt sich hierbei um das Spiel "Abalone". Zur Verdeutlichung ein Beispiel: http://page.mi.fu-berlin.de/gehroldt/sumo/andere/g5.png

Habe schon etliche Foren erfolglos durchsucht. Ich sitze schon ne ganze Weile an der Erstellung des SPielfeldes und finde einfach keinen Ansatz sprich wie ich beginne. Ich weiß, aus welchen Bestandteilen ein Sechseck besteht, das die Mittelpunkte der Kreise berechnet werden können. Man könnte es sich auch so vorstellen: http://homepages.di.fc.ul.pt/~jpn/gv/boards/conn6.gif

Wäre über jeden Ansatz bzw. Hilfestelltung sehr froh.


Gausi - So 21.03.10 20:10

Hallo und :welcome: in der Entwickler-Ecke,

Du kannst ja erstmal damit anfangen, die 9 Kreise in der Mitte zu zeichnen. Die Koordinaten der Kreise darüber bekommt man mit Pythagoras raus: Die Kreismittelpunkte bilden jeweils gleichseitige Dreiecke. Wenn du den horizontalen Abstand kennst, kannst du daraus auch den vertikalen berechnen und hast damit die Koordinaten der Kreise in den anderen Zeilen.
g5


Sylexx - Mo 22.03.10 01:28

Danke erstmal für deine Antwort. Die 9 Kreise habe ich nun und pfeile gerade daran, die Kreise in den anderen Zeilen zu erstellen.

Was mich bei der Erstellung noch beschäftigt, ist, wie ich später, wenn ich das Feld habe, diese Kreise ansteuern kann...ich zeichne
ja momentan nur...


jaenicke - Mo 22.03.10 03:09

Vielleicht gibt dir mein Periodensystem da eine Idee, der Quelltext sieht zwar erstmal vielleicht etwas kompliziert aus, aber das sieht nur so aus. :mrgreen:
http://www.delphi-forum.de/viewtopic.php?p=557541


jfheins - Mo 22.03.10 11:24

Ich würde ein schnuckeliges schiefwinkliges Koordinatensystem aufstellen, mit dem einen Einheitsvektor nach rechts un der zweite im 60° Winkel nach oben rechts. Die Einheitsvektoren im kartesischen Koordinatensystem kannst du dann einmal berechnen (sollte nicht allzu schwer sein)

Dann kannst du prozeduren schreiben wie z.B. MaleKreis(1,1) die den Kreis an Position 1,1 (ein nach rechts, ein nach oben rechts) zeichnet.

Die Grenzen des Sechsecks sind dann wie folgt:
max(x,y) <= (n-1)
abs(x+y) <= (n-1)
wobei n die Kantenlänge des Sechsecks ist. (beide Bedingungen müssen erfüllt werden)


Sylexx - Mo 22.03.10 14:20

Also ich habe das obere Hälfte des Spielfeldes erstmal so erstellt, wie es Gausi in etwa beschrieben hat (siehe Anhang).
Habe die 9 Kreise in der Mitte gezeichnet und habe dann die Positionen der darüber liegenden Zeilen/Kreise anhand des Pythagoras berechnet.

Habe mir mal das Periodensystem angeschaut, könnte auch zu einer guten Lösung verhelfen.

Ist die Frage, was jetzt am Besten ist und ob ich mit meinem jetzigen Lösungsansatz auch später gut fahre...


jfheins - Mo 22.03.10 18:23

Ich glaube das kommt auch drauf an, ob du danach noch was damit machen möchtest. Für solche Sachen wie "Welche Felder sind benachbart? Wiviele Felder liegen zwischen dem da und dem da?" ist ein passendes Koordinatensystem schon praktisch ;)

Ich hatte ein bisschen freie Zeit, und hab auc direkt eine Norm entwickelt:
Abstand = MIN(ABS(x) + ABS(y) ,ABS(x+y) + MIN(ABS(x), ABS(y)))
gibt den Anstand eines Punkts zum Ursprung an. Anstand zwischen zwei Punkten geht dann entsprechend.


Sylexx - Di 23.03.10 00:46

Ohje, ich war noch nie so gut in Algebra. Aber nun gut, das mit dem Koordinatensystem sollte ich hinkriegen, allerdings verstehe ich nicht ganz, was du mit diesem Satz ausdrücken willst:

"Die Einheitsvektoren im kartesischen Koordinatensystem kannst du dann einmal berechnen (sollte nicht allzu schwer sein)"

Meinst du damit die Achsen und deren Abschnitte? Die muss ich ja dann auch aufteillen, damit ich die Koordinaten zuordnen kann...


jfheins - Di 23.03.10 01:00

Damit meinte ich die Umwandlung von "hex-koordinaten" nach kartesische Koordinaten.

Wenn du zum Beispiel ein Canvas hast, in dem die X-Achse nach rechts zeigt und die Y-Achse nach unten, dann gilt
(hex) = (kartesisch)
(1, 0) = (1, 0)
(0, 1) = (0.5, sqrt(3)/2)

Wenn du also die Position (5, -2) auf dem Canvas darstellen möchtest, rechnest du einfach
5 * (1, 0) + -2* (0.5, sqrt(3)/2)
= (4, -sqrt(3)) ~ (4, 1.732)

letzeres ist dann diene x-y-Koordinate, mit der du auf das Canvas malen kannst.