NAME
Math::PlanePath::MathImageTwinDragon -- points in complex number base i-1
SYNOPSIS
use Math::PlanePath::MathImageTwinDragon;
my $path = Math::PlanePath::MathImageTwinDragon->new;
my ($x, $y) = $path->n_to_xy (123);
DESCRIPTION
In progress.
This an integer version of the "twindragon" formed from the complex number base i-1,
26 27 10 11 3
24 25 8 9 2
18 19 30 31 2 3 14 15 1
16 17 28 29 0 1 12 13 <- Y=0
22 23 6 7 58 59 42 43 -1
20 21 4 5 56 57 40 41 -2
50 51 62 63 34 35 46 47 -3
48 49 60 61 32 33 44 45 -4
54 55 38 39 -5
52 53 36 37 -6
^
-5 -4 -3 -2 -1 X=0 1 2 3 4 5 6 7
With base b=i-1, a complex integer can be represented by
X+Yi = a[n]*b^n + ... + a2*b^2 + a1*b + a0
where the digits a[n] to a0 are each either 0 or 1. The index N is those a[i] in binary and the X,Y is the resulting complex number. It can be shown that this is a one-to-one transformation, that every integer point of the plane is visited, just once.
The pattern of a given 0 to 2^level-1 is repeated in the following 2^level to (2*2^level)-1. For example the shape of N=0 to N=7 is repeated as N=8 to N=15, but starting up at X=2,Y=2. This is due to the base b^3 = 2+2i. There's no rotations or mirroring etc in this replication, just a simple shift.
Each each N=2^level point is at b^level, and that powering of the base rotates around by +135 degrees and a factor sqrt(2) on the radius each time. So for example b^3 = 2+2i is followed by b^4 = -4 which is 135 degrees around, and the radius |b^3|=sqrt(8) becomes |b^4|=sqrt(16).
Radius Range
In general, after the first few innermost levels, each N=2^level increases the covered radius around by a factor sqrt(2), ie.
N = 0 to 2^level-1
Xmin,Ymin closest to origin
Xmin^2+Ymin^2 approx 2^(level-7)
The "level-7" is since the innermost few levels take a while to cover the points surrounding the origin. Notice for example X=1,Y=-1 is not reached until N=58. But after that it grows like N ~ pi*R^2.
Fractal
The twindragon is generally conceived as taking fractional N like binary 0.abcde and giving complex components X,Y components. The twindragon is then all the points of the real plane reached by such N -- which can be shown to be connected and having a certain radius around the origin which is completely covered.
The code here might be pressed into use for that, for some finite number of N digits, by taking a suitable power N*256^k to get an integer then X/16^k, Y/16^k for fractions X,Y. 256 is a good base because b^8=16 so there's no rotations to apply to the X,Y, just a division. (b^4=-4 for multiplier 16^k and divisor (-4)^k would be almost as easy too.)
FUNCTIONS
$path = Math::PlanePath::MathImageTwinDragon->new ()
-
Create and return a new path object.
($x,$y) = $path->n_to_xy ($n)
-
Return the X,Y coordinates of point number
$n
on the path. Points begin at 0 and if$n < 0
then the return is an empty list.$n
should be an integer, it's unspecified yet what will be done for a fraction.
FORMULAS
X,Y to N
A given X,Y representing X+Yi can be broken into digits of N by complex division by i-1, with remainder 0 or 1 being each digit.
The remainder can be determined simply from (X+Y) mod 2. If it's 1 then X-1,Y gives a point which is an exact multiple of i-1 and that base can be divided out
X <- -(X-Y)/2
Y <- -(X+Y)/2
This can also be thought of as a rotate by -135 degrees and divide by sqrt(2).
The binary bits of N from low to high are generated this way.