Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Rechtecke Rekursiv zeichnen.


juge - Mo 02.05.05 19:36
Titel: Rechtecke Rekursiv zeichnen.
Hi

Ich soll für die Schule ein Programm entwickeln welches Rechtecke in eine Paintbox zeichnet.
Das ganze soll nach einem Button Click wie folgt aussehen:

http://img79.echo.cx/my.php?image=programmrekursiv6eh.png

Die Kntenlänge der PaintBox soll 500 Pixel betragen. Die Kantenlänge des größten Rechteckes 250, die der nächsten vier 125 usw.. Halt immer die Kantenlänge ganzzahlig durch 2 um auf die des nächsten zu kommen. Eine Mindest-Kantenlänge(1-250) soll zusätzlich vom Benutzer eingegeben werden können. Die Eckpunckte der Rechtecke sind die Mittelpunckte der Rechtecke die direkt dahinter liegen. Das ganze soll Rekursiv gelösst werden.
Ich grübbel jetzt seit 4 Tagen an einer Formel für dieses Problem. Aber mir gelingt einfach nichts Vernünftiges. Ihr seid meine letzte Hoffnung :wink:

Bitte Helft Mir!

grüsse
juge

Moderiert von user profile iconraziel: img- durch url-Tags ersetzt


F34r0fTh3D4rk - Mo 02.05.05 19:42

es gibt doch auch dieses dingels mit den 3 dreiecken die aus 3 dreiecken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, die aus 3 dreicken bestehen, naja und so weiter eben :D


delfiphan - Mo 02.05.05 19:54

Hallo und :welcome: im DF!

user profile iconF34r0fTh3D4rk: Das Sierpinski-Dreieck kannst du mit (x and y <> 0) oder so ähnlich zeichnen. Das Dreieck wird also üblicherweise anders berechnet (nicht per Rekursion).

user profile iconjuge: Wie können wir dir jetzt helfen? Erwartest du von uns die Komplettlösung? Es handelt sich ja nur um wenige Zeilen... Ich machs mal so: Hier einfach mal ein Code-Gerüst, welches du vervollständigen kannst. Ich will dir ja nicht deine Hausaufgaben komplett lösen! Wenn du es richtig vervollständigst, erhältst du pixelgetreu das Originalbild. :)


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:
29:
type
 SquarePosition = (spRoot, spUpperLeft, spUpperRight, spLowerLeft, spLowerRight);

procedure RecursiveRect(Canvas: TCanvas; CX, CY, Size: Integer; Position: SquarePosition);
// Diese Prozedur zeichnet ein Quadrat der Kantenlänge "Size" mit Zentrum "CX", "CY".
// Ausserdem werden auch die Kinderquadrate gezeichnet (per Selbstaufruf).
begin
 with Canvas do
 begin
  if ... then // Kinderquadrate nur zeichnen, wenn sie nicht schon zu klein sind
  begin // Kinderquadrate zeichnen
   if Position <> spLowerRight then
    RecursiveRect(Canvas, ...); // Halb so grosses Quadrat am linken oberen Eckpunnkt zeichnen
   if Position <> spLowerLeft then
    RecursiveRect(Canvas, ...);
   if Position <> spUpperRight then
    RecursiveRect(Canvas, ...);
   if Position <> spUpperLeft then
    RecursiveRect(Canvas, ...);
  end;
  Rectangle(CX-Size div 2,CY-Size div 2,CX+Size div 2,CY+Size div 2); // sich selbst zeichnen
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 with PaintBox1 do
  RecursiveRect(Canvas, Width div 2, Height div 2, Width div 2, spRoot);
end;