![]() |
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" ( ![]() 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; |
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: |
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. |
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 ![]() ![]() |
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 |
Re: Sechseck mit Shapes füllen
Also besteht das gesamte große Sechseckfeld-Feld aus kleinen Sechsecken mit Kreisen...?
|
Re: Sechseck mit Shapes füllen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Zitat:
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 ... ![]() Gruß Horst |
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?! |
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 ![]() 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 |
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.: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz