File Coverage

blib/lib/Geometry/Primitive/Ellipse.pm
Criterion Covered Total %
statement 1 3 33.3
branch n/a
condition n/a
subroutine 1 1 100.0
pod n/a
total 2 4 50.0


line stmt bran cond sub pod time code
1             package Geometry::Primitive::Ellipse;
2 1     1   65095 use Moose;
  0            
  0            
3             use MooseX::Storage;
4             use Moose::Util::TypeConstraints;
5              
6             use Geometry::Primitive::Point;
7             use Math::Trig ':pi';
8              
9             with qw(Geometry::Primitive::Shape MooseX::Clone MooseX::Storage::Deferred);
10              
11             subtype 'My::Geometry::Primitive::Point' => as class_type('Geometry::Primitive::Point');
12              
13             coerce 'My::Geometry::Primitive::Point'
14             => from 'ArrayRef'
15             => via { Geometry::Primitive::Point->new(x => $_->[0], y => $_->[1]) };
16              
17              
18             has 'height' => (
19             is => 'rw',
20             isa => 'Num',
21             default => 0
22             );
23             has 'origin' => (
24             is => 'rw',
25             isa => 'My::Geometry::Primitive::Point',
26             coerce => 1
27             );
28             has 'width' => (
29             is => 'rw',
30             isa => 'Num',
31             default => 0
32             );
33              
34             sub area {
35             my ($self) = @_;
36             return (pi * $self->width * $self->height) / 4;
37             };
38              
39             sub point_end {
40             my ($self) = @_;
41              
42             return $self->point_start;
43             }
44              
45             sub point_start {
46             my ($self) = @_;
47              
48             return Geometry::Primitive::Point->new(
49             x => $self->origin->x,
50             y => $self->origin->y - ($self->height / 2)
51             );
52             }
53              
54             sub scale {
55             my ($self, $amount) = @_;
56              
57             return Geometry::Primitive::Ellipse->new(
58             height => $self->height * $amount,
59             width => $self->width * $amount
60             );
61             }
62              
63             __PACKAGE__->meta->make_immutable;
64              
65             no Moose;
66             1;
67              
68             __END__
69              
70             =head1 NAME
71              
72             Geometry::Primitive::Ellipse - An Ellipse
73              
74             =head1 DESCRIPTION
75              
76             Geometry::Primitive::Ellipse represents an elliptical conic section.
77              
78             =head1 SYNOPSIS
79              
80             use Geometry::Primitive::Ellipse;
81              
82             my $ellipse = Geometry::Primitive::Ellipse->new(
83             width => 15,
84             height => 10
85             );
86             print $ellipse->area;
87              
88             =head1 ATTRIBUTES
89              
90             =head2 height
91              
92             Set/Get the height of this ellipse.
93              
94             =head2 origin
95              
96             Set/Get the origin of this ellipse.
97              
98             =head2 width
99              
100             Set/Get the width of this ellipse.
101              
102             =head1 METHODS
103              
104             =head2 new
105              
106             Creates a new Geometry::Primitive::Ellipse
107              
108             =head2 area
109              
110             Returns the area of this ellipse.
111              
112             =head2 point_end
113              
114             Gets the "end" point for this Ellipse. Same as C<point_start>.
115              
116             =head2 point_start
117              
118             Get the point that "starts" this Ellipse. Returns the a point where the X
119             coordinate is the Ellipse origin X and the origin Y + height / 2.
120              
121             =head2 scale ($amount)
122              
123             Returns a new ellipse whose radius is $amount times bigger than this one.
124              
125             =head1 AUTHOR
126              
127             Cory Watson <gphat@cpan.org>
128              
129             =head1 COPYRIGHT & LICENSE
130              
131             You can redistribute and/or modify this code under the same terms as Perl
132             itself.