Entwickler-Ecke

Algorithmen, Optimierung und Assembler - rekursive Procedure zum Zeichnen (delphi 7)


Tigu - Mi 15.03.06 16:23
Titel: rekursive Procedure zum Zeichnen (delphi 7)
Hallo ihr!

Wir haben heute im Unterricht mit rekursiven Proceduren begonnen.
Dabei haben wir proceduren zum rechnen programiert.
Nun sollen wir diese Procedur so umschreiben, dass eine Elipsen-/ oder Kreisschar gezeichnet wird, wobei der Programmbenutzer in einem SpinEdit den Anfangsradius aussuchen soll. Mir ist klar, das ich für die Programmierung einen Radius und einen Abstand zwischen den Elipsen/Kreisen benötige, der der als integer deklariert ist.
Laut meinem Lehrer ist der Quelltext ganz kurz und dauert nur 10 Minuten. :gruebel:
Mir ist nur nicht klar, wie ich die vorhandene Procedure so umschreiben kann, dass das funktioniert. Auch für einen Neuanfang fehlt mir eine Idee.
Könnte ihr mir bitten einen Denkanstoß geben, wie man das machen kann.

Schon einmal Danke für die Hilfe

Tigu

Quelltext meines vorhandenen Buttons:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.BnrekursivClick(Sender:TObjekt);
var zeile:integer;
    procedure rekursivezeile (i:integer; var zeile:integer);
    begin
    if i=1 then
     zeile:=1
     else
     begin
     rekursivezeile(i-1,zeile);
     zeile:=zeile+1;
     end;
    end;

begin
rekursivezeile(spinediteingabe.Value,zeile);
Ausgabe.Text:=IntToStr(zeile);
end;



Moderiert von user profile iconTino: Topic aus VCL (Visual Component Library) verschoben am Do 16.03.2006 um 10:54


digi_c - Mi 15.03.06 16:28

Was willst du denn rekursiv machen? Kreise zeichnen und den Radius bis 0 runterdrehen?


Tigu - Mi 15.03.06 16:30

Kreise zeichnen, den Radius herhöhen bis MaxValue ist rekursiv.


F34r0fTh3D4rk - Mi 15.03.06 16:38
Titel: Re: rekursive Procedure zum Zeichnen (delphi 7)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure Kreise(l, t, r, b, imax: integer);
begin
  if imax > 1 then
    Kreise(l + 1, t - 1, r + 1, b - 1, imax - 1);
  form1.canvas.ellipse(l, t, r, b);
end;


sollte so gehen, als max dann zb 100 angeben


Tigu - Mi 15.03.06 16:46

@F34r0fTh3D4rk,

kannst du mir bitte sagen, was an der Programmierung rekursiv werden soll?
Was ist mit

Delphi-Quelltext
1:
form1.canvas.rectangle(l, t, r, b);                    

? Müsste da nicht eher Elipse oder circle hin?


F34r0fTh3D4rk - Mi 15.03.06 16:54

wie was rekursiv werden soll ?

das ist rekursion ^^

jetzt ist das auch mit ellipse


mkinzler - Mi 15.03.06 16:56

Zitat:
wie was rekursiv werden soll ?

Die Funktion ruft sich selbst auf!


F34r0fTh3D4rk - Mi 15.03.06 16:59

<- der da hat folgendes geschrieben:
1. Was ist Rekursion ?

Rekursion oder auch Rekurrenz oder Rekursivität leitet sich von dem lateinischen Begriff recurrere (zurücklaufen) ab und ist ein algorithmisches Prinzip zur Lösung von Problemen, durch das Zerlegen in Teilprobleme um zu einer eleganten Lösung zu gelangen, dabei werden öfter vorkommende Segmente durch wiederholten Selbstaufruf zusammengefasst.

Dies funktioniert folgendermaßen:

Eine Funktion oder Prozedur ruft sich selbst auf:


Delphi-Quelltext
1:
2:
3:
4:
procedure a();
begin
  a();
end;


eine andere Möglichkeit ist die indirekte Rekursion:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure a();
begin
  b();
end;

procedure b();
begin
  a();
end;


so kannst du das auch machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure Kreise(radius, x, y, abstand, imax: integer);
begin
  if imax > 1 then
    Kreise(radius - abstand, x, y, imax - 1);
  form1.canvas.ellipse(x - radius, y - radius, x + radius, y + radius);
end;