use constant PI => 3.14159265359; # ----------------------------------------------------------- # Turtle Graph my $h=0; my @x=(0); my @y=(0); sub rt {$h = $h + shift;} sub fd { $x[scalar @x] = $_[0]*sin(PI*$h/180) + $x[$#x]; $y[scalar @y] = $_[0]*cos(PI*$h/180) + $y[$#y]; } sub reset_xy {$h=0; @x=(0); @y=(0);} # ----------------------------------------------------------- # ----------------------------------------------------------- # Koch Snowflake sub koch { my ($d, $level) = @_ ; if ($level==0) {fd($d); return 1;} rt( 0); koch($d/3,$level-1); rt(-60); koch($d/3,$level-1); rt(120); koch($d/3,$level-1); rt(-60); koch($d/3,$level-1); } # ----------------------------------------------------------- map {rt(120); koch(170, 4);} 0..2; # ----------------------------------------------------------- plotxy([\@x,\@y], 'koch.jpg'); # ----------------------------------------------------------- # ----------------------------------------------------------- # Minkowski Island sub minkowski { my ($d, $level) = @_ ; if ($level==0) {fd($d); return 1;} minkowski($d/4,$level-1); rt(-90); minkowski($d/4,$level-1); rt( 90); minkowski($d/4,$level-1); rt( 90); minkowski($d/4,$level-1); minkowski($d/4,$level-1); rt(-90); minkowski($d/4,$level-1); rt(-90); minkowski($d/4,$level-1); rt( 90); minkowski($d/4,$level-1); } # ----------------------------------------------------------- reset_xy(); # if necessary map {rt(90); minkowski(150, 3);} 0..3; # ----------------------------------------------------------- plotxy([\@x,\@y], 'minkowski.jpg'); # ----------------------------------------------------------- # ----------------------------------------------------------- # Dragon Curve sub dragon1 { my ($d, $level) = @_ ; if ($level==0) {fd($d); return 1;} dragon($d*0.707,$level-1); rt(-90); dragon1($d*0.707,$level-1); } sub dragon { my ($d, $level) = @_ ; if ($level==0) {fd($d); return 1;} dragon($d*0.707,$level-1); rt(90); dragon1($d*0.707,$level-1); } # ----------------------------------------------------------- reset_xy(); # if necessary dragon(150, 12); # ----------------------------------------------------------- plotxy([\@x,\@y], 'dragon.jpg');