var FixedRadius: double = 1.0;
var MinRadius: double = 0.5;
var Scale: double = -1.7;
var Escape: integer = 16;
function MandelBox3D(V: TGridPoint): double;
{Test to see if point is inside or outside Mandel Box Set}
{Returns 1 if inside set, 0 if outside}
var Point,C: T3DVector;
var Iter: integer;
var Len: double;
var RadiusRatio: double;
procedure BoxFold(var Pnt: T3DVector);
begin
if Pnt.X > 1 then Pnt.X := 2 - Pnt.X
else if Pnt.X < -1 then Pnt.X := -2 - Pnt.X;
if Pnt.Y > 1 then Pnt.Y := 2 - Pnt.Y
else if Pnt.Y < -1 then Pnt.Y := -2 - Pnt.Y;
if Pnt.Z > 1 then Pnt.Z := 2 - Pnt.Z
else if Pnt.Z < -1 then Pnt.Z := -2 - Pnt.Z;
end;
procedure BallFold(var Pnt: T3DVector);
var Radius,RF: double;
begin
Radius := sqrt(Sqr(Pnt.X) + Sqr(Pnt.Y) + Sqr(Pnt.Z));
if Radius < MinRadius then
begin
Pnt.X := Pnt.X * RadiusRatio;
Pnt.Y := Pnt.Y * RadiusRatio;
Pnt.Z := Pnt.Z * RadiusRatio;
end
else if Radius < FixedRadius then
begin
RF := Sqr(FixedRadius) / Sqr(Radius);
Pnt.X := Pnt.X * RF;
Pnt.Y := Pnt.Y * RF;
Pnt.Z := Pnt.Z * RF;
end
end;
begin
C:=V.P;
RadiusRatio := sqr(FixedRadius) / sqr(MinRadius);
Point:=MakeVector3D(0,0,0);
Result:=1;
for Iter:=0 to Iterations-1 do
begin
BoxFold(Point);
BallFold(Point);
Point.X := Point.X * Scale;
Point.Y := Point.Y * Scale;
Point.Z := Point.Z * Scale;
Point.X := Point.X + C.X;
Point.Y := Point.Y + C.Y;
Point.Z := Point.Z + C.Z;
Len := sqrt(sqr(Point.X) + sqr(Point.Y) + sqr(Point.Z));
if Len > Escape then exit;
end;
Result:=0;
end;
|