Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / tools / perl-5.8.0 / lib / site_perl / 5.8.0 / Pastel / Geometry / Ellipse.pm
CommitLineData
86530b38
AT
1# Pastel::Geometry::Ellipse\r
2# Copyright 2001, Malay Kumar Basu curiouser@ccmb.ap.nic.in\r
3\r
4package Pastel::Geometry::Ellipse;\r
5@ISA = qw(Pastel::Mixin::Mixin Pastel::Shape);\r
6#use Pastel::Geometry::Shape;\r
7use Carp;\r
8use strict;\r
9\r
10sub 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
19sub _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
40sub 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
45sub get_x { return $_[0]->{x}; }\r
46sub get_y { return $_[0]->{y}; }\r
47sub get_width { return $_[0]->{w}; }\r
48sub get_height { return $_[0]->{h}; }\r
49\r
50sub 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
62sub 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
68sub 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
100sub _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
119sub 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
163sub 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
171sub _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
1811;\r