![]() |
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:
Erklärung:
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; 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 |
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... |
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:
Den unteren If-Abfrage-Block kannst du ganz weglassen.
if Ordnung>0 then //usw
Grüße Seniman |
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:
hier irgentwo muss noch ein fehler liegen..
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); cu gregor |
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... ;-) |
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 06:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz