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



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