The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Math::PlanePath::MathImageGrayCode -- Gray code coordinates

SYNOPSIS

 use Math::PlanePath::MathImageGrayCode;

 my $path = Math::PlanePath::MathImageGrayCode->new;
 my ($x, $y) = $path->n_to_xy (123);

DESCRIPTION

In progress...

N

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

XY

For the XY form the X and Y coordinates are Gray codes generated from N. Integer N is converted to its Gray code and that code is split by bits to give X and Y.

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

A change N to N+1 is a single bit change in its Gray code, and therefore a single bit change in one of X or Y. For example N=19 to N=20 is a change from X=4 to X=6, a single bit change. An increment can also turn off a bit, as for example N=23 to N=24 changes from Y=2 to Y=0.

Z_N

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

Z_XY

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

FUNCTIONS

See "FUNCTIONS" in Math::PlanePath for the behaviour common to all path classes.

$path = Math::PlanePath::MathImageGrayCode->new ()

Create and return a new path object. The optional radix parameter gives the base for digit splitting (the default is binary, radix 2).

($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