Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | # Pastel::Geometry::Ellipse\r |
2 | # Copyright 2001, Malay Kumar Basu curiouser@ccmb.ap.nic.in\r | |
3 | \r | |
4 | package Pastel::Geometry::Ellipse;\r | |
5 | @ISA = qw(Pastel::Mixin::Mixin Pastel::Shape);\r | |
6 | #use Pastel::Geometry::Shape;\r | |
7 | use Carp;\r | |
8 | use strict;\r | |
9 | \r | |
10 | sub new {\r | |
11 | my $class = shift;\r | |
12 | #print STDERR "Ellipse called\n@_\n";\r | |
13 | my $self = {};\r | |
14 | bless $self, ref($class) || $class;\r | |
15 | $self->_init(@_);\r | |
16 | return $self;\r | |
17 | }\r | |
18 | \r | |
19 | sub _init {\r | |
20 | my ($self, @args) = @_;\r | |
21 | #print STDERR "Ellipse init called\n";\r | |
22 | \r | |
23 | #If no argument supplied, an empty constructor-\r | |
24 | if ( @args < 1){\r | |
25 | $self->{x} = 0;\r | |
26 | $self->{y} = 0;\r | |
27 | $self->{w} = 0;\r | |
28 | $self->{h} = 0;\r | |
29 | } else {\r | |
30 | my ($x, $y, $width, $height)=\r | |
31 | $self->_rearrange(["X", "Y", "WIDTH", "HEIGHT"], @args);\r | |
32 | $self->{x} = defined($x) ? $x : 0;\r | |
33 | $self->{y} = defined($y) ? $y : 0;\r | |
34 | $self->{w} = defined($width) ? $width : 0;\r | |
35 | $self->{h} = defined($height)? $height : 0;\r | |
36 | }\r | |
37 | return $self;\r | |
38 | }\r | |
39 | \r | |
40 | sub to_string {\r | |
41 | my ($self) = shift;\r | |
42 | return ref($self)." Location:[".$self->{x}.",".$self->{y}."] Width:".$self->{w}." Height:".$self->{h};\r | |
43 | }\r | |
44 | \r | |
45 | sub get_x { return $_[0]->{x}; }\r | |
46 | sub get_y { return $_[0]->{y}; }\r | |
47 | sub get_width { return $_[0]->{w}; }\r | |
48 | sub get_height { return $_[0]->{h}; }\r | |
49 | \r | |
50 | sub get_bounds {\r | |
51 | my $self = shift;\r | |
52 | \r | |
53 | #Create a new Rectangle and return\r | |
54 | my $bb = Pastel::Geometry::Rectangle->new(\r | |
55 | $self->get_x(),\r | |
56 | $self->get_y(),\r | |
57 | $self->get_width(),\r | |
58 | $self->get_height());\r | |
59 | return $bb;\r | |
60 | }\r | |
61 | \r | |
62 | sub isEmpty {\r | |
63 | my $self = shift;\r | |
64 | return if ( $self->get_width() <= 0 || $self->get_height() <= 0 );\r | |
65 | }\r | |
66 | \r | |
67 | \r | |
68 | sub contains {\r | |
69 | my $self = shift;\r | |
70 | \r | |
71 | my ($x, $y, $w, $h) = $self->_rearrange(["X", "Y", "WIDTH", "HEIGHT"], @_);\r | |
72 | \r | |
73 | if ( defined($x) &&\r | |
74 | defined($y) &&\r | |
75 | defined($w) &&\r | |
76 | defined($h) )\r | |
77 | {\r | |
78 | return ( $self->_contains($x, $y) &&\r | |
79 | $self->_contains( $x + $w, $y) &&\r | |
80 | $self->_contains( $x, $y + $h) &&\r | |
81 | $self->_contains( $x + $w, $y + $h) );\r | |
82 | }\r | |
83 | \r | |
84 | elsif ( defined( $x) &&\r | |
85 | defined( $y) &&\r | |
86 | !defined($w) &&\r | |
87 | !defined ( $h) )\r | |
88 | {\r | |
89 | return ( $self->_contains( $x, $y) );\r | |
90 | }\r | |
91 | \r | |
92 | else {\r | |
93 | croak "Illegal parameter in Pastel::Ellipse::contains()\n";\r | |
94 | }\r | |
95 | \r | |
96 | \r | |
97 | }\r | |
98 | \r | |
99 | \r | |
100 | sub _contains {\r | |
101 | my $self = shift;\r | |
102 | my ($x, $y ) =@_; \r | |
103 | \r | |
104 | my $width = $self->get_width();\r | |
105 | if ($width <= 0){\r | |
106 | return undef;\r | |
107 | }\r | |
108 | my $normalized_x = ($x - $self->get_x() ) / $width - 0.5;\r | |
109 | \r | |
110 | my $height = $self->get_height();\r | |
111 | if( $height <= 0 ){\r | |
112 | return undef;\r | |
113 | }\r | |
114 | \r | |
115 | my $normalized_y = ($y - $self->get_y() ) / $height - 0.5;\r | |
116 | return ( $normalized_x * $normalized_x + $normalized_y * $normalized_y) < 0.25;\r | |
117 | }\r | |
118 | \r | |
119 | sub intersects {\r | |
120 | my ($self, @args) = @_;\r | |
121 | my ($x, $y, $width, $height) =\r | |
122 | $self->_rearrange( ["X","Y","WIDTH","HEIGHT"],\r | |
123 | @args);\r | |
124 | \r | |
125 | if($width <= 0 || $height <= 0){\r | |
126 | return undef;\r | |
127 | }\r | |
128 | \r | |
129 | my $w = $self->get_width();\r | |
130 | my $h = $self->get_height();\r | |
131 | if( $w <= 0 || $h <= 0){\r | |
132 | return undef;\r | |
133 | }\r | |
134 | \r | |
135 | my $norm_x1 = ( $x - $self->get_x() ) / $w - 0.5;\r | |
136 | my $norm_x2 = $norm_x1 + $width / $w;\r | |
137 | \r | |
138 | my $norm_y1 = ( $y - $self->get_y() ) / $h - 0.5;\r | |
139 | my $norm_y2 = $norm_y1 + $height/ $h;\r | |
140 | \r | |
141 | my ($near_x, $near_y);\r | |
142 | \r | |
143 | if ( $norm_x1 > 0 ){\r | |
144 | $near_x = $norm_x1;\r | |
145 | } elsif ( $norm_x2 < 0 ){\r | |
146 | $near_x = $norm_x2;\r | |
147 | } else {\r | |
148 | $near_x = 0;\r | |
149 | }\r | |
150 | \r | |
151 | if( $norm_y1 > 0 ){\r | |
152 | $near_y = $norm_y1;\r | |
153 | } elsif ( $norm_y2 < 0 ) {\r | |
154 | $near_y = $norm_y2;\r | |
155 | } else {\r | |
156 | $near_y = 0;\r | |
157 | }\r | |
158 | \r | |
159 | return ( $near_x * $near_x + $near_y * $near_y ) < 0.25;\r | |
160 | }\r | |
161 | \r | |
162 | \r | |
163 | sub get_center {\r | |
164 | my $self = shift;\r | |
165 | my $x = $self->get_x() + ($self->get_width() / 2);\r | |
166 | my $y = $self->get_y() + ($self->get_height()/ 2);\r | |
167 | return Pastel::Geometry::Point->new(-x=>$x, -y=>$y);\r | |
168 | \r | |
169 | }\r | |
170 | \r | |
171 | sub _draw{\r | |
172 | my ($self,$g) = @_;\r | |
173 | my $style = $self->get_style($g);\r | |
174 | my $s = "<ellipse cx=\"".$self->get_center()->get_x()."\" cy=\"";\r | |
175 | $s .= $self->get_center()->get_y()."\" rx=\"";\r | |
176 | $s .= eval($self->get_width()/2) ."\" ry=\"".eval($self->get_height()/2). "\" style=\"$style\" />";\r | |
177 | return $s;\r | |
178 | }\r | |
179 | \r | |
180 | \r | |
181 | 1;\r |