Autor Beitrag
Nathan
Hält's aus hier
Beiträge: 6
Erhaltene Danke: 1



BeitragVerfasst: Fr 04.05.12 19:31 
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 :-)
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von Nathan am Fr 04.05.12 20:02, insgesamt 3-mal bearbeitet
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4059
Erhaltene Danke: 842

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4059
Erhaltene Danke: 842

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4059
Erhaltene Danke: 842

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: 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).

Für diesen Beitrag haben gedankt: Nathan
Nathan Threadstarter
Hält's aus hier
Beiträge: 6
Erhaltene Danke: 1



BeitragVerfasst: Sa 05.05.12 16:09 
Läuft jetzt :D Danke schön!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4059
Erhaltene Danke: 842

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6
Erhaltene Danke: 1



BeitragVerfasst: Sa 05.05.12 19:37 
Ich werde ihn in eineinhalb Woche reinstellen aus bestimmten Gründen :-)
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 165
Erhaltene Danke: 42



BeitragVerfasst: Mo 21.05.12 13:27 
Da uns Nathan aus "bestimmten Gründen" seine Lösung vorenthält, hier meine:
ausblenden 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;
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mo 21.05.12 19:20 
Hier gibts noch mehr zu dem Thema:
www.delphi-forum.de/...;highlight=rekursion

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)