Home > Programming > Fractals > Mist Clouds |
const
escape=4.0;
{ escape value }
attract=0.0001;
{
attractor sensitivity }
const
Black = 0;
Blue = 1;
Green = 2;
Cyan = 3;
Red = 4;
Magenta = 5;
Brown = 6;
LightGray = 7;
DarkGray = 8;
LightBlue = 9;
LightGreen =10;
LightCyan =11;
LightRed =12;
LightMagenta =13;
Yellow =14;
White =15;
function GetRGBColor(color:byte):longint;
begin
case Color of
black : GetRGBColor := RGB(0,0,0);
blue : GetRGBColor := RGB(0,0,128);
green : GetRGBColor := RGB(0,128,0);
cyan : GetRGBColor := RGB(0,255,255);
red : GetRGBColor := RGB(128,0,0);
magenta : GetRGBColor := RGB(128,0,128);
brown : GetRGBColor := RGB(128,128,0);
lightgray : GetRGBColor := RGB(192,192,192);
darkgray : GetRGBColor := RGB(128,128,128);
lightBlue : GetRGBColor := RGB(0,0,255);
lightGreen : GetRGBColor := RGB(0,255,0);
lightcyan : GetRGBColor := RGB(0,255,255);
lightRed : GetRGBColor := RGB(255,0,0);
lightmagenta : GetRGBColor := RGB(255,0,255);
yellow: GetRGBColor := RGB(255,255,0);
white : GetRGBColor := RGB(255,255,255);
else
GetRGBColor := RGB(0,0,255);
end;
end;
////////////////////////////////////////////////////////////////////////////////
procedure MistClouds(ABitmap: TBitmap);
{generates mist/clouds}
var
x, y : double;
{ pixel coordinates }
i : integer;
{ loop counters}
k : integer;
{ row selector }
MaxX,
MaxY : integer; { Maximum X screen coordinate}
Rect : TRect;
d : array[1..8,1..6] of double; { holds data of IFS attractor }
Iterations: integer;
xValue,
yValue : integer;
multiplier : double;
color : TColorRef;
begin
SetRect(Rect, 0, 0,
ABitmap.Width, ABitmap.Height);
with Rect do
begin
MaxX := right - left;
MaxY := bottom - top; {
find maximum Y coordinate }
if (MaxX=0) or (MaxY=0) then exit;
color := GetRGBColor(LightGray);
Multiplier := 2/3;
{ initialize IFS data array }
d[1,1]:=0.33; d[1,2]:=1; d[1,3]:=0; d[1,4]:=0.33; d[1,5]:=0; d[1,6]:=0;
d[2,1]:=0.33; d[2,2]:=1; d[2,3]:=0; d[2,4]:=0.33; d[2,5]:=MaxY;
d[2,6]:=0;
d[3,1]:=0.33; d[3,2]:=1; d[3,3]:=0; d[3,4]:=0.33; d[3,5]:=1; d[3,6]:=MaxY;
d[4,1]:=0.33; d[4,2]:=1; d[4,3]:=0; d[4,4]:=0.33; d[4,5]:=MaxY;
d[4,6]:=MaxY;
d[5,1]:=0.33; d[5,2]:=0; d[5,3]:=0; d[5,4]:=0.33; d[5,5]:=MaxY
div 2; d[5,6]:=1;
d[6,1]:=0.33; d[6,2]:=0; d[6,3]:=0; d[6,4]:=0.33; d[6,5]:=MaxY;
d[6,6]:=MaxY div 2;
d[7,1]:=0.33; d[7,2]:=0; d[7,3]:=0; d[7,4]:=0.33; d[7,5]:=1; d[7,6]:=MaxY
div 2;
d[8,1]:=0.33; d[8,2]:=0; d[8,3]:=0; d[8,4]:=0.33; d[8,5]:=MaxY
div 2; d[8,6]:=MaxY;
x := 1;
{set starting coordinates}
y := MaxY div 10;
Iterations := MaxY * 150;
for i := 1 to iterations do
begin
k := random(8) + 1;
{ pick random column }
x := d[k,1]*x +
d[k,2]*y + d[k,5]; { transform coordinates }
y := d[k,3]*x +
d[k,4]*y + d[k,6];
xValue := round(x*multiplier);
yValue := round(y*multiplier);
ABitmap.Canvas.Pixels[xValue + Left,yValue + top] := Color;
end;
end;
end;
////////////////////////////////////////////////////////////////////////////////
� 2004 Jim Valavanis