Math-Zap
view release on metacpan or search on metacpan
lib/Math/Zap/Vector.pm view on Meta::CPAN
use Math::Trig;
use Carp;
use constant debug => 0; # Debugging level
=head3 Constructors
=head4 new
Create a vector from numbers
=cut
sub new($$$)
{return round(bless({x=>$_[0], y=>$_[1], z=>$_[2]})) if debug;
bless {x=>$_[0], y=>$_[1], z=>$_[2]};
}
sub vector($$$) {new($_[0], $_[1], $_[2])}
=head4 units
Unit vectors
=cut
sub units() {($x, $y, $z)}
=head3 Methods
=head4 check
Check its a vector
=cut
sub check(@)
{if (debug)
{for my $v(@_)
{confess "$v is not a vector" unless ref($v) eq __PACKAGE__;
}
}
return (@_)
}
=head4 is
Test its a vector
=cut
sub is(@)
{for my $v(@_)
{return 0 unless ref($v) eq __PACKAGE__;
}
'vector';
}
=head4 accuracy
Get/Set accuracy for comparisons
=cut
my $accuracy = 1e-10;
sub accuracy
{return $accuracy unless scalar(@_);
$accuracy = shift();
}
=head4 round
Round: round to nearest integer if within accuracy of that integer
=cut
sub round($)
{unless (debug)
{return $_[0];
}
else
{my ($a) = @_;
for my $k(keys(%$a))
{my $n = $a->{$k};
my $N = int($n);
$a->{$k} = $N if abs($n-$N) < $accuracy;
}
return $a;
}
}
=head4 x,y,z
x,y,z components of vector
=cut
sub x($) {check(@_) if debug; $_[0]->{x}}
sub y($) {check(@_) if debug; $_[0]->{y}}
sub z($) {check(@_) if debug; $_[0]->{z}}
$x = new(1,0,0);
$y = new(0,1,0);
$z = new(0,0,1);
( run in 1.289 second using v1.01-cache-2.11-cpan-524268b4103 )