Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Durch rekursive Prozedur Muster zeichnen
Nathan - Fr 04.05.12 19:31
Titel: Durch rekursive Prozedur Muster zeichnen
Hallo,
ich hoffe ihr könnt mir bei meinem Problem helfen. In der Kurzfassung sieht es so aus:
- durch einer rekursiven Prozedur werden mehrere Quadrate gezeichnet.
- Das erste Quadrat hat seinen Mittelpunkt in der Mitte der Paintbox (bei mir ist das 250, 250)
- Die Folgequadrate haben die Hälfte der Kantenlänge vom ersten Quadrat
- Der Mittelpunkt der Folgequadrate ist der obere Linke Eckpunkt des Urquadrats
- An jedem Eckpunkt des Urquadrat befindet sich ein Mittelpunkt des Folgequadrats
- Somit haben wir auf erster Ebene ein Urquadrat und auf zweiter Ebene vier Folgequadrate
- So soll sich das fortsetzen bis zu einer gewissen "Mindestkantenlänge"
Keine Sorge, ein Bild habe ich hinzugefügt.
zum Bild:
(grau markiert := Paintbox)
(grün markiert := das funktioniert bei mir)
(blau markiert := das muss noch dazu)
Mein Algorithmus bisher:
Um ein Quadrat in der Paintbox zu zeichnen benötigt es 4 Koordinaten. Anfangseckpunkt und Endeckpunkt (x1,y1,x2,y2).
Ich definiere also ein Starteckpunkt und dividiere diesen immer wieder durch zwei und schmeisse ihn zurück in die Prozedur bis die vom Nutzer eingegebene Mindestlänge erreicht wurde. Dann wird mit dem letzten ausgerechneten Wert angefangen zu zeichnen. Allerdings kriege ich dadurch ja nicht die Quadrate hin, die auf den anderen Eckpunkten liegen, sondern auf den Eckpunkt oben links! Leider komme ich nicht darauf wie ich die anderen Zeichnen kann...
Für Tipps und Hilfe wäre ich sehr dankbar :-)
Th69 - Fr 04.05.12 19:44
Hallo Nathan :welcome:
sollte es dann nicht auch auf der dritten Ebene jeweils 4 Quadrate (d.h insgesamt 16) geben?
Wenn ja, dann mußt du in deiner rekursiven Prozedur viermal diese Prozedur (mit jeweils entsprechenden Parametern) aufrufen.
Wenn nein, dann benötigst du vier spezialisierte Unterprozeduren, welche jeweils in die entsprechende Richtung sich rekursiv zeichnen (d.h. sich dann nur selber wieder aufrufen).
Nathan - Fr 04.05.12 20:07
Du hast natürlich recht!!! Entschuldigt mein Missgeschick. Ich habe die Grafik aktualisiert.
So nun zum Thema:
Meine rekursive Prozedur sieht so aus:
drawFigures(mindestlaenge:integer; startX: integer; startY:integer; laenge:integer);
wie du siehst benutze ich hierbei nur zwei Parameter die im Endeffekt zeichnen. Nämlich startX und startY. Allerdings hast du mich auf eine Idee gebracht. Ich müsste die Paras "endeX" und "endeY" auch noch hinzufügen. Eventuell könnte es dann klappen. Das probier ich jetzt mal aus.
edit:
ist auch quatsch.... zwei koordinaten müssen eigentlich genügen, da man sich die anderen beiden ja ausrechnen kann.
Th69 - Fr 04.05.12 20:31
Ich hoffe, dir ist jetzt klar, wie der Algorithmus aussehen muß?
Und ja, die zwei Koordinaten 'startX', 'startY' sowie die Länge 'laenge' müßten ausreichen.
Nathan - Fr 04.05.12 20:39
Ja ich weiß was du meinst. Das witzige ist, dass ich das vorher auch schon so hatte... Also diesen vierfach Aufruf derselben Prozedur mit veränderten Paras. Allerdings finde ich nicht die richtige Berechnung innerhalb des Aufrufs, die ich Ausführen muss um mich zu den gewünschten Koordinaten hinzubewegen. Ich hoffe du verstehst was ich meine :D
Th69 - Sa 05.05.12 10:54
Ist eigentlich ja nur ein bißchen einfache Mathematik.
Der Mittelpunkt des neuen Quadrats soll jeweils eine der vier Ecken (nicht jeweils die linke obere!) des Urquadrats entsprechen.
Und aus Mittelpunkt und Länge läßt sich ja wieder die linke obere Ecke (startX, startY) berechnen.
Am besten du berechnest und testest jeweils eine der vier rekursiven Aufrufe getrennt und wenn alle funktionieren, aktivierst du sie alle zusammen (d.h. sequentiell die vier rekursiven Aufrufe).
Nathan - Sa 05.05.12 16:09
Läuft jetzt :D Danke schön!
Th69 - Sa 05.05.12 16:46
Hallo Nathan,
super, daß es jetzt bei dir läuft.
Daher wäre es schön, wenn du den Code für die Rekursion hier reinstellen würdest, dann hätten auch andere etwas davon und könnten dies mal ausprobieren.
Nathan - Sa 05.05.12 19:37
Ich werde ihn in eineinhalb Woche reinstellen aus bestimmten Gründen :-)
Blup - Mo 21.05.12 13:27
Da uns Nathan aus "bestimmten Gründen" seine Lösung vorenthält, hier meine:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| procedure ZeichneRechteck(ACanvas: TCanvas; x, y, d, n: Integer); var x1, x2, y1, y2: Integer; begin x1 := x - d; y1 := y - d; x2 := x + d; y2 := y + d; ACanvas.Rectangle(x1, y1, x2, y2); if n > 0 then begin Dec(n); d := d div 2; ZeichneRechteck(ACanvas, x1, y1, d, n); ZeichneRechteck(ACanvas, x2, y1, d, n); ZeichneRechteck(ACanvas, x1, y2, d, n); ZeichneRechteck(ACanvas, x2, y2, d, n); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin ZeichneRechteck(PaintBox1.Canvas, PaintBox1.Width div 2, PaintBox1.Height div 2, 32, 4); end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!