Der Pythagoras-Baum wird gebildet durch rekursive Fortsetzung der Gleichung a²+b²=c² und deren grafische Darstellung mit einem Computerprogramm. Ausgehend von c² als Baumstamm verzweigen sich die Äste jeweils nach a² und b². Jeder dieser beiden Zweige wird dann im nächsten Durchlauf zu c².
Quellcode (FreeBASIC):
'--------------------------------------------' ' PYTHAGORAS-BAUM ' ' (c) 2020 F. Lehr ' ' written for FreeBASIC-Compiler 1.05.0 ' '--------------------------------------------' Const PI As Double = 3.1415926535897932 type tTeil dim as single x1=0,y1=0,_ x2=0,y2=1,_ x3=1,y3=1,_ x4=1,y4=0,_ rx=0,ry=1,_ mx=0.5,my=1,_ a=30,_ self_angle=0,_ xo=0,yo=0,_ scale=1 end type dim shared zoom as single = 2 dim shared xoffs as single = 1024/2 -100 dim shared yoffs as single = 768/2 +20 declare function GetX1(t as tTeil) as single declare function GetY1(t as tTeil) as single declare function GetX2(t as tTeil) as single declare function GetY2(t as tTeil) as single declare function GetX3(t as tTeil) as single declare function GetY3(t as tTeil) as single declare function GetX4(t as tTeil) as single declare function GetY4(t as tTeil) as single declare function GetRPX(t as tTeil) as single declare function GetRPY(t as tTeil) as single Function RotatePoint(ByRef x As single, ByRef y As single, ByVal w As single) As Integer w = w * PI / 180.0 Dim As single x2,y2 x2 = x*Cos(w) - y*Sin(w) y2 = x*Sin(w) + y*Cos(w) x=x2 y=y2 return 0 End Function function GetDistance(x1 as single, y1 as single, _ x2 as single, y2 as single) as single dim as single r r = sqr((x2-x1)^2 + (y2-y1)^2) return r end function sub ZeichneTeil(t as tTeil) Line (GetX1(t)*zoom+xoffs,-GetY1(t)*zoom+yoffs)-_ (GetX2(t)*zoom+xoffs,-GetY2(t)*zoom+yoffs),15 Line (GetX2(t)*zoom+xoffs,-GetY2(t)*zoom+yoffs)-_ (GetX3(t)*zoom+xoffs,-GetY3(t)*zoom+yoffs),15 Line (GetX3(t)*zoom+xoffs,-GetY3(t)*zoom+yoffs)-_ (GetX4(t)*zoom+xoffs,-GetY4(t)*zoom+yoffs),15 Line (GetX4(t)*zoom+xoffs,-GetY4(t)*zoom+yoffs)-_ (GetX1(t)*zoom+xoffs,-GetY1(t)*zoom+yoffs),15 end sub sub SetTeilRotation(ByRef t as tTeil, w as single) t.self_angle = w end sub sub SetRPWinkel(ByRef t as tTeil, w as single) t.a = w end sub sub SetTeilVerschiebung(ByRef t as tTeil, x as single, y as single) t.xo=x t.yo=y end sub sub SetTeilSkalierung(ByRef t as tTeil, s as single) t.scale=s end sub function GetX1(t as tTeil) as single dim as single x=t.x1,y=t.y1 RotatePoint(x,y,t.self_angle) x=x*t.scale+t.xo y=y*t.scale+t.yo return x end function function GetY1(t as tTeil) as single dim as single x=t.x1,y=t.y1 RotatePoint(x,y,t.self_angle) x=x*t.scale+t.xo y=y*t.scale+t.yo return y end function function GetX2(t as tTeil) as single dim as single x=t.x2,y=t.y2 RotatePoint(x,y,t.self_angle) x=x*t.scale+t.xo y=y*t.scale+t.yo return x end function function GetY2(t as tTeil) as single dim as single x=t.x2,y=t.y2 RotatePoint(x,y,t.self_angle) x=x*t.scale+t.xo y=y*t.scale+t.yo return y end function function GetX3(t as tTeil) as single dim as single x=t.x3,y=t.y3 RotatePoint(x,y,t.self_angle) x=x*t.scale+t.xo y=y*t.scale+t.yo return x end function function GetY3(t as tTeil) as single dim as single x=t.x3,y=t.y3 RotatePoint(x,y,t.self_angle) x=x*t.scale+t.xo y=y*t.scale+t.yo return y end function function GetX4(t as tTeil) as single dim as single x=t.x4,y=t.y4 RotatePoint(x,y,t.self_angle) x=x*t.scale+t.xo y=y*t.scale+t.yo return x end function function GetY4(t as tTeil) as single dim as single x=t.x4,y=t.y4 RotatePoint(x,y,t.self_angle) x=x*t.scale+t.xo y=y*t.scale+t.yo return y end function function GetRPX(t as tTeil) as single dim as single x=0.5,y=0 RotatePoint(x,y,180-t.a) x=x+0.5 y=y+1 RotatePoint(x,y,t.self_angle) x=x*t.scale+t.xo y=y*t.scale+t.yo return x end function function GetRPY(t as tTeil) as single dim as single x=0.5,y=0 RotatePoint(x,y,180-t.a) x=x+0.5 y=y+1 RotatePoint(x,y,t.self_angle) x=x*t.scale+t.xo y=y*t.scale+t.yo return y end function function GetAngleA(t as tTeil) as single return (180-t.a)/2 end function function GetAngleB(t as tTeil) as single return (180-90)-GetAngleA(t) end function function GetDistanceA(t as tTeil) as single return GetDistance(GetX2(t),GetY2(t),GetRPX(t),GetRPY(t)) end function function GetDistanceB(t as tTeil) as single return GetDistance(GetX3(t),GetY3(t),GetRPX(t),GetRPY(t)) end function sub ZeichneBaum(t as tTeil, _ wrot as single, _ winkel as single, _ skalierung as single, _ x as single, y as single, _ depth as integer) if depth<1 or skalierung<1 then exit sub end if SetRPWinkel(t,winkel) SetTeilRotation(t,wrot) SetTeilSkalierung(t,skalierung) SetTeilVerschiebung(t,x,y) ZeichneTeil(t) dim as tTeil t2, t3 ZeichneBaum(t2, wrot+GetAngleA(t), winkel, GetDistanceA(t), _ GetX2(t), GetY2(t), depth-1) ZeichneBaum(t2, wrot-GetAngleB(t), winkel, GetDistanceB(t), _ GetRPX(t), GetRPY(t), depth-1) end sub 'Hauptprogramm screen 20 dim t as tTeil ZeichneBaum(t, 0, 45, 60, -100, -100, 50) sleep '------------------ PROGRAMMENDE ---------------------