Entwickler-Ecke

Sonstiges (Delphi) - Rekursive Figuren


Informatiklady - Fr 21.01.11 13:27
Titel: Rekursive Figuren
Wir haben ein Problem!
Unser Lehrer in der Schule hat uns dies nicht richtig erklärt.
Könnt ihr uns bei der Programmierung dieses AB helfen?

http://projekte.gymnasium-odenthal.de/informatik/dateien/Informatik/Jahrgangsstufe%2012-13/Unterrichtsreihen%20Java%20ABI%202012/01%20Rekursion/02%20Turtle/Docs/04%20Arbeitsblatt%20zu%20rekursiven%20Grafiken%20-%202.pdf

Würden uns über Antworten freuen.


Nersgatt - Fr 21.01.11 13:39

Dann zeig doch mal Deine Ansätze und wo es genau hakt. Wir helfen gern bei der Aufgabe - aber wir machen sie nicht für Dich.


Xion - Fr 21.01.11 13:42

Hi und :welcome:

user profile iconInformatiklady hat folgendes geschrieben Zum zitierten Posting springen:
Könnt ihr uns bei der Programmierung dieses AB helfen?

Können ja.

An sich musst du dir erstmal überlegen:

Wie zeichne ich ein einfaches Rechteck. Welche Parameter hat die dafür nötige Funktion.

Der Trick an Rekursion ist, dass du beim Rechteck zeichnen die Procedure fürs Rechteck zeichnen wieder aufrufst...die ruft dann wieder Rechteck zeichnen auf usw. Du hast dann eine endlose Folge. Stürzt dein Programm mit der Meldung "Stack overflow" ab, dann hast du es schon fast geschafft ;) Dann musst du nur noch eine Abbruchbedingung definieren.

Edit: Was ich nicht verstehe ist das "Fehler! Keine gültige Verknüpfung.". Besonders in der ersten Zeile ergibt das garkeinen Sinn für mich.


Martok - Fr 21.01.11 13:56

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Edit: Was ich nicht verstehe ist das "Fehler! Keine gültige Verknüpfung.". Besonders in der ersten Zeile ergibt das garkeinen Sinn für mich.
Der Lehrer war zu dusslig, ein richtiges PDF zu erstellen :) Die Bilder stammen wohl aus externen Dateien im Ursprungsdokument, und die konnten dann nicht gefunden werden beim ver-pdf-en.

Ansonsten kann ich nur nochmal bekräftigen was die anderen hier auch schon gesagt haben: bei konkreten Fragestellungen helfen wir immer gern, aber ganze Aufgaben wirds hier nicht geben. Aber für die ersten 3 gibts ja jetzt den Ansatz von user profile iconXion :zustimm:


Informatiklady - Fr 21.01.11 14:08

Für die ersten 3 Figuren haben wir schon allein eine Lösung gefunden jetzt fehlt uns für die nächsten Figuren der Ansatz.

Das sind die Prozeduren für Figur 1-3:


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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
procedure Tform1.quadrat(x1,y1,l,ordnung1:integer);
begin
  if ordnung1 = 0 then Image1.Canvas.Rectangle(x1,y1,x1+l,y1+l)
  else
  begin
    quadrat(x1,y1,l div 2, ordnung1-1);
     quadrat(x1+l div 2,y1,l div 2, ordnung1-1);
      quadrat(x1,y1+l div 2 ,l div 2,ordnung1-1);
       quadrat(x1+l div 2, y1+l div 2, l div 2, ordnung1-1);


      end;

  end;
 procedure TForm1.quadrat2(x1,y1,l,ordnung:integer);
        begin
  if ordnung = 0 then Image1.Canvas.Rectangle(x1,y1,x1+l,y1+l)
  else if ordnung=1 then
  begin
    quadrat2(x1,y1,l div 2, ordnung-1);
     quadrat2(x1+l div 2,y1,l div 2, ordnung-1);
      quadrat2(x1,y1+l div 2 ,l div 2,ordnung-1);
       quadrat2(x1+l div 2, y1+l div 2, l div 2, ordnung-1);
       end
       else begin
         quadrat2(x1,y1,l div 2,0) ;
         quadrat2(x1+l div 2,y1,l div 2, ordnung-1);
         quadrat2(x1,y1+l div 2 ,l div 2,ordnung-1);
         quadrat2(x1+l div 2, y1+l div 2, l div 20);
      end;
      end;

       procedure TForm1.quadrat3(x1,y1,l,ordnung2:integer);
         begin
  if ordnung2 = 0 then Image1.Canvas.Rectangle(x1,y1,x1+l,y1+l)
  else if  odd(ordnung2)           then
  begin quadrat3(x1,y1,l div 2, ordnung2-1) ;
         quadrat3(x1+l div 2,y1,l div 20);
         quadrat3(x1,y1+l div 2 ,l div 2,0);
         quadrat3(x1+l div 2, y1+l div 2, l div 2,ordnung2-1);

       end
       else begin
   quadrat3(x1,y1,l div 20);
     quadrat3(x1+l div 2,y1,l div 2, ordnung2-1);
      quadrat3(x1,y1+l div 2 ,l div 2,ordnung2-1);
       quadrat3(x1+l div 2, y1+l div 2, l div 20);
      end;


Moderiert von user profile iconMartok: Delphi-Tags gesetzt


Xion - Fr 21.01.11 14:18

Das sieht doch schomal gut aus (mal von der seltsamen Einrückung abgesehen).

Figur 6,7 funktionieren ähnlich. Die 6 ist im Endeffekt die 1, nur dass man um das Rechteck etwas Platz lässt. Der freigelassene Platz ist prozentual zu sehen...

Hmm, die 7 ist knifflig :D Da seh ich auf Anhieb nicht wie das System genau ist.


Bei der 4 musst du irgendwie die Rotation mit übergeben. Deine Funktion würde also noch einen zusätzlichen Parameter kriegen (rotiert=ja/nein), den schaltest du bei jedem Zeichnen um (not rotiert).
Ich glaub das gedrehte Rechteck müsst ihr mit 4 Linien zeichnen, weiß nicht ob das Canvas rotierte Rechtecke kann.


Informatiklady - Fr 21.01.11 14:24

Geht das jetzt auch nochmal mit einfachem Deutsch weil wir haben das jetzt komplett nicht verstanden =(


Xion - Fr 21.01.11 14:32

Hehe, klar :D Mal als Quellcode


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure Tform1.quadrat4(x1,y1,l,ordnung1:integer; rotiert: boolean);
begin
  if ordnung1 = 0 then 
    //stop
  else
  begin
    if rotiert then
    begin
      begin
        //hier die Rechtecke verdreht zeichnen
        //...
        quadrat4(neuX,neuY,neuL,ordnung-1not rotiert);
      end
    else
      begin
        //hier die Rechtecke gerade zeichnen        
        //...
        quadrat4(neuX,neuY,neuL,ordnung-1not rotiert);
      end;
  end;
end;


Edit:
Ich habe mal Aufgabe1 etwas umgestellt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure Tform1.quadrat(x1,y1,l,ordnung1:integer);
begin
  if ordnung1 <> 0 then
    begin
      Image1.Canvas.Rectangle(x1,y1,x1+l,y1+l);
      quadrat(x1,y1,l div 2, ordnung1-1);
      quadrat(x1+l div 2,y1,l div 2, ordnung1-1);
      quadrat(x1,y1+l div 2 ,l div 2,ordnung1-1);
      quadrat(x1+l div 2, y1+l div 2, l div 2, ordnung1-1);
    end;
end;

Im Endeffekt habt ihr es effizienter gemacht (d.h. er muss weniger zeichnen). Aber das hier ist ein besserer Ausgangspunkt für die andren Aufgaben ;)


