Math-Project3D-Plot
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Math/Project3D/Plot.pm view on Meta::CPAN
use strict;
use warnings;
use Carp;
use Math::Project3D;
use Imager;
use vars qw/$VERSION/;
$VERSION = '1.02';
# Constructor class and object method new
#
# Creates a new Math::Project3D::Plot instance and returns it.
# Takes a list of object attributes as arguments.
sub new {
my $proto = shift;
my $class = ref $proto || $proto;
my %args = @_;
# check for require attributes
my $missing = _require_attributes(\%args, 'image', 'projection');
croak "Required attribute $missing missing."
if $missing;
# We might croak a lot.
my $croaker = sub { croak "Attribute '$_[0]' is bad." };
my $self = {};
# valid image and projection?
ref $args{image} or $croaker->('image');
$self->{image} = $args{image};
ref $args{projection} eq 'Math::Project3D' or $croaker->('projection');
$self->{proj} = $args{projection};
# defaults
$self = {
%$self,
scale => 10,
origin_x => $self->{image}->getwidth() / 2,
origin_y => $self->{image}->getheight() / 2,
};
my @valid_args = qw(
origin_x origin_y
scale
);
# Take all valid args from the user input and
# put them into our object.
foreach my $arg (@valid_args) {
$self->{$arg} = $args{$arg} if exists $args{$arg};
}
bless $self => $class;
# get min/max logical x/y coordinates
( $self->{min_x}, $self->{min_y} ) = $self->_g_l(0, 0);
( $self->{max_x}, $self->{max_y} ) = $self->_g_l(
$self->{image}->getwidth(),
$self->{image}->getheight(),
);
return $self;
}
# Method plot
# Takes argument pairs: color => Imager color
# and params => array ref of params
# projects the point associated with the parameters.
# Plots the point.
# Returns the graphical coordinates of the point that
# was plotted.
sub plot {
my $self = shift;
my %args = @_;
ref $args{params} eq 'ARRAY' or
croak "Invalid parameters passed to plot().";
my ($coeff1, $coeff2, $distance) = $self->{proj}->project(@{$args{params}});
my ($g_x, $g_y) = $self->_l_g($coeff1, $coeff2);
$self->{image}->setpixel(color=>$args{color}, x=>$g_x, y=>$g_y);
return $g_x, $g_y;
}
# Method plot_list
# Takes argument pairs: color => Imager color,
# params => array ref of array ref of params
# and type => 'line' or 'points'
# Projects the points associated with the parameters.
# Plots the either points or the line connecting them.
# Returns 1.
sub plot_list {
my $self = shift;
my %args = @_;
ref $args{params} eq 'ARRAY' or
croak "Invalid parameters passed to plot_list().";
# Get type, default to points
my $type = $args{type};
$type ||= 'points';
# Do some calulation on the points.
my $matrix = $self->{proj}->project_list( @{ $args{params} } );
# Cache
my ($prev_g_x, $prev_g_y);
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.814 second using v1.00-cache-2.02-grep-82fe00e-cpan-1925d2aa809 )