# Turtle as in LOGO's Turtle {package turtle; use constant PI => 3.14159265359; sub new {return bless({h=>0,xy=>[[0],[0]]});} sub rt {$_[0]->{h}=$_[0]->{h}+$_[1];} # right turn by x degrees sub fd { # forward by x points my ($h, $xy, $d) = ($_[0]->{h}, $_[0]->{xy}, $_[1]); $xy->[0][scalar(@{$xy->[0]})] = $d*sin(PI*$h/180) + $xy->[0][$#{@{$xy->[0]}}]; $xy->[1][scalar(@{$xy->[1]})] = $d*cos(PI*$h/180) + $xy->[1][$#{@{$xy->[1]}}]; $_[0]->{xy} = $xy; return $xy; } } # ----------------------------------------------------------- # Koch Snowflake sub koch { my ($turtle, $d, $level) = @_ ; if ($level==0) {$turtle->fd($d); return 1;} $turtle->rt( 0); koch($turtle, $d/3,$level-1); $turtle->rt(-60); koch($turtle, $d/3,$level-1); $turtle->rt(120); koch($turtle, $d/3,$level-1); $turtle->rt(-60); koch($turtle, $d/3,$level-1); } # ----------------------------------------------------------- my $turtle = turtle->new(); map {$turtle->rt(120); koch($turtle, 170, 4);} 0..2; # ----------------------------------------------------------- plotxy($turtle->{xy}, 'koch.jpg'); # ----------------------------------------------------------- # Minkowski Island sub minkowski { my ($turtle, $d, $level) = @_ ; if ($level==0) {$turtle->fd($d); return 1;} minkowski($turtle,$d/4,$level-1); $turtle->rt(-90); minkowski($turtle,$d/4,$level-1); $turtle->rt( 90); minkowski($turtle,$d/4,$level-1); $turtle->rt( 90); minkowski($turtle,$d/4,$level-1); minkowski($turtle,$d/4,$level-1); $turtle->rt(-90); minkowski($turtle,$d/4,$level-1); $turtle->rt(-90); minkowski($turtle,$d/4,$level-1); $turtle->rt( 90); minkowski($turtle,$d/4,$level-1); } # ----------------------------------------------------------- $turtle = turtle->new(); map {$turtle->rt(90); minkowski($turtle, 150, 3);} 0..3; # ----------------------------------------------------------- plotxy($turtle->{xy}, 'minkowski.jpg'); # ----------------------------------------------------------- # ----------------------------------------------------------- # Dragon Curve sub dragon1 { my ($turtle, $d, $level) = @_ ; if ($level==0) {$turtle->fd($d); return 1;} dragon($turtle,$d*0.707,$level-1); $turtle->rt(-90); dragon1($turtle,$d*0.707,$level-1); } sub dragon { my ($turtle, $d, $level) = @_ ; if ($level==0) {$turtle->fd($d); return 1;} dragon($turtle,$d*0.707,$level-1); $turtle->rt(90); dragon1($turtle,$d*0.707,$level-1); } # ----------------------------------------------------------- $turtle = turtle->new(); dragon($turtle, 150, 12); # ----------------------------------------------------------- plotxy($turtle->{xy}, 'dragon.jpg');