Xion - Fr 21.01.11 14:56

Ich habs geschafft:

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:
30:
31:
32:
33:
34:
35:
36:
37:
procedure Tform1.quadrat4(x1,y1,l,ordnung:integer; rotiert: boolean);
begin
  if ordnung <> 0 then
    begin
      if rotiert then
        begin
          //Raute zeichnen
          Image1.Canvas.MoveTo( round(X1+0.5*l) , Y1);
          Image1.Canvas.LineTo( X1              , round(Y1+0.5*l));
          Image1.Canvas.LineTo( round(X1+0.5*l) , round(Y1+l));
          Image1.Canvas.LineTo( round(X1+l)     , round(Y1+0.5*l));
          Image1.Canvas.LineTo( round(X1+0.5*l) , round(Y1));
          Image1.Canvas.MoveTo( round(X1+0.25*l), round(Y1+0.25*l));
          Image1.Canvas.LineTo( round(X1+0.75*l), round(Y1+0.75*l));
          Image1.Canvas.MoveTo( round(X1+0.25*l), round(Y1+0.75*l));
          Image1.Canvas.LineTo( round(X1+0.75*l), round(Y1+0.25*l));

          quadrat4(round (x1+1/8*l),round (y1+3/8*l),l div 4, ordnung-1not rotiert);
          quadrat4(round (x1+3/8*l),round (y1+5/8*l),l div 4, ordnung-1not rotiert);
          quadrat4(round (x1+5/8*l),round (y1+3/8*l),l div 4, ordnung-1not rotiert);
          quadrat4(round (x1+3/8*l),round (y1+1/8*l),l div 4, ordnung-1not rotiert);
        end
      else
        begin
          Image1.Canvas.Rectangle( X1,Y1,X1+l ,Y1+l );
          Image1.Canvas.MoveTo( X1   , round(Y1+0.5*l));
          Image1.Canvas.LineTo( X1+l , round(Y1+0.5*l));
          Image1.Canvas.MoveTo( round(X1+0.5*l) , Y1);
          Image1.Canvas.LineTo( round(X1+0.5*l) , Y1+l);

          quadrat4(x1,y1,l div 2, ordnung-1not rotiert);
          quadrat4(x1+l div 2,y1,l div 2, ordnung-1not rotiert);
          quadrat4(x1,y1+l div 2 ,l div 2,ordnung-1not rotiert);
          quadrat4(x1+l div 2, y1+l div 2, l div 2, ordnung-1not rotiert);
        end;
    end;
end;


Die gibts gratis von mir :mrgreen:

Zur Erklärung:
Das Programm biegt bei jeder Rekursionsstufe (also "Aufruftiefe") abwechselnd in eine der beiten if-Zweige ab. Einmal werden Rauten gezeichnet, einmal Rechtecke. Um auf die Zahlenwerte zu kommen, guckt euch mal das Bild im Anhang an.


Informatiklady - Fr 11.02.11 14:19

Das Funktioniert aber irgendwie nicht so wirklich!!!


Delphi-Laie - Fr 11.02.11 15:23

user profile iconInformatiklady hat folgendes geschrieben Zum zitierten Posting springen:
Wir haben ein Problem!
Unser Lehrer in der Schule hat uns dies nicht richtig erklärt.


Ja, ja, immer die bösen Lehrer (manchmal auch als "Pauker" verunglimpft). Auf Dritte, die sich nicht wehren können, schimpfen. Es ist ja so leicht, anderen die Schuld zu geben.

Bevor Du Dich zu solchen Urteilen aufschwingst, was tatest Du, was tatet Ihr dazu, um das "Problem" anzugehen?

Konnte wirklich keiner der Schüler seinen Ausführungen folgen? Dann wäre es in der Tat ein ziemlich objektiver Gradmesser dafür, daß die Erklärungen defizitär waren. Falls es doch welche gab, die folgen konnten, dann sieht die Schuldfrage hingegen längst nicht so eindeutig aus.

Außerdem fehlt in Deinem Beitrag irgendein Hinweis, was konkret nicht verstanden wurde bzw. bei was wir hier helfen könn(t)en.

Einfach nur eine PDF über einen Verweis hier hingerotzt....Vergiß nicht (oder sei Dir hiermit erstmalig dessen bewußt), daß all' die, die hier helfen, das altruistisch und i.d.R. auch in ihrer Freizeit tun. Ein wenig mehr Entgegenkommen wäre mithin angebracht.


Xion - Fr 11.02.11 19:21

user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Einfach nur eine PDF über einen Verweis hier hingerotzt....Vergiß nicht (oder sei Dir hiermit erstmalig dessen bewußt), daß all' die, die hier helfen, das altruistisch und i.d.R. auch in ihrer Freizeit tun. Ein wenig mehr Entgegenkommen wäre mithin angebracht.

Nee, das ist schon ein altes Thema ;) Und sie haben sich ja Tatsache mit beschäftigt, das ist schon ok.


user profile iconInformatiklady hat folgendes geschrieben Zum zitierten Posting springen:
Das Funktioniert aber irgendwie nicht so wirklich!!!

Das ist allerdings ne schlechte Fehlerbeschreibung. Man muss ja schon interpretieren, um rauszukriegen, dass es nicht geht :D

Also am besten du zeigst mal deinen Code, denn der Code von mir funktionierte so bei mir ;) Notfalls mal euer ganzes Projekt hochladen, dann kann man mal dort reingucken.

PS: ihr habt aber viel Zeit für die Aufgaben :D

Moderiert von user profile iconNarses: Zitat repariert.


Informatiklady - Fr 18.02.11 13:10

Hier ist unsere Projektarbeit die wir bis jetzt haben!!


Xion - Fr 18.02.11 18:43

Du musst das ganze Projekt anhängen, nicht nur die DPR. Am besten als Zip-Datei packen. Vor allem die Unit ist wichtig (Unit1.pas), denn dort steht euer Quellcode drin.


Dude566 - Fr 18.02.11 19:44

Wie wäre es hier mit: http://www.delphi-treff.de/tutorials/grundlagen/ ?

So Fehlermeldungen wie: "Das funktioniert nicht!!!!!", sind ja schrecklich! :roll:


Informatiklady - Mo 28.02.11 14:59

Das ist das Programm was wir bis jetzt erstellt haben bwz. die Unit

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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Figur1: TButton;
    Figur2: TButton;
    Figur8: TButton;
    Figur3: TButton;
    Figur4: TButton;
    Figur5: TButton;
    Figur6: TButton;
    Figur7: TButton;
    Image1: TImage;
    FigurLoeschen: TButton;
    Abbrechen: TButton;
    Eingabe: TEdit;
    procedure FigurLoeschenClick(Sender: TObject);
    procedure AbbrechenClick(Sender: TObject);
    procedure Figur1Click(Sender: TObject);
    procedure Figur2Click(Sender: TObject);
    procedure Figur4Click(Sender: TObject);
    procedure Figur3Click(Sender: TObject);



  private

    procedure quadrat(x1,y1,l,ordnung1:integer);
    procedure quadrat2(x1,y1,l,ordnung:integer);
    procedure quadrat3(x1,y1,l,ordnung2:integer);
    procedure pv(r,th: real);
    procedure fraktaleLinie(ordnung: integer; l, th:real);
    procedure quadrat4(x1,y1,l,ordnung3:integer);

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
procedure Tform1.quadrat(x1,y1,l,ordnung1:integer);
begin
  if ordnung1 = 0 then Image1.Canvas.Rectangle(x1,y1,x1+l,y1+l)
  else
  begin
    quadrat(x1,y1,l div 2, ordnung1-1);
     quadrat(x1+l div 2,y1,l div 2, ordnung1-1);
      quadrat(x1,y1+l div 2 ,l div 2,ordnung1-1);
       quadrat(x1+l div 2, y1+l div 2, l div 2, ordnung1-1);


      end;

  end;
 procedure TForm1.quadrat2(x1,y1,l,ordnung:integer);
        begin
  if ordnung = 0 then Image1.Canvas.Rectangle(x1,y1,x1+l,y1+l)
  else if ordnung=1 then
  begin
    quadrat2(x1,y1,l div 2, ordnung-1);
     quadrat2(x1+l div 2,y1,l div 2, ordnung-1);
      quadrat2(x1,y1+l div 2 ,l div 2,ordnung-1);
       quadrat2(x1+l div 2, y1+l div 2, l div 2, ordnung-1);
       end
       else begin
         quadrat2(x1,y1,l div 2,0) ;
         quadrat2(x1+l div 2,y1,l div 2, ordnung-1);
         quadrat2(x1,y1+l div 2 ,l div 2,ordnung-1);
         quadrat2(x1+l div 2, y1+l div 2, l div 20);
      end;
      end;

       procedure TForm1.quadrat3(x1,y1,l,ordnung2:integer);
         begin
  if ordnung2 = 0 then Image1.Canvas.Rectangle(x1,y1,x1+l,y1+l)
  else if  odd(ordnung2)           then
  begin quadrat3(x1,y1,l div 2, ordnung2-1) ;
         quadrat3(x1+l div 2,y1,l div 20);
         quadrat3(x1,y1+l div 2 ,l div 2,0);
         quadrat3(x1+l div 2, y1+l div 2, l div 2,ordnung2-1);

       end
       else begin
   quadrat3(x1,y1,l div 20);
     quadrat3(x1+l div 2,y1,l div 2, ordnung2-1);
      quadrat3(x1,y1+l div 2 ,l div 2,ordnung2-1);
       quadrat3(x1+l div 2, y1+l div 2, l div 20);
      end;
      end;

   procedure Tform1.pv(r,th: real); {polarvektor}
  var rad: real;
begin
  rad := th*pi/180;
  with Image1.Canvas do
    lineTo(round(penpos.x + r*cos(rad)),
           round(penpos.y + r*sin(rad)));
end;

procedure TForm1.fraktaleLinie(ordnung: integer; l, th:real);
begin
  if ordnung = 0 then pv(l,th) else Begin
    fraktaleLinie(ordnung - 1, l,th);
    end;
    end;

procedure TForm1.quadrat4(x1,y1,l,ordnung3:integer);
var l1,l2:integer;
begin
 if ordnung3=0 then Image1.Canvas.Rectangle(x1,y1,x1+l,y1+l)
  else if odd(ordnung3) then
         begin
            quadrat4(x1,y1,l div 2, ordnung3-1) ;
            quadrat4(x1+l div 2,y1,l div 20);
            quadrat4(x1,y1+l div 2 ,l div 2,0);
            quadrat4(x1+l div 2, y1+l div 2, l div 2,ordnung3-1)
      

            end;
            end;

{$R *.dfm}

procedure TForm1.FigurLoeschenClick(Sender: TObject);
begin
Image1.canvas.Brush.Color:=clwhite;
Image1.Canvas.Rectangle(-1,-1,image1.Width+1,image1.Height+1);
end;

procedure TForm1.AbbrechenClick(Sender: TObject);
begin
close;
end;

procedure TForm1.Figur1Click(Sender: TObject);
  VAR x,y,o:INTEGER;
  BEGIN
   Image1.Canvas.Rectangle(-1,-1,Image1.Width+1,image1.Height+1);
   Image1.Canvas.brush.Color:=clwhite;
   o:=Strtoint(Eingabe.text);
   x:=image1.Width; y:=image1.Height;
   IF image1.Height>Image1.Width THEN
            y:=image1.Width ELSE x:=image1.Height;
            image1.canvas.rectangle(0,0,0+x,0+x);
    quadrat(0,0,x,o);

end;

procedure TForm1.Figur2Click(Sender: TObject);
 VAR x,y,o:INTEGER;
  BEGIN
   Image1.Canvas.Rectangle(-1,-1,Image1.Width+1,image1.Height+1);
   Image1.Canvas.brush.Color:=clwhite;
   o:=Strtoint(Eingabe.text);
   x:=image1.Width; y:=image1.Height;
   IF image1.Height>Image1.Width THEN
            y:=image1.Width ELSE x:=image1.Height;
            image1.canvas.rectangle(0,0,0+x,0+x);
    quadrat2(0,0,x,o);

end;


procedure TForm1.Figur4Click(Sender: TObject);
         VAR x,y,o,ordnung,l,l1,l2:INTEGER;
                 r:boolean;
  BEGIN
   Image1.Canvas.Rectangle(-1,-1,Image1.Width+1,image1.Height+1);
   Image1.Canvas.brush.Color:=clwhite;
   o:=Strtoint(Eingabe.text);
   x:=image1.Width; y:=image1.Height;
   IF image1.Height>Image1.Width THEN
            y:=image1.Width ELSE x:=image1.Height;
            image1.canvas.rectangle(0,0,0+x,0+x);
  
  ordnung:=4;
l:=625;
Image1.Canvas.moveTo(625150);
Image1.canvas.pen.color:=clblack;
fraktaleLinie(ordnung,L,0);
fraktaleLinie(ordnung,L,90);
fraktaleLinie(ordnung,L,180);
fraktaleLinie(ordnung,L,270);
Image1.Canvas.moveTo(625,250 );
l1:=round(sqrt(sqr(l/2)+sqr(l/2)));
fraktaleLinie(ordnung,L1,-45);
fraktaleLinie(ordnung,L1,45);
fraktaleLinie(ordnung,L1,135);
fraktaleLinie(ordnung,L1,-135);
Image1.Canvas.moveTo(625 +l div 4250 - l div 4);
l2:=round(sqrt(sqr(l1/2)+sqr(l1/2)));
fraktaleLinie(ordnung,l1,45);
Image1.Canvas.moveTo(625 +l div 4250 + l div 4);
fraktaleLinie(ordnung,l1,-45);

end;

procedure TForm1.Figur3Click(Sender: TObject);
          VAR x,y,o:INTEGER;
                 r:boolean;
  BEGIN
   Image1.Canvas.Rectangle(-1,-1,Image1.Width+1,image1.Height+1);
   Image1.Canvas.brush.Color:=clwhite;
   o:=Strtoint(Eingabe.text);
   x:=image1.Width; y:=image1.Height;
   IF image1.Height>Image1.Width THEN
            y:=image1.Width ELSE x:=image1.Height;
            image1.canvas.rectangle(0,0,0+x,0+x);
    quadrat3(0,0,x,o);
end;

end.


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Xion - Mo 28.02.11 15:41

Zu Aufg 1,2 und 3:

Das sieht doch sehr gut aus, solange die Rekursionstiefe nicht zu tief ist...dann machen sich die Rundungsfehler von div bemerkbar
Deshalb am besten 2^Rekursionstiefe als Größe nehmen, mal einen beliebigen Faktor:

