Golden Dragon fractal

 

Занятная штука эти фракталы: читаешь, разбираешься и пытаешься нарисовать - мало когда получается. Нашелся один вариант, но не нарисовалось - перепробовал разные варианты, даже переведенный исходник на Си. Нашлось решение попроще - 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

Дополнение. Исправил оригинальный код

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


Комментарии