NAME

Math::PlanePath::MathImageCellularRule246 -- cellular automaton points

SYNOPSIS

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

DESCRIPTION

This is the pattern of Stephen Wolfram's "rule 246" cellular automaton arranged as rows.

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

-9 -8 -7 -6 -5 -4 -3 -2 -1 X=0 1  2  3  4  5  6  7  8  9 

Each row is runs of 3 out of 4 cells, with even numbered rows having one extra at the start. Each two-row group has a step of 6 more points than the previous two-row.

The rightmost N on the even rows Y=0,2,4,6 etc is the octagonal numbers N=1,8,21,40,65, etc k*(3k-2). The octagonal numbers of the "second kind" 5,16,33,56,85, etc j*(3j+2) are a straight-ish line upwards to the left.

Row Ranges

The left end of each row is

Nleft = ((3Y+2)*Y + 4)/4     if Y even
        ((3Y+2)*Y + 3)/4     if Y odd

The right end is

Nright = ((3Y+8)*Y + 4)/4    if Y even
         ((3Y+8)*Y + 5)/4    if Y odd

       = Nleft(Y+1) - 1   ie. 1 before next Nleft

The row width Xmax-Xmin = 2*Y but with the gaps the number of visited points in a row is less than that,

rowpoints = 3*Y/2 + 1        if Y even
            3*(Y+1)/2        if Y odd

For any Y of course the Nleft to Nright difference is the number of points in the row too

rowpoints = Nright - Nleft + 1

FUNCTIONS

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

$path = Math::PlanePath::MathImageCellularRule246->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.

$n = $path->xy_to_n ($x,$y)

Return the point number for coordinates $x,$y. $x and $y are each rounded to the nearest integer, which has the effect of treating each cell as a square of side 1. If $x,$y is outside the pyramid or on a skipped cell the return is undef.

SEE ALSO

Math::PlanePath, Math::PlanePath::CellularRule54, Math::PlanePath::PyramidRows

http://mathworld.wolfram.com/ElementaryCellularAutomaton.html