# -*- Perl -*-
use strict;
use warnings;
package Matrix::Named;
use Scalar::Util qw/refaddr/;
use base 'Matrix';
{
my %name;
####
package Angle;
use strict; use warnings;
use constant PI => 4*atan2( 1, 1);
use constant RAD => 180/PI;
sub cre { bless \ my $angle, shift }
sub new {
my $class = shift;
$class->Angle::cre->Angle::init( @_);
}
sub init {
my $obj = shift;
$$obj = _get_angle( @_);
$obj;
}
sub rad { ${ shift() } };
sub deg { ${ shift() }*RAD }
sub _get_angle {
my $angle;
if ( @_ == 1 ) {
$angle = shift;
} else {
my %spec = @_;
$angle = exists $spec{ deg} ? $spec{ deg}/RAD : $spec{ rad};
}
modulo( $angle, 2*PI);
}
use POSIX;
sub modulo {
my ( $x, $y) = @_;
$y ? $x - $y*POSIX::floor( $x/$y) : $x;
}
1;
####
#!/usr/local/bin/perl
use strict; use warnings; $| = 1;
use Vi::QuickFix;
# Definition of MyAngle below
my $alpha = MyAngle->new( rad => atan2( 1, 1));
printf "Angle: %s (%s deg)\n", $alpha->rad, $alpha->deg; # Angle functions
print "Matrix:\n$alpha\n"; # show the matrix representation
##################################################
package MyAngle;
use lib 'lib';
use base 'Angle';
use base 'Matrix';
sub new {
my $class = shift;
$class->Angle::cre->MyAngle::init( @_);
}
sub init {
my $obj = shift;
$obj->Angle::init( @_);
$obj->Matrix::init( cos( $_), -sin( $_), sin( $_), cos( $_)) for
$obj->rad;
$obj;
}
__END__