package Geometry::Primitive::Ellipse; use Moose; use MooseX::Storage; use Math::Trig ':pi'; extends 'Geometry::Primitive'; with qw(Geometry::Primitive::Shape MooseX::Clone); with Storage(format => 'JSON', io => 'File'); has 'height' => ( is => 'rw', isa => 'Num', default => 0 ); has 'origin' => ( is => 'rw', isa => 'Geometry::Primitive::Point', coerce => 1 ); has 'width' => ( is => 'rw', isa => 'Num', default => 0 ); sub area { my ($self) = @_; return (pi * $self->width * $self->height) / 4; }; sub point_end { my ($self) = @_; return $self->point_start; } sub point_start { my ($self) = @_; return Geometry::Primitive::Point->new( x => $self->origin->x, y => $self->origin->y - ($self->height / 2) ); } sub scale { my ($self, $amount) = @_; return Geometry::Primitive::Ellipse->new( height => $self->height * $amount, width => $self->width * $amount ); } __PACKAGE__->meta->make_immutable; no Moose; 1; __END__ =head1 NAME Geometry::Primitive::Ellipse - An Ellipse =head1 DESCRIPTION Geometry::Primitive::Ellipse represents an elliptical conic section. =head1 SYNOPSIS use Geometry::Primitive::Ellipse; my $ellipse = Geometry::Primitive::Ellipse->new( width => 15, height => 10 ); print $ellipse->area; =head1 ATTRIBUTES =head2 height Set/Get the height of this ellipse. =head2 origin Set/Get the origin of this ellipse. =head2 width Set/Get the width of this ellipse. =head1 METHODS =head2 new Creates a new Geometry::Primitive::Ellipse =head2 area Returns the area of this ellipse. =head2 point_end Gets the "end" point for this Ellipse. Same as C. =head2 point_start Get the point that "starts" this Ellipse. Returns the a point where the X coordinate is the Ellipse origin X and the origin Y + height / 2. =head2 scale ($amount) Returns a new ellipse whose radius is $amount times bigger than this one. =head1 AUTHOR Cory Watson =head1 COPYRIGHT & LICENSE You can redistribute and/or modify this code under the same terms as Perl itself.