Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi problem mit sierpinski- Dreieck (https://www.delphipraxis.net/15040-problem-mit-sierpinski-dreieck.html)

Gregor00 20. Jan 2004 21:39


problem mit sierpinski- Dreieck
 
hallo erstmal zusammen

also ich habe folgendes problem: ich möchte das sierpinski dreieck mit hilfe der rekursion programmieren.So wie ich es versucht habe funktioniert es allerdings nicht ich kann aber einfach nicht den fehler finden. ich hoffe ihr könnt mir weiterhelfen

Hier ist mein quelltext:


Delphi-Quellcode:
procedure sierpinski (ordnung : Integer; laenge, winkel:Real; a: integer)
var x,y: real;

begin
x := x+laenge*cos(winkel);
y := y-laenge*sin(winkel);
//Form1.PaintBox1.Canvas.LineTo (Round(x),Round(y));

sierpinski (ordnung-1, laenge / 2, winkel,a);
winkel := winkel + 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,a);
winkel := winkel - 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,a);
winkel := winkel - 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,a);
winkel := winkel + 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,a);
Inc(a);
Form1.paintbox1.Canvas.LineTo(Round(x),Round(y));
If a < (StrToInt(Form1.Combobox1.Text)) then
  sierpinski (ordnung, laenge, winkel,a)
  else
  exit;
end;
//end;


procedure TForm1.Button1Click(Sender: TObject);

var ordnung : Integer;
x, y, laenge, winkel : Real;
a: Integer;

begin
x := 100;
y := 380;
a:= 0;
refresh;
laenge :=400;
winkel :=0;
ordnung := (StrToInt(ComboBox1.Text));
PaintBox1.Canvas.MoveTo (Round(x), Round(y));
sierpinski (ordnung, laenge, winkel,a);
end;
Erklärung:
procedure siepinski... ist die rekursive Procedure, welche über den Button1 (nach Anglicken) aufgerufen wird. Die stufe des dreieckes (bzw. wie oft die rekursion wiederhohlt werden soll) wird in ComboBox1.Text angegeben.
problem: jedesmal kommt die nur zu bekannte fehlermeldung "Stack- überlauf" d.h. Irgendetwas muss mit der Abbruchbedingung nicht stimmen. ich weiß aber nicht was...

also vielen Dank schon mal für alle Antworten
cu gregor

Gregor00 21. Jan 2004 15:31

Re: problem mit sierpinski- Dreieck
 
hat denn hier niemand eine Idee?? ich komme so echt nicht weiter...
was ein sierpinski- dreieck ist ist warscheinlich allen klar, ich bin bestimmt nicht der erste, der soetwas in Informatik programmieren muss...

also bin für alle Kommentare/Hilfen dankbar...

Seniman 21. Jan 2004 21:52

Re: problem mit sierpinski- Dreieck
 
Hallo Gregor00,

letztenendes hast du garkeine Abbruchbedingung in deiner Prozedur drin. Denn nämlich gleich zu Beginn wird ohne weitere Abfrage gleich viermal die Prozedur selbst aufgerufen.
Mein Rat:
Lass die Variable "a" weg, dazu hast du ja die Variable "Ordnung". Setz vor die vier Aufrufe die Abfrage
Delphi-Quellcode:
if Ordnung>0 then //usw
Den unteren If-Abfrage-Block kannst du ganz weglassen.

Grüße
Seniman

Gregor00 22. Jan 2004 13:22

Re: problem mit sierpinski- Dreieck
 
Hallo Seniman
danke für den Tipp!! hat wirklich funktioniert, jetzt wo ich die Lösung kenne erscheint es mir auch relativ naheliegend, weiß auch nicht warum ich nicht selber darauf gekommen bin...trotzdem nochmal thx...
so richtig funktionieren tut es aber trotzdem noch nicht, das ergebnis sieht noch nicht wirklich wie ein sierpinski- dreieck aus, ist alles irgentwie verzerrt und verschoben...
Vielleicht kann sich jemand noch mal meine Zeichnenanweisungen betrachten:

Code:
sierpinski (ordnung-1, laenge / 2, winkel,x,y);
winkel := winkel + 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,x,y);
winkel := winkel - 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,x,y);
winkel := winkel - 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,x,y);
winkel := winkel + 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,x,y);
hier irgentwo muss noch ein fehler liegen..

cu gregor

Phoenix 22. Jan 2004 13:40

Re: problem mit sierpinski- Dreieck
 
Ich bin zwar kein Mod, aber dennoch: Neue Frage -> Neuer Thread.

Hilft Dir sicher auch mehr, weil oben steht was von Rekursion, und da lesen dann schon einige nicht mehr weiter, obwohls jetzt ja ums Zeichnen geht... ;-)

Phoenix 22. Jan 2004 14:18

Re: problem mit sierpinski- Dreieck
 
Hier trotzdem kurz eine inline - Lösung für das Dreieck... :)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   ordnung: integer;
   x, y, laenge, winkel : Real;

   procedure sierpinsky(ordnung: integer; laenge: real; winkel: real);
   begin
      if ordnung = 0 then
      begin
         x := x + laenge * cos(winkel);
         y := y - laenge * sin(winkel);
         PaintBox1.Canvas.LineTo(Round(x), Round(y));
      end   else
      begin
         sierpinsky(ordnung-1, laenge / 2, winkel);
         winkel := winkel + 2 * pi / 3;
         sierpinsky(ordnung-1, laenge / 2, winkel);
         winkel := winkel - 2 * pi / 3;
         sierpinsky(ordnung-1, laenge / 2, winkel);
         winkel := winkel - 2 * pi / 3;
         sierpinsky(ordnung-1, laenge / 2, winkel);
         winkel := winkel + 2 * pi / 3;
         sierpinsky(ordnung-1, laenge / 2, winkel);
      end;
   end;

begin
   refresh;
   laenge := 400;
   winkel := 0;
   ordnung := StrToInt(Combobox1.Text);
   x := 100;
   y := 380;
   PaintBox1.Canvas.MoveTo (Round(x), Round(y));
   sierpinsky(ordnung, laenge, winkel);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz