Hat jemand den Algo schon umgesetzt?
http://www-lehre.informatik.uni-osnabrueck.de/~cg/2000/skrip…000000000000000
Pythagoras- Baum
-
-
-
Ich hab mal versucht, diesen E-Code zu übersetzen, aber ich bin wohl aus der Übung. AmigaE ist auch schon was her :
http://www.osnews.com/story/169Der XProfan-Code macht aber nicht, was er soll...
Code
Alles anzeigenDeclare LongInt width, height Declare Float cx, cy, dx, dy, ex, ey, c Proc PythTree Parameters Float ax, ay, bx, by, Int depth cx = ax - ay + by cy = ax + ay - bx dx = bx + by - ay dy = ax - bx + by ex = 0.5 * (cx - cy + dx + dy) ey = 0.5 * (cx + cy - dx + dy) c = (-1) - depth * $100020 UsePen 0, 1, Rgb(c, c, c) Line cx, cy - ax, ay Line ax, ay - bx, by Line bx, by - dx, dy Line dx, dy - cx, cy Line cx, cy - ex, ey Line ex, ey - dx, dy If depth < 12 PythTree (cx, cy, ex, ey, depth + 1) PythTree (ex, ey, dx, dy, depth + 1) EndIf EndProc width = 640 height = 480 WindowTitle "Pythagora's-Baum" Window width, height PythTree ((width/2 - width/12), (height-20), (width/2 + width/12), (height-20), 0) WaitInput
-
Vermutlich soll hier Rekursion demonstriert werden. Hab da was haldentaugliches gefunden, das auf relativen Koordinaten (Turtle-Graphics) beruht. Dazu waren nur 3 kleine Hilfs-Procs nötig. XProfan ist eben unschlagbar
Code
Alles anzeigenWindowtitle "Pythagoras-Baum (wohl eher Brokkoli ;-)":Window 0,0-%maxx,%maxy 'Q: http://www.pohlig.de/Unterricht/Inf2003/Tag18/14.5_Pythagorasbaum.htm '...übertragen nach XProfan11.2a 2014-01 by P.Specht. Keine Gewähr - Für garnix! declare xr!,yr!,wr! xr!=width(%hwnd)*0.5 : yr!=height(%hwnd)*0.8 : wr!=-pi()/2 moveto xr!,yr! ZeichnePythagorasBaum(120) Print "." : waitinput : end proc ZeichnePythagorasBaum :parameters c! Whileloop 0,3:forward(c!):right(90):endwhile if c!>1 forward(c!):left(30) zeichnePythagorasBaum(c!*0.5*sqrt(3)) right(90):forward(c!*0.5*sqrt(3)) zeichnePythagorasBaum(c!/2) ' und Rückwicklung zum Ursprung: forward(-c!*0.5*sqrt(3)) : left(60) : forward(-c!) endif endproc proc forward : parameters c!:xr!=xr!+c!*cos(wr!):yr!=yr!+c!*sin(wr!):lineto xr!,yr! endproc proc left : parameters w! :wr!=wr!+w!*pi()/180 endproc proc right :parameters w!:wr!=wr!-w!*pi()/180 endproc
-
Übrigens tut's Franks Code ohnehin sehr gut, zumindest nach kleiner Umstellung auf Profan11.2a
Code
Alles anzeigenWindowtitle "Tree of Pythagoras -- based on old E example by Raymond Hoving" var width& = 640:var height&=480:Window width&,height& pythtree( width&/2-width&/12,height&-20 , width&/2+width&/12,height&-20, 0) waitinput:end proc pythtree :parameters ax!,ay!,bx!,by!,depth& var cx!=ax!-ay!+by!:var cy!=ax!+ay!-bx! var dx!=bx!+by!-ay!:var dy!=ax!-bx!+by! var ex!=0.5*(cx!-cy!+dx!+dy!):var ey!=0.5*(cx!+cy!-dx!+dy!) usepen 0,1,depth&*$100020 line cx!,cy! - ax!,ay! : line ax!,ay! - bx!,by! line bx!,by! - dx!,dy! : line dx!,dy! - cx!,cy! line cx!,cy! - ex!,ey! : line ex!,ey! - dx!,dy! if depth& < 12 pythtree(cx!,cy!,ex!,ey!,depth&+1) pythtree(ex!,ey!,dx!,dy!,depth&+1) endif endproc
-
Danke,das geht!
Was ist anders bei mir? -
Keine Ahnung... das 'Var' im Proc vielleicht? Rekursion ist ja eigentlich keine Stärke von XProfan ...
Gruss -
Interessante Probleme. Vielleicht ist das so nicht zulässig?
Und bei #4 wird keine doppelte Deklaration angemeckert.
Ansonsten finde ich weniger Linien besser. Nur den "Endzweig" geschlossen.Code
Alles anzeigenWindowtitle "Tree of Pythagoras -- based on old E example by Raymond Hoving" var width& = 640 var height&=480 Window width&,height& pythtree( width&/2-width&/12,height&-20 , width&/2+width&/12,height&-20, 0) waitinput end proc pythtree parameters ax!,ay!,bx!,by!,depth& var cx!=ax!-ay!+by! var cy!=ax!+ay!-bx! var dx!=bx!+by!-ay! var dy!=ax!-bx!+by! var ex!=0.5*(cx!-cy!+dx!+dy!) var ey!=0.5*(cx!+cy!-dx!+dy!) usepen 0,1,depth&*$100020 line cx!,cy! - ax!,ay! line bx!,by! - dx!,dy! if depth& < 8 pythtree(cx!,cy!,ex!,ey!,depth&+1) pythtree(ex!,ey!,dx!,dy!,depth&+1) else line cx!,cy! - ex!,ey! line ex!,ey! - dx!,dy! endif endproc
Gruß Thomas
-
Habs mal bei den Bugs gemeldet, reagiert ja offensichtlich falsch und anders, als in der Hilfe beschrieben.
-
Danke,das geht!
Was ist anders bei mir?
Bei dir sind einige Variablen (cx, etc.) global deklariert und hier sind sie lokal deklariert!Gruß
Roland -
Frank, Leerzeichen zwischen Funktionsnamen und öffnender Klammer bei den Aufrufen. Dann malt es schon mal an der richtigen Position. Das mag Profan nicht, andere Sprachen sehen das lockerer :kA: Und lokale Variablen, wie Roland schon sagte, dann klappts.
Gruß Volkmar
-
Bei dir sind einige Variablen (cx, etc.) global deklariert und hier sind sie lokal deklariert!Nö, daran alleine liegts nicht!
Danke Volkmar, das war's! Wundert mich aber, dass XProfan darüber ins Schleudern gerät...
-
Hallo Frank,
ich weiß, Dein Beitrag ist schon ein wenig älter, aber trotzdem noch eine Anmerkung:
Da XProfan erlaubt, eine Prozedur wahlweise als Funktion (mit geklammerten Parametern) oder Prozedur (Parameter ohne Klammer) aufzurufen, macht der Parser das an der Klammer direkt nach dem Prozedurnamen fest. Da Du keinen Rückgabewert erwartest, kannst Du die Parameter auch einfach ohne Klammern angeben, wie bei Befehlen.
Gruß
Roland -
Vielleicht könntst du ja noch überflüssige Leerzeichen aussortieren.
-
Das mache ich ja schon. Nur in diesem Fall kann man nicht erkennen, dass es überflüssig ist, da die Prozedur ja auch als Befehl aufgerufen werden kann und dann das Leerzeichen notwendig ist. Die folgende Klammer könnte ja auch eine Klammer eines Parameters sein und nicht die Klammer, die den oder die Funktionsparameter einklammert. Zumal es eher unwahrscheinlich ist, dass man eine Prozedur als Funktion aufruft, wenn man das Ergebnis nicht zuweist.
Gruß
Roland -
Ergänzendes Link: Der Pythagoras-Baum ist der Spezialfall einer Rham-Kurve.
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!