External angle of filled Julia set
Maxima version of quad.c program and image
First compute angle (= argument) of complex number in turns = <0;1>
ArcTan2 is a function of unit Math
Function Turns(x,y:extended):extended;
// gives argument of complex number z:=x+y*i
// turn=ArcusTangens (y/x)
// gives value in turns <0;1>
begin
if (x < > 0) or (y < >0)
then
begin
if y>0 then result := ArcTan2(y, x)/(2*Pi)
else result := 1+ArcTan2(y,x)/(2*Pi);
end
else if y = 0.0
then result := 0.0 // y=0
else if y > 0
then result := 1/4 //x=0 y>0
else result := 3/4; //x=0 y<0
end;
Then you can compute external angle of point out of M ( exterior of M-set = C\M):
external angle = Arg M(c) = Arg ( Phi M ( c) ) where Phi M it is a Boettcher map
so take a complex point c
check if it is out of M ( iterate it , if last iteration < IterationMax then c is in the complement of M-set)
compute Boettcher coordinate
compute argument of Boettcher coordinate = external argument = external angle
Then you can draw binary decomposition of out of Mandelbrot set( exterior of M-set = C\M)
Now it is the time to draw external rays ( field lines of potential ) of M-set
There are 2 methods:
- for each pixel outside M-set compute external argument. If external argument is within a set tolerance of choosen external angle then draw a pixel
- using Jungreis Algorithm
External ray is a line which consists of points with the same external angle.
External ray is perpendicular to contour lines ( equipotential lines).
All field lines land on the boundary of M-set if M-set is locally connected ( it is not proven)
If p/q is rational number then external ray = r* e^(2*pi*i*p/q) lands on the boundary of M-set. [Douady and Hubbard]
type TRationalNumber= record nominator, denominator:word end;
Procedure DoublingMap( ExternalAngle1:TRationalNumber; var ExternalAngle2:TRationalNumber);
// function defined on the circle
begin
ExternalAngle2.nominator:=2* ExternalAngle1.nominator mod ExternalAngle1.denominator;
ExternalAngle2.denominator:=ExternalAngle1.denominator;
end;
//----------------------------------------------------
function PeriodUnderD( ExternalAngle1:TRationalNumber):integer;
var nominatorTemp,nominator1,nominator2,
i:integer;
begin
//
result:=0;
//
nominator1:= ExternalAngle1.nominator;
NominatorTemp:=nominator1;
for i:= 1 to 100 do
begin
nominator2:=2 * nominatorTemp mod externalAngle1.denominator;
if nominator1=nominator2
then
begin
result:=i;
exit;
end
else nominatorTemp:=nominator2;
end;
end;
//----------------------------------------------------------------
Programs that can draw external rays:
Papers:
www pages:
Main page
Feel free to e-mail me!
Author: Adam Majewski
adammaj1-at-o2-dot-pl
About
http://republika.pl/fraktal/
2005-07-02