program mandelbrot;
{$mode objfpc}{$H+}
uses SDL2;
//{$IFDEF UNIX}{$IFDEF UseCThreads}
//cthreads,
//{$ENDIF}{$ENDIF}
//Classes
//{ you can add units after this };
var
//window:SDL_Window@
// Renderer:SDL_Renderer@;
// Event:SDL_Event@;
WIDTH:integer = 1000;
HEIGHT:integer = 1000;
min_num:currency = -2.84;
max_num:currency = 1.0;
factor:currency = 1;
MAX_ITERATIONS:integer = 200;
x, y, i, n:integer;
a,b,ai,bi,a1,b1:currency;
counter, bright,red,green,blue:integer;
window: PSDL_Window;
Renderer: PSDL_Renderer;
function map( value, in_min, in_max, out_min, out_max:currency):currency;
begin
map:= (value - in_min) * (out_max - out_min) / (in_max - out_max) + out_min;
end;
procedure main;
begin
//var
//
SDL_Init(SDL_INIT_EVERYTHING);
// full set up
Window := SDL_CreateWindow('Window', 50, 50, 500, 500, SDL_WINDOW_SHOWN);
if Window = nil then Halt;
Renderer := SDL_CreateRenderer(Window, -1, 0);
if Renderer = nil then Halt;
if SDL_CreateWindowAndRenderer(1920, 1080, SDL_WINDOW_RESIZABLE, @Window, @Renderer) <> 0
then Halt;
SDL_RenderSetLogicalSize(Renderer, WIDTH, HEIGHT);
counter := 0;
while True do
max_num -= 0.1 * factor;
min_num += 0.15 * factor;
factor *= 0.9349;
MAX_ITERATIONS += 5;
SDL_RenderPresent(Renderer);
for x:= 0 to WIDTH do
for y := 0 to WIDTH do
a := map(x, 0, WIDTH, min_num, max_num);
b := map(y, 0, WIDTH, min_num, max_num);
ai := a;
bi := b;
n := 0;
for i := 0 to MAX_ITERATIONS do
begin
a1 := a * a - b * b;
b1 := 2 * a * b;
a := a1 + ai;
b := b1 + bi;
if ((a + b) > 2) then
begin
break;
end;
n := n +1;
bright := Trunc(map(n, 0, MAX_ITERATIONS, 0, 255));
if ((n = MAX_ITERATIONS)) then
begin
bright := 0;
end;
red := Trunc(map(bright * bright, 0, 6502, 0, 255));
green := bright;
blue := Trunc(map(sqrt(bright), 0, sqrt(255), 0, 255));
SDL_SetRenderDrawColor(Renderer, red, green, blue, 255);
SDL_RenderDrawPoint(Renderer, x, y);
end;
end;
end;
begin
main;
end.