Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Sechseck mit Shapes füllen (https://www.delphipraxis.net/149101-sechseck-mit-shapes-fuellen.html)

trigger86 14. Mär 2010 09:35


Sechseck mit Shapes füllen
 
Hallo,

ich verzweifel momentan an folgendem Problem: ich möchte ein Sechseck zeichnen und dieses dann mit Kreisen füllen. Es
handelt sich dabei um das Spiel "Abalone" (Siehe Bild). Das Sechseck
bekomme ich hin...allerdings habe ich Probleme beim Füllen des Sechsecks.
Sechseck und Kreise sollen beim OnPaint-Ereignis erstellt werden. Anfangs dachte ich an ein DrawGrid, aber da die Kreise
in jeder Reihe anders angeordnet sind, funktioniert das wohl nicht.

Kann mir jemand einen Tipp geben?


Mein bisherige Überlegung für das Sechseck:

cal:= 200; // Durchmesser
x:= PaintBox1.Width div 2;
y:= PaintBox1.Height div 2; //mittelpunkt
PaintBox1.canvas.moveto(x + round(d*(cos(DegToRad(0)))), y + round(d*(sin(DegToRad(0)))));
for i:= 1 to 6 do begin // für die sechs ecken
newx := x+round(d*(cos(DegToRad(winkel*i))));
newy := y+round(d*(sin(DegToRad(winkel*i))));
PaintBox1.canvas.lineto(newx,newy);
end;

haentschman 14. Mär 2010 09:53

Re: Sechseck mit Shapes füllen
 
Guten Morgen und willkommen in der DP :dp:

Zum Thema:

Warum willst du ein Sechseck zeichnen und dann ausfüllen ? Die Mittelpunkte der Kreise sind doch berechenbar. Dort einfach die Kreise Zeichnen.
Frag bitte nicht nach der Formel...dafür ist es zu früh am Sonntag :zwinker:
Da könntest du mit dem "Abstand" und der Größe der Kreise variieren.

:hi:

trigger86 15. Mär 2010 16:31

Re: Sechseck mit Shapes füllen
 
Ist aber mit einem Array zu realisieren, oder?

Die Berechnung der Mittelpunkte der Kreise ist soweit klar. Aber wie bau ich das am besten auf?
Habe da gerade irgendwie ein Verständnisproblem.

Sir Rufo 15. Mär 2010 16:55

Re: Sechseck mit Shapes füllen
 
Für das Zeichnen brauchst du kein array sondern Mathematik.

Mal dir die Kreise UND dann die Sechsecke (Verbindung der Kreismittelpunkte) mal auf.

Daraus kannst du eine Formel ableiten womit du aus den Parametern (MittelpunktErsterKreis( x, y ), Durchmesser) das gesamte Feld zum Zeichnen berechnen kannst.

edit: bevor du diese Formel nicht hast, brauchst du dich um das Zeichnen auf der Form nicht zu kümmern.
Aber dafür kannst du dann z.B. ein Delphi-Referenz durchsuchenTImage nehmen und dort auf dem Delphi-Referenz durchsuchenTImage.Canvas rummalen

Horst_ 15. Mär 2010 19:47

Re: Sechseck mit Shapes füllen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

anbei eine kleine Skizze mit einer Seitenlänge einer Sechseckseite von 10.
Das sollte die Lage der rot umringten Mittelpunkte verdeutlichen.

Gruß Horst

trigger86 16. Mär 2010 11:40

Re: Sechseck mit Shapes füllen
 
Also besteht das gesamte große Sechseckfeld-Feld aus kleinen Sechsecken mit Kreisen...?

Horst_ 16. Mär 2010 15:17

Re: Sechseck mit Shapes füllen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

Zitat:

Zitat von trigger86
Also besteht das gesamte große Sechseckfeld-Feld aus kleinen Sechsecken mit Kreisen...?

Ich habe das Bild mal gedreht und auf dieses Sechseck mit 5 Kreisen als Rand, wie in deinem Bild, gebracht.
Im unteren Teil des Bildes sind dann die Masze eingetragen, 10 soll die Seitenlänge einer Sechseckkante sein.
Ich hoffe man sieht, das die Sechseck-Mittelpunkte auf einem gleichseitigem Dreieck liegen.
In der Skizze zuvor hast Du ja gesehen, das ein Sechseck aus 6 gleichseitigen Dreiecken besteht.
Ach herrje, steht doch alles hier ...
Wikipedia Sechseck

Gruß Horst

trigger86 23. Mär 2010 00:08

Re: Sechseck mit Shapes füllen
 
Hallo und vielen Dank für eure Tipps!

Ich habe ein wenig rugebastelt und kann das Feld jetzt zeichnen. Das mit den Punkten in Bezug auf dem gleichseitigen
Dreieck hat mir sehr weitergeholfen.
Was mich bei der Erstellung noch beschäftigt, ist, wie ich später, wenn ich das Feld habe, diese Kreise ansteuern kann...ich habe ja momentan
nur gezeichnet...

Mir wurde noch ein Tipp gegeben, es mit einem schiefwinkligen Koordinatensystem zu probieren, mit einem Vektor nach rechts und nach schräg oben,
aber wie man das umsetzen soll?!

Horst_ 23. Mär 2010 08:06

Re: Sechseck mit Shapes füllen
 
Hallo,

Das mit der Transformation des Koordinatensystem, von einem Rechtwinkligen in eines mit 60 Grad ist richtig.
In dem Bildbreich oben wär die gelbe Linie eine x - Achse und wenn man die grüne an der gelben spiegelt eine neue y-Achse.
Wenn Du aber den Kreuzungspunkt aller Mittelpunkte Aussensechsecke des Spielfeldes, als Koordinaten Ursprung (0|0) setzt und als Richtungsvektor rx in der neuen x Achse ein Vielfaches von (sqrt(3)|0) nimmst, sowie als neue y-Richtung ry entsprechend das selbe Vielfache von (0.5*sqrt(3) | 1,5) nimmst wird es viel einfacher.
Das Vielfache so wählen, das es dem Abstand der Mittelpunkte entspricht.
Zum Beispiel wäre der Abstand der Mittelpunkte 34,... Punkte dann wäre neues
rx= 20*(sqrt(3)|0 ) = (34|0 ) und entsprechend ry = ( 17 | 30 ) //20 wäre also die Seitenlänge eines Sechseckes
Jetzt hätte dein mittleres Sechseck die Koordinaten 0|0 die sechs Ecken des Spielfeldes rechtsdrehend, Dein Sechseckfeld hat ja 5 =[0..4] Randfelder, deshalb:
4|0, 0|4 , -4|4, -4|0 , 0|-4 , 4|-4
Nein, was ist das praktisch!
Jetzt musst Du Dir nur überlegen, welche Koordinaten-Kombinationen gültig sind, damit Du auf dem Spielfeld bleibst.
Reicht es, dass die Summe x+y im Bereich [-4..4] liegt ?

Gruß Horst

jfheins 23. Mär 2010 08:15

Re: Sechseck mit Shapes füllen
 
Ich hab mir das Spiel grad mal auf Wikipedia angeguckt, und da steht, dass es ja schon ein Nummerierungssystem gibt - um mit dem kompatibel zu bleiben (einfache Umrechnung) kannst du auch den zweiten Basisvektor nach oben links zeigen lassen (120° Winkel zwischen den Vektoren)

Wie man das umsetzen kann? Definiere einen Typ THexPoint der die Koordinaten des schiefwinkligen Systems hat. Jede Kugel hat dann ein Feld dieses Typs, sodass die Kugel weiß wo sie liegt. Um die Kugeln zu zeichnen brauchst du eine Funktion, die diese Hex-Koordianten in kartesische umrechnet, die Formel hab ich dir im DF schon geschrieben.

Das zeichnen geht dann wie folgt:
1. Eine Schleife über alle Hex-Koordinaten die zum Sechseck gehören. Darin dann aus dem THexPoint einen TPoint machen (umrechnen in seperater Funktion) und auf das Canvas malen.
2. Die Kugen durchgehen und jede Kugel an ihre Position malen (wieder umrechnen)

Der eigentliche Vorteil des Koordinatensystems kommt aber erst später: Du kannst die Züge einfacher darstellen, und z.B. prüfen ob ein Zug gültig ist oder ob eine Kugel vom Feld gestoßen wurde. ;)

Beim umrechnen würde ich aber noch einen Skalierungsfaktor einbauen, sonst sind die Mittelpunkte deiner Kugeln nur 1 Pixel entfernt ;)

P.S.: Crossposts bitte verlinken


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz