Палитра EGA


 Вчера  разбирался с одной программой на Борман Паскале и хотел сравнить код с оригинальным изображением. Google подкинул маленькую свинью и вывалил ссылки раз, два  Полученная картинка отличалась цветами и я плюнул на разбирательства и тупо забил значения RGB. Сегодня продолжил изыскания. Гляжу на таблицу и пытаюсь придумать правильную формулу:



Снова не получается, и опять ввел данные - снова неправильная картинка. Нашел ошибку в коде и получил правильный рисунок:



Dim q.f(500)
 Dim egacol(15)
 egacol(0)=RGB($00,$00,$00)
 egacol(1)=RGB($00,$00,$AA)
 egacol(2)=RGB($00,$AA,$00)
 egacol(3)=RGB($00,$AA,$AA)
 egacol(4)=RGB($AA,$00,$00)
 egacol(5)=RGB($AA,$00,$AA)
 egacol(6)=RGB($AA,$55,$00)
 egacol(7)=RGB($AA,$AA,$AA)
 egacol(8)=RGB($55,$55,$55)
 egacol(9)=RGB($55,$55,$FF)
 egacol(10)=RGB($55,$FF,$55)
 egacol(11)=RGB($55,$FF,$FF)
 egacol(12)=RGB($FF,$55,$55)
 egacol(13)=RGB($FF,$55,$FF)
 egacol(14)=RGB($FF,$FF,$55)
 egacol(15)=RGB($FF,$FF,$ff)

If OpenWindow(0, 0, 0, 640, 480, "Mandelbrot", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 0, 0, 640, 480)
    
     maxcol = 640
     maxrow = 480
     max_colors = 16
     max_iterations = 512
     max_size = 4
     XMax.f = 1.2
     XMin.f = -2.0
     YMax.f = 1.2
     YMin.f =-1.2
     deltaP.f= (XMax - XMin)/(maxcol)
     deltaQ.f= (YMax - Ymin)/(maxrow)

     q(0)=ymax
     If StartDrawing(CanvasOutput(0))
            For row = 1 To maxrow
              Q(row) = Q(row-1) - deltaQ
            Next row
     P.f = XMin;
     For col = 0 To maxcol
          For row = 0 To maxrow
               X.f = 0
               Y.f = 0
               Xsquare.f = 0
               Ysquare.f = 0
               color = 1;
               Repeat;               { this is the "meat" }
                     Xsquare.f = X*X;
                     Ysquare.f = Y*Y;
                     Y = 2*X*Y + Q(row)
                     X = Xsquare - Ysquare + P;
                     color+1;inc(color);
               Until (color>=max_iterations) Or (Xsquare + Ysquare >= max_size);
               ;PutPixel(col,row,(color MOD max_colors));
               ;Box(col,row,1,1,egacol(color%max_colors))
               Box(col,row,1,1,egacol(color&15))
          Next row
          P = P + deltaP;
     Next col
            StopDrawing()
          EndIf
          
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Теперь надо разобраться с палитрой, из-за которой я это затеял. Смотрю на формулу и пишу код. Нужно убрать объявление массива egacol и задание значений, вместо массива объявляется функция:

Procedure egacol(n)
  If n=6
    n=20
  EndIf
  n=n+(n&8)*6
  r.a=0
  g.a=0
  b.a=0
  If n&1
    b=b+$AA
  EndIf
  If n&2
    g=g+$AA
  EndIf
  If n&4
    r=r+$AA
  EndIf
  
  If n&8
    b=b+$55
  EndIf
  If n&16
    g=g+$55
  EndIf
  If n&32
    r=r+$55
  EndIf
  ProcedureReturn RGB(r,g,b)
EndProcedure

Хорошо бы загнать эти проверки в формулу, но пока не придумывается.

Комментарии