#!/usr/local/bin/perl5 -w

package STurtle;

use strict;

use vars qw($VERSION @ISA @EXPORT @EXPORT_OK
    $main $canvas $count
);

require Exporter;
require AutoLoader;

@ISA = qw(Exporter AutoLoader 
);

@EXPORT = qw( );

$VERSION = "0.1";

use Carp;

my @visit;
$main = '';
$canvas = '';
$count = 0;

sub create {
    my $type = shift;
    my (%args) = @_;
    my $self = \%args;
    bless $self,$type;
    defined($self->{-x}) or $self->{-x} = 100000;
    defined($self->{-y}) or $self->{-y} = 100000;
    defined($self->{-width}) or $self->{-width} = 5;
    defined($self->{-name}) or $self->{-name} = '.';
    defined($self->{-dir}) or $self->{-dir} = 0;
    defined($self->{-sin}) or $self->{-sin} = 0;
    defined($self->{-cos}) or $self->{-cos} = 1;
    defined($self->{-color}) or $self->{-color} = 'black';
    return $self;
}

sub move {
    my ($self,$dx,$dy) = @_;
    my ($ox,$oy) = ($self->{-x},$self->{-y});
    $self->{-x} += $dx;
    $self->{-y} += $dy;
    return $self if ($self->{-color} eq 'none');
    $visit[int($self->{-x})][int( $self->{-y})]++;
    return $self;
}

sub color {
    my ($self,$color) = @_;
    if ($color) {
	$self->{-color} = $color;
	return $self;
    } else {
	return $self->{-color};
    }
}

sub follow {
    my ($self,$b,$speed) = @_;

    my $dir = atan2(($b->y - $self->y) , ($b->x - $self->x))*360/3.1415926/2;
    $self->direction($dir);
    $self->forward($speed);
}

sub x {
    my ($self,$x) = @_;
    if ($x) {
	$self->{-x} = $x;
	return $self;
    } else {
	return $self->{-x};
    }
}

sub y {
    my ($self,$y) = @_;
    if ($y) {
	$self->{-y} = $y;
	return $self;
    } else {
	return $self->{-y};
    }
}

sub name {
    my ($self,$name) = @_;
    $self->{-name} = $name;
    return $self;
}

sub width {
    my ($self,$width) = @_;
    $self->{-width} = $width;
    return $self;
}

sub erase {
    my ($self,$name) = @_;
    $self->{-canvas}->delete($name);
    return $self;
}

sub direction {
    my ($self,$dir) = @_;
    $self->{-dir} = $dir;
    $self->{-sin} = sin($dir*(2*3.14159626/360));
    $self->{-cos} = cos($dir*(2*3.14159626/360));
    return $self;
}

sub turn {
    my ($self,$turn) = @_;
    $self->direction($self->{-dir} + $turn);
    return $self;
}

sub left {
    my ($self) = @_;
    $self->turn(-90);
    return $self;
}

sub right {
    my ($self) = @_;
    $self->turn(90);
    return $self;
}

sub forward {
    my ($self,$length) = @_;
    $self->move(
	$self->{-cos}*$length,			
	$self->{-sin}*$length
    );
    return $self;
}


sub MainLoop {
    for(my $i=0;$i< $#visit;$i++) {
	for(my $j=0;$j< $#{$visit[$i]};$j++) {
	    if (defined $visit[$i][$j]) {
		print "$i $j $visit[$i][$j]\n";
	    } else {
		print "$i $j -100\n";
	    }
	}
    }
    exit;
}

1;


__END__

=head1 NAME

Turtle - Turtle Graphics Routine for Perl/Tk

=head1 SYNOPSIS

    use Turtle;

=head1 DESCRIPTION

Perl/Tkを使った Turtle Graphics ライブラリです。

sub create()
	Turtle を一つ作る。Window が開いてなければ新しく作ります。

sub move($x,$y)
	絶対座標への移動。移動の軌跡が線で描画されます。

sub color($color)
	色の指定。'none' を指定すると描画しません。

sub name($name))
	名前の指定。描画の時のPerl/TKのタグが指定されます。

sub width($width)
	線幅の指定

sub erase($name)
	指定された名前の亀が書いた絵を消します。

sub direction($dir) 
	forward の描画方向の絶対指定。360度で指定します。

sub turn($dir)
	forward の描画方向の相対指定。360度で指定します。

sub left()
	90度左に向きます。

sub right()
	90度右に向きます。

sub forward($length)
	前に進みます。方向は、direcitonなどで指定します。

sub set_display()
	内部で使用しているメソッド。

sub MainLoop 
	Perl/TK のMainLoopを呼び出します。


=head1 AUTHOR

Shinji Kono, kono@ie.u-ryukyu.ac.jp

=head1 SEE ALSO

Perl/TK document

=cut
