Code: Select all
w,h = #.scrsize()
sfx = -2.5; sfy = -2*h/w; sfs = 4
#.aaoff()
:again
end,redo,update = 0
-> draw() 'рисуем фрактал в другом потоке
>
  moved = 0
  > #.pan() 'мультитачевая навигация
    moved = 1
    x,y,s = #.pan(3)
    x -= (s-1)/2*w
    y -= (s-1)/2*h
    #.drawoff(x,y,s)
  <
  ? moved 'перерисуем фрактал заново
    sfs /= s
    sfx -= x*sfs/w
    sfy -= y*sfs/w
    again -> end
    redo = 1
  .
  ? update & !redo 'отобразим фрактал
    update = 0
    #.drawoff(0,0)
  .
  wn,hn = #.scrsize()
  ? wn!=w | hn!=h 'изменение размера экрана
    w = wn; h = hn
    again -> end
    redo = 1
  .
<
draw()=
  :loop
  #.offon() 'рисуем в закадровый буфер
  #.scrclear(0,0,0)
  .redo = 0
  sfx = .sfx; sfy = .sfy; fs = .sfs/.w
  > y, 1...h
    > x, 1...w
      fx = sfx + x*fs
      fy = sfy + y*fs
      #.drawpoint(x,y,color(fx,fy):3)
    <
    loop -> .redo
    .update = 1
  <
  .end = 1
.
color(x,y)=
  zr = x; zi = y; n = 0
  maxn = #.int(200*(1-#.log10(.sfs/4)))
  > zr*zr+zi*zi<4 & n<maxn
    zrn = zr*zr-zi*zi+x; zin = 2*zr*zi+y
    zr = zrn; zi = zin; n += 1
  <
  ? n=maxn; <= 0,0,0; .
  <= #.hsv2rgb(n/maxn*360,1,1):3
.
