my %dirs = (
# IN [ preferred output directions ]
# '1' => [qw( 3 4 5 6 7 8 2 )],
# '2' => [qw( 3 4 5 6 7 8 1 )],
# '3' => [qw( 4 5 6 7 8 1 2 )],
# '4' => [qw( 5 6 7 8 1 2 3 )],
# '5' => [qw( 6 7 8 1 2 3 4 )],
# '6' => [qw( 7 8 1 2 3 4 5 )],
# '7' => [qw( 1 2 3 4 5 6 )],
# '8' => [qw( 3 4 5 6 7 )],
'nw' => [qw( ne e se s sw w n )],
'n' => [qw( ne e se s sw w nw )],
'ne' => [qw( e se s sw w nw n )],
'e' => [qw( se s sw w nw n ne )],
'se' => [qw( s sw w nw n ne e )],
's' => [qw( sw w nw n ne e se )],
'sw' => [qw( nw n ne e se s )],
'w' => [qw( ne e se s sw )],
);
my %dels = (
# IN [ dx, dy, new_in_dir ]
#nw '1' => [ -1, -1, '5' ],
#n '2' => [ 0, -1, '6' ],
#ne '3' => [ 1, -1, '7' ],
#e '4' => [ 1, 0, '8' ],
#se '5' => [ 1, 1, '1' ],
#s '6' => [ 0, 1, '2' ],
#sw '7' => [ -1, 1, '3' ],
#w '8' => [ -1, 0, '4' ],
'nw' => [ -1, -1, 'se' ],
'n' => [ 0, -1, 's' ],
'ne' => [ 1, -1, 'sw' ],
'e' => [ 1, 0, 'w' ],
'se' => [ 1, 1, 'nw' ],
's' => [ 0, 1, 'n' ],
'sw' => [ -1, 1, 'ne' ],
'w' => [ -1, 0, 'e' ],
);
With a my $in_dir = 'w'; to start it off.
in_dir is the direction you came from, while the states are named in the direction they "look"
To watch it work i changed the outer2 loop to
OUTER2:
while (1) {
my @dirs = @{$dirs{$in_dir}};
my $orig_dir=$in_dir;
my $tests='';
for my $d (@dirs) {
my ($dx, $dy, $new_in_dir) = @{$dels{$d}};
$tests.= sprintf(" %2s",$d);
if (($img[$y+$dy][$x+$dx]//' ') eq '#') {
++$cnt;
$in_dir = $new_in_dir;
$y += $dy;
$x += $dx;
$img[$y][$x] = chr(65 + $cnt%26);
print ''
.' indir '.sprintf("%2s",$orig_dir)
.' to ' .sprintf("%2s",$in_dir)
.' code ' .$img[$y][$x]
.' path ' .sprintf('%24s',$tests)
." ($x,$y)\n";
push @points_in_order, [ $x, $y ];
next OUTER2;
}
}
print "Can't find anywhere to go! ('$in_dir': $x, $y)\n";
last OUTER2;
}
which gives me output like
Found a bit of horizontal top edge at 22, 1
indir w to w code B path ne e (23,1)
indir w to w code C path ne e (24,1)
indir w to w code D path ne e (25,1)
indir w to w code E path ne e (26,1)
indir w to w code F path ne e (27,1)
indir w to w code G path ne e (28,1)
indir w to sw code H path ne (29,0)
indir sw to n code I path nw n ne e se s (29,1)
indir n to n code J path ne e se s (29,2)
indir n to n code K path ne e se s (29,3)
indir n to n code L path ne e se s (29,4)
indir n to nw code M path ne e se (30,5)
indir nw to w code N path ne e (31,5)
indir w to nw code O path ne e se (32,6)
indir nw to w code P path ne e (33,6)
indir w to w code Q path ne e (34,6)
indir w to w code R path ne e (35,6)
indir w to w code S path ne e (36,6)
indir w to w code T path ne e (37,6)
indir w to w code U path ne e (38,6)
indir w to sw code V path ne (39,5)
indir sw to n code W path nw n ne e se s (39,6)
indir n to n code X path ne e se s (39,7)
indir n to n code Y path ne e se s (39,8)
indir n to n code Z path ne e se s (39,9)
indir n to n code A path ne e se s (39,10)
indir n to n code B path ne e se s (39,11)
indir n to n code C path ne e se s (39,12)
indir n to n code D path ne e se s (39,13)
indir n to n code E path ne e se s (39,14)
indir n to n code F path ne e se s (39,15)
indir n to n code G path ne e se s (39,16)
indir n to n code H path ne e se s (39,17)
indir n to n code I path ne e se s (39,18)
indir n to n code J path ne e se s (39,19)
indir n to n code K path ne e se s (39,20)
indir n to n code L path ne e se s (39,21)
indir n to n code M path ne e se s (39,22)
indir n to n code N path ne e se s (39,23)
indir n to ne code O path ne e se s sw (38,24)
indir ne to n code P path e se s (38,25)
indir n to n code Q path ne e se s (38,26)
indir n to n code R path ne e se s (38,27)
indir n to n code S path ne e se s (38,28)
indir n to ne code T path ne e se s sw (37,29)
indir ne to ne code U path e se s sw (36,30)
indir ne to e code V path e se s sw w (35,30)
indir e to e code W path se s sw w (34,30)
indir e to e code X path se s sw w (33,30)
indir e to e code Y path se s sw w (32,30)
indir e to s code Z path se s sw w nw n (32,29)
indir s to se code A path sw w nw (31,28)
indir se to e code B path s sw w (30,28)
indir e to e code C path se s sw w (29,28)
indir e to e code D path se s sw w (28,28)
indir e to e code E path se s sw w (27,28)
indir e to e code F path se s sw w (26,28)
indir e to se code G path se s sw w nw (25,27)
indir se to e code H path s sw w (24,27)
indir e to e code I path se s sw w (23,27)
indir e to e code J path se s sw w (22,27)
indir e to se code K path se s sw w nw (21,26)
indir se to e code L path s sw w (20,26)
indir e to e code M path se s sw w (19,26)
indir e to e code N path se s sw w (18,26)
indir e to e code O path se s sw w (17,26)
indir e to e code P path se s sw w (16,26)
indir e to e code Q path se s sw w (15,26)
indir e to se code R path se s sw w nw (14,25)
indir se to e code S path s sw w (13,25)
indir e to e code T path se s sw w (12,25)
indir e to e code U path se s sw w (11,25)
indir e to e code V path se s sw w (10,25)
indir e to se code W path se s sw w nw (9,24)
indir se to se code X path s sw w nw (8,23)
indir se to s code Y path s sw w nw n (8,22)
indir s to s code Z path sw w nw n (8,21)
indir s to se code A path sw w nw (7,20)
indir se to s code B path s sw w nw n (7,19)
indir s to s code C path sw w nw n (7,18)
indir s to se code D path sw w nw (6,17)
indir se to s code E path s sw w nw n (6,16)
indir s to s code F path sw w nw n (6,15)
indir s to se code G path sw w nw (5,14)
indir se to e code H path s sw w (4,14)
indir e to e code I path se s sw w (3,14)
indir e to s code J path se s sw w nw n (3,13)
indir s to s code K path sw w nw n (3,12)
indir s to s code L path sw w nw n (3,11)
indir s to s code M path sw w nw n (3,10)
indir s to se code N path sw w nw (2,9)
indir se to se code O path s sw w nw (1,8)
indir se to se code P path s sw w nw (0,7)
indir se to s code Q path s sw w nw n (0,6)
indir s to sw code R path sw w nw n ne (1,5)
indir sw to nw code S path nw n ne e se (2,6)
indir nw to n code T path ne e se s (2,7)
indir n to nw code U path ne e se (3,8)
indir nw to w code V path ne e (4,8)
indir w to nw code W path ne e se (5,9)
indir nw to w code X path ne e (6,9)
indir w to nw code Y path ne e se (7,10)
indir nw to w code Z path ne e (8,10)
indir w to nw code A path ne e se (9,11)
indir nw to w code B path ne e (10,11)
indir w to w code C path ne e (11,11)
indir w to w code D path ne e (12,11)
indir w to nw code E path ne e se (13,12)
indir nw to w code F path ne e (14,12)
indir w to w code G path ne e (15,12)
indir w to w code H path ne e (16,12)
indir w to sw code I path ne (17,11)
indir sw to s code J path nw n (17,10)
indir s to s code K path sw w nw n (17,9)
indir s to s code L path sw w nw n (17,8)
indir s to s code M path sw w nw n (17,7)
indir s to sw code N path sw w nw n ne (18,6)
indir sw to sw code O path nw n ne (19,5)
indir sw to sw code P path nw n ne (20,4)
indir sw to s code Q path nw n (20,3)
indir s to s code R path sw w nw n (20,2)
indir s to w code S path sw w nw n ne e (21,2)
indir w to sw code T path ne (22,1)
Can't find anywhere to go! ('sw': 22, 1)
I found this much easier to follow. |