Math-Zap
view release on metacpan or search on metacpan
lib/Math/Zap/Rectangle.pm view on Meta::CPAN
=head2 Constructors
=head3 new
Create a rectangle from 3 vectors:
a position of any corner
b first side
c second side.
Note that vectors b,c must be at right angles to each other.
=cut
sub new($$$)
{my ($a, $b, $c) = vectorCheck(@_);
$b->dot($c) == 0 or confess 'non rectangular rectangle specified';
bless {a=>$a, b=>$b, c=>$c};
}
=head3 rectangle
Create a rectangle from 3 vectors - synonym for L</new>.
=cut
sub rectangle($$$) {new($_[0],$_[1],$_[2])};
=head2 Methods
=head3 check
Check its a rectangle
=cut
sub check(@)
{for my $r(@_)
{confess "$r is not a rectangle" unless ref($r) eq __PACKAGE__;
}
return (@_)
}
=head3 is
Test its a rectangle
=cut
sub is(@)
{for my $r(@_)
{return 0 unless ref($r) eq __PACKAGE__;
}
'rectangle';
}
=head3 a,b,c
Components of rectangle
=cut
sub a($) {my ($r) = check(@_); $r->{a}}
sub b($) {my ($r) = check(@_); $r->{b}}
sub c($) {my ($r) = check(@_); $r->{c}}
=head3 clone
Create a rectangle from another rectangle
=cut
sub clone($)
{my ($r) = check(@_); # Rectangles
bless {a=>$r->a, b=>$r->b, c=>$r->c};
}
=head3 accuracy
Get/Set accuracy for comparisons
=cut
my $accuracy = 1e-10;
sub accuracy
{return $accuracy unless scalar(@_);
$accuracy = shift();
}
=head3 intersection
Intersect line between two vectors with plane defined by a rectangle
r rectangle
a start vector
b end vector
Solve the simultaneous equations of the plane defined by the
rectangle and the line between the vectors:
ra+l*rb+m*rc = a+(b-a)*n
=>ra+l*rb+m*rc+n*(a-b) = a-ra
( run in 0.928 second using v1.01-cache-2.11-cpan-524268b4103 )