Занятная штука эти фракталы: читаешь, разбираешься и пытаешься нарисовать - мало когда получается. Нашелся один вариант, но не нарисовалось - перепробовал разные варианты, даже переведенный исходник на Си. Нашлось решение попроще - IFS. Даже глюкавый IFSkit не осилил такую задачку. Написал другой вариант - не рисуется. Обожаю этот эпизод разработки - когда просматриваешь каждую строчку и ищешь причину нерабочего кода. Нашлось:
If OpenWindow(0, 0, 0, 640, 480, "Golden Dragon IFS", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(0, 0, 0, 640, 480)
x.f=0
y.f=0
RandomSeed(12345)
If StartDrawing(CanvasOutput(0))
Box(0,0,640,480,0)
For i=0 To 100000
rr=Random(1)
If rr=1
a.f=0.62367
b.f=-0.40337
c.f=0.40337
d.f=0.62367
e.f=0
f.f=0
Else
a.f=-0.37633
b.f=-0.40337
c.f=0.40337
d.f=-0.37633
e.f=0.5
f.f=0
EndIf
xx.f=a*x+b*y+e
yy.f=c*x+d*y+f
sca=800
Box(320/2+xx*sca,240+yy*sca,1,1,$FFFFFF)
x=xx
y=yy
Next i
StopDrawing()
EndIf
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
CanvasGadget(0, 0, 0, 640, 480)
x.f=0
y.f=0
RandomSeed(12345)
If StartDrawing(CanvasOutput(0))
Box(0,0,640,480,0)
For i=0 To 100000
rr=Random(1)
If rr=1
a.f=0.62367
b.f=-0.40337
c.f=0.40337
d.f=0.62367
e.f=0
f.f=0
Else
a.f=-0.37633
b.f=-0.40337
c.f=0.40337
d.f=-0.37633
e.f=0.5
f.f=0
EndIf
xx.f=a*x+b*y+e
yy.f=c*x+d*y+f
sca=800
Box(320/2+xx*sca,240+yy*sca,1,1,$FFFFFF)
x=xx
y=yy
Next i
StopDrawing()
EndIf
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
Дополнение. Исправил оригинальный код
Global golden_ratio.f = (1+Sqr(5))/2
Global r1.f = Pow(1/golden_ratio,1/golden_ratio)
Global r.f=r1
Global r2.f = r1*r1
Global angle1.f = ACos((1+r1*r1-r1*r1*r1*r1)/(2*r1))
Global angle2.f = ACos((1+r1*r1*r1*r1-r1*r1)/(2*r1*r1))
Global xp.f
Global yp.f
Procedure golden_dragon(x1.f,y1.f,x2.f,y2.f,turn,n)
; If n>0-4
dist.f = Sqr( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) )
If dist<0.01
;turtle.Goto(x2,y2)
mul=550
LineXY(xp*mul+500,yp*mul+500,x2*mul+500,y2*mul+500,$FFFFFF)
xp=x2
yp=y2
ProcedureReturn
EndIf
angle.f = ATan2(x2-x1,y2-y1)
If turn
px.f = x1+dist*r1*Cos(angle+angle1)
py.f = y1+dist*r1*Sin(angle+angle1)
Else
px.f = x1+dist*r2*Cos(angle-angle2)
py.f = y1+dist*r2*Sin(angle-angle2)
EndIf
golden_dragon(x1,y1,px,py,1,n-1)
golden_dragon(px,py,x2,y2,0,n-1)
; EndIf
EndProcedure
If OpenWindow(0, 0, 0, 1000, 1000, "Golden Dragon", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(0, 0, 0, 1000, 1000)
xp=-0.5
yp=-0.2
If StartDrawing(CanvasOutput(0))
Box(0,0,GadgetWidth(0),GadgetHeight(0),0)
golden_dragon(-0.5,-0.2,0.7,-0.2,1,3)
StopDrawing()
EndIf
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf


Комментарии
Отправить комментарий