Program Plazma;
(* Copyright (c) 9.V.1999 by Omega Red - freeware *)
uses vesa, bitmaps;
const
maxcol = 255;
n = 9;
ms = 2*n;
hurst = 0.7; { 0 - 1 ! }
var
p2 : array [0..15] of word;
i, st, c, p : byte;
max, step, init,
x, y, dist, pix : word;
scale : real;
Function rnd : real; {prawie rozklad Gaussa (normalny)}
Begin
rnd:=random + random + random + random + random + random - 3;
End;
Function RndPix : byte;
Begin
RndPix:=round(maxcol*random);
{ rndpix:=0;}
End;
Function FixPix : word;
Begin
FixPix:=round(maxcol*rnd*scale);
{ fixpix:=0;}
End;
Procedure InitPalette;
var col, r, g, b : byte;
f : text;
Begin
assign(f, 'rainbow.pal');
reset(f);
for col:=0 to maxcol do begin
read(f, r, g, b);
setrgb(col, r, g, b);
end;
close(f);
End;
Procedure ClearScreen;
var x, y : word;
Begin
for x:=0 to xmax do
for y:=0 to ymax do
setpix(x, y, 0);
End;
BEGIN
randomize;
p2[0]:=1;
for i:=1 to 15 do p2[i]:=2*p2[i-1];
max:=p2[n];
setmode($103);
initpalette;
{ repeat}
{ scale:=random;
hurst:=random;}
scale:=sqrt(1-exp((2*hurst-2)*ln(2)));
setpix(0, 0, rndpix);
setpix(0, max, rndpix);
setpix(max, 0, rndpix);
setpix(max, max, rndpix);
p:=round((getpix(0,0)+getpix(0,max)+
getpix(max,0)+getpix(max,max))/4+fixpix);
setpix(max div 2,max div 2, p);
for st:=2 to ms do begin
step:=max div p2[(st-1) div 2];
init:=max div p2[(st+1) div 2];
if odd(st) then begin
x:=init;
while x < ymax do begin
y:=init;
while y < ymax do begin
dist:=init;
pix:=0;
c:=0;
p:=getpix(x-dist, y-dist);
if p <> 0 then begin
inc(pix, p);
inc(c);
end;
p:=getpix(x-dist, y+dist);
if p <> 0 then begin
inc(pix, p);
inc(c);
end;
p:=getpix(x+dist, y-dist);
if p <> 0 then begin
inc(pix, p);
inc(c);
end;
p:=getpix(x+dist, y+dist);
if p <> 0 then begin
inc(pix, p);
inc(c);
end;
if c <> 0 then pix:=round(pix/c + fixpix);
setpix(x, y, pix);
inc(y, step div 2);
end;
inc(x, step div 2);
end;
end
else begin
x:=0;
while x <= ymax do begin
y:=0;
while y <= ymax do begin
if (abs(x-y) mod step > 0) then begin
dist:=max div p2[st div 2];
pix:=0;
c:=0;
p:=getpix(x, y-dist);
if p <> 0 then begin
inc(pix, p);
inc(c);
end;
p:=getpix(x, y+dist);
if p <> 0 then begin
inc(pix, p);
inc(c);
end;
p:=getpix(x+dist, y);
if p <> 0 then begin
inc(pix, p);
inc(c);
end;
p:=getpix(x-dist, y);
if p <> 0 then begin
inc(pix, p);
inc(c);
end;
if c <> 0 then pix:=round(pix/c + fixpix);
setpix(x, y, pix);
end;
inc(y, step div 2);
end;
inc(x, step div 2);
end;
end;
scale:=scale/sqrt(exp(hurst*ln(2)));
{ readln;}
end;
readln;
screenshot(max, max, 8, 'plazma.bmp');
clearscreen;
{ until false;}
END.