AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sechseck mit Shapes füllen

Ein Thema von trigger86 · begonnen am 14. Mär 2010 · letzter Beitrag vom 23. Mär 2010
Antwort Antwort
trigger86

Registriert seit: 29. Jun 2009
4 Beiträge
 
#1

Sechseck mit Shapes füllen

  Alt 14. Mär 2010, 10:35
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;
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#2

Re: Sechseck mit Shapes füllen

  Alt 14. Mär 2010, 10:53
Guten Morgen und willkommen in der 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
Da könntest du mit dem "Abstand" und der Größe der Kreise variieren.

  Mit Zitat antworten Zitat
trigger86

Registriert seit: 29. Jun 2009
4 Beiträge
 
#3

Re: Sechseck mit Shapes füllen

  Alt 15. Mär 2010, 17:31
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

Re: Sechseck mit Shapes füllen

  Alt 15. Mär 2010, 17:55
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Horst_

Registriert seit: 22. Jul 2004
Ort: Münster Osnabrück
116 Beiträge
 
#5

Re: Sechseck mit Shapes füllen

  Alt 15. Mär 2010, 20:47
Hallo,

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

Gruß Horst
Miniaturansicht angehängter Grafiken
sechseck_483.png  
  Mit Zitat antworten Zitat
trigger86

Registriert seit: 29. Jun 2009
4 Beiträge
 
#6

Re: Sechseck mit Shapes füllen

  Alt 16. Mär 2010, 12:40
Also besteht das gesamte große Sechseckfeld-Feld aus kleinen Sechsecken mit Kreisen...?
  Mit Zitat antworten Zitat
Horst_

Registriert seit: 22. Jul 2004
Ort: Münster Osnabrück
116 Beiträge
 
#7

Re: Sechseck mit Shapes füllen

  Alt 16. Mär 2010, 16:17
Hallo,

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
Miniaturansicht angehängter Grafiken
sechseckkombi_994.png  
  Mit Zitat antworten Zitat
trigger86

Registriert seit: 29. Jun 2009
4 Beiträge
 
#8

Re: Sechseck mit Shapes füllen

  Alt 23. Mär 2010, 01:08
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?!
  Mit Zitat antworten Zitat
Horst_

Registriert seit: 22. Jul 2004
Ort: Münster Osnabrück
116 Beiträge
 
#9

Re: Sechseck mit Shapes füllen

  Alt 23. Mär 2010, 09:06
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
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#10

Re: Sechseck mit Shapes füllen

  Alt 23. Mär 2010, 09:15
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:13 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