NAME

Math::PlanePath::ImaginaryBase -- replications in four directions

SYNOPSIS

use Math::PlanePath::ImaginaryBase;
my $path = Math::PlanePath::ImaginaryBase->new (radix => 4);
my ($x, $y) = $path->n_to_xy (123);

DESCRIPTION

This is a simple pattern arising from complex numbers expressed in a base i*sqrt(2) and other i*sqrt(r) bases. The default r=2 gives

38   39   34   35   54   55   50   51        5
36   37   32   33   52   53   48   49        4
46   47   42   43   62   63   58   59        3
44   45   40   41   60   61   56   57        2
 6    7    2    3   22   23   18   19        1
 4    5    0    1   20   21   16   17    <- Y=0
14   15   10   11   30   31   26   27       -1
12   13    8    9   28   29   24   25       -2
           ^
-2   -1   X=0   1    2    3    4    5

After N=0 at the origin, N=1 is to the right. Then that little 2x1 block is repeated above as N=2 and N=3. Then that 2x2 pattern repeated to the right as N=4 to N=7, 4x2 repeated below N=8 to N=16, and 4x4 block to the right again as N=16 to N=31. Each repeat is 90 degrees further around each time, and just a simple offset so the same orientation and relative layout within the repetition.

This arises from representing a complex number in "base" b=i*sqrt(r) with digits a[i] in the range 0 to r-1. For integer X,Y,

X+Y*i*sqrt(r) = a[n]*b^n + ... + a[2]*b^2 + a[1]*b + a[0]

with N then a base-r integer

N = a[n]*r^n + ... + a[2]*r^2 + a[1]*r + a[0]

The factor sqrt(r) makes the generated Y an integer. In actual use that factor can be omitted and fraction digits a[-1]*r^-1 etc used to reach smaller Y values, such as in Knuth's "quater-imaginary" system of base 2*i (which is i*sqrt(4)) with digits 0,1,2,3.

The powers of b=i give the replication direction, so i^0=1 right, i^1=i up, i^2=-1 right, i^3=-i down, etc. The b=sqrt(r) part then spreads the replication in the respective direction. It takes two steps to repeat horiziontally and sqrt(r)^2=r hence the doubling 1x1 to the right, 2x2 to the left, 4x4 to the left, etc, and similarly vertically.

The pattern can be compared to the ZOrderCurve. In Z-Order the replications are alternately to the left and above, and here they progress through four directions left, above, right, below.

Radix

The radix parameter controls the "r" used to break N into X,Y. For example radix => 3 gives 3x3 blocks,

24  25  26  15  16  17   6   7   8      2
21  22  23  12  13  14   3   4   5      1
18  19  20   9  10  11   0   1   2  <- Y=0
51  52  53  42  43  44  33  34  35     -1
48  49  50  39  40  41  30  31  32     -2
45  46  47  36  37  38  27  28  29     -3
78  79  80  69  70  71  60  61  62     -4
75  76  77  66  67  68  57  58  59     -5
72  73  74  63  64  65  54  55  56     -6

-6  -5  -4  -3  -2  -1  X=0  1   2

FUNCTIONS

$path = Math::PlanePath::ImaginaryBase->new ()
$path = Math::PlanePath::ImaginaryBase->new (radix => $r)

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.

SEE ALSO

Math::PlanePath, Math::PlanePath::ZOrderCurve

HOME PAGE

http://user42.tuxfamily.org/math-planepath/index.html

LICENSE

Copyright 2011 Kevin Ryde

Math-PlanePath is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.

Math-PlanePath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with Math-PlanePath. If not, see <http://www.gnu.org/licenses/>.