Delphi-Quelltext
1:
2:
MaxRekursionstiefe:=6;
quadrat(0,0,8*round(power(2,MaxRekursionstiefe){=8*2^6},6);

(Edit: noch math oben bei den uses einbinden)

Aufg 4 könnt ihr von mir oben übernehmen.
Aufg 5 ist dazu ganz ähnlich.

Aufg 6 ist wieder einfacher. Ihr müsst dort nur in jedem Schritt Rechtecke zeichnen, nicht erst in der untersten Ebene.

Aufg 7 ist etwas schwierig...da müsste man sich mal reindenken. Die Quadrate werden jeweils in 4 Teile geteilt, während die Rechtecke entsprechend anders aufgeteilt werden.

Aufg 8 ist wieder wie 4, nur dass ihr dort nicht um 90 Grad dreht, sondern um 45. Es geht also nichtmehr mit einem Boolean wie in Aufg 4

Edit:
Was ihr also bereits habt, sieht doch gut aus. Wenn ihr Probleme habt, dann müsst ihr die genauer schildern. "Funktioniert nicht"...da kann ich keine kompetente Antwort drauf geben :D

Edit2:
Zu eurer Lösung zu 4 (mit der Fraktalen Linie) kann ich garnichts sagen...das ist mir zu kompliziert...polarvektor? :shock:
Ich glaub ihr denkt nach wie vor zu kompliziert. Ihr müsst nicht alles bei Ordnung=0 zeichnen. Ihr könnt bereits vorher zeichnen. Bsp:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.quadrat42(x,y,l,ordnung: integer);
begin
 Image1.Canvas.Rectangle(x,y,x+l,y+l);
 if ordnung>=0 then
    quadrat42(x+2,y+2,l-4,ordnung-1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
quadrat42(50,50,100,20);
end;


Informatiklady - Fr 04.03.11 13:43

Also wir haben es jetzt geschafft die Figur 4 zu programmieren jetzt bin ich dabei die nummer 5 zu programmieren nur der ansatz fehlt mir.


Xion - Fr 04.03.11 15:27

Ok, als Ansatz würd ich da so vorgehen:


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:
30:
31:
Procedure Quadrat5_1( X,Y: integer; Width: integer; rekursionstiefe: integer);
begin
 // 1. Teilen der Breite und der Höhe durch 2
 Width:=Width div 2;
 // 2. Für jedes entstehende Quadrat eine Raute reinmalen
 RauteZeichnen(X,Y,Width); //oben links
 RauteZeichnen(X+Width,Y,Width);  //oben rechts
 RauteZeichnen(X+Width,Y+Width,Width); //unten rechts
 RauteZeichnen(X,Y+Width,Width); //unten links

 //< an dieser Stelle haben wir Bild 1

 //3. Rekursion starten. Also 4x Proc2 aufrufen (für jedes Quadrat einmal)
 Quadrat5_2(X,Y,Width,rekursionstiefe-1);
 Quadrat5_2(X+Width,Y,Width,rekursionstiefe-1);
 ...
end

procedure Quadrat5_2( X,Y: integer; Width: integer; rekursionstiefe: integer);
begin
  //1. Zerlegung der Raute in die 4 Quadrate
  //Quadrat1_X := X+1/8*Width;
  //Quadrat1_y := Y+3/8*Width;
  //Quadrat1_Size := 2/8*Width; 
  Image1.Canvas.Rectangle( X+1/8*Width,Y+3/8*Width,2/8*Width ,2/8*Width );
  [...]

  //2. Für jedes Quadrat Proc1 aufrufen
  Quadrat5_1( X+1/8*Width,Y+3/8*Width,2/8*Width ,2/8*Width, rekursionstiefe-1 );
  [...]
end;


Im Anhang eine Illustration für die Werte in procedure Quadrat5_2


Informatiklady - Fr 18.03.11 13:33

Hallöchen !!
Kann das vllt sein , dass du da statt der Figur 4 die 5 gemacht hast .... hab mir das mal angeschaut ... sieht mit den 8teln und der raute eher nach 4 aus !!
lg


Informatiklady - Fr 18.03.11 13:34

oh mist ich meinte statt der fig. 5 die fig 4.... habs leider vertauscht


Xion - Fr 18.03.11 17:28

Ne, das war schon zur Figur 5. Sie ist der Figur 4 ja relativ ähnlich.