001 package com.croftsoft.core.math.geom;
002
003 import java.awt.*;
004 import java.awt.geom.*;
005 import java.io.*;
006
007 /*********************************************************************
008 * A circle Shape.
009 *
010 * Currently extends Ellipse2D.Double as an implementation convenience
011 * but this may change in the future.
012 *
013 * @version
014 * 2003-05-13
015 * @since
016 * 2003-04-13
017 * @author
018 * <a href="https://www.croftsoft.com/">David Wallace Croft</a>
019 *********************************************************************/
020
021 public class Circle
022 extends Ellipse2D.Double
023 implements CircleAccessor, Serializable
024 //////////////////////////////////////////////////////////////////////
025 //////////////////////////////////////////////////////////////////////
026 {
027
028 private static final long serialVersionUID = 0L;
029
030 //
031
032 private final Point2DD center;
033
034 //
035
036 private double radius;
037
038 //////////////////////////////////////////////////////////////////////
039 //////////////////////////////////////////////////////////////////////
040
041 public Circle (
042 double centerX,
043 double centerY,
044 double radius )
045 //////////////////////////////////////////////////////////////////////
046 {
047 center = new Point2DD ( centerX, centerY );
048
049 setRadius ( radius );
050 }
051
052 public Circle ( CircleAccessor circleAccessor )
053 //////////////////////////////////////////////////////////////////////
054 {
055 this (
056 circleAccessor.getCenterX ( ),
057 circleAccessor.getCenterY ( ),
058 circleAccessor.getRadius ( ) );
059 }
060
061 public Circle ( )
062 //////////////////////////////////////////////////////////////////////
063 {
064 this ( 0.0, 0.0, 0.0 );
065 }
066
067 //////////////////////////////////////////////////////////////////////
068 // accessor methods
069 //////////////////////////////////////////////////////////////////////
070
071 public PointXY getCenter ( ) { return center; }
072
073 public double getCenterX ( ) { return center.x; }
074
075 public double getCenterY ( ) { return center.y; }
076
077 public double getRadius ( ) { return radius; }
078
079 //////////////////////////////////////////////////////////////////////
080 // mutator methods
081 //////////////////////////////////////////////////////////////////////
082
083 public void setCenter (
084 double centerX,
085 double centerY )
086 //////////////////////////////////////////////////////////////////////
087 {
088 center.setXY ( centerX, centerY );
089
090 x = center.x - radius;
091
092 y = center.y - radius;
093 }
094
095 public void setCenter ( PointXY pointXY )
096 //////////////////////////////////////////////////////////////////////
097 {
098 setCenter ( pointXY.getX ( ), pointXY.getY ( ) );
099 }
100
101 public void setRadius ( double radius )
102 //////////////////////////////////////////////////////////////////////
103 {
104 if ( radius < 0.0 )
105 {
106 throw new IllegalArgumentException ( "radius < 0.0: " + radius );
107 }
108
109 this.radius = radius;
110
111 x = center.x - radius;
112
113 y = center.y - radius;
114
115 width = 2 * radius;
116
117 height = 2 * radius;
118 }
119
120 //////////////////////////////////////////////////////////////////////
121 // overridden Ellipse2D.Double methods
122 //////////////////////////////////////////////////////////////////////
123
124 public boolean contains (
125 double x,
126 double y )
127 //////////////////////////////////////////////////////////////////////
128 {
129 return center.distance ( x, y ) <= radius;
130 }
131
132 //////////////////////////////////////////////////////////////////////
133 //////////////////////////////////////////////////////////////////////
134
135 public boolean intersectsCircle ( CircleAccessor circleAccessor )
136 //////////////////////////////////////////////////////////////////////
137 {
138 double distance
139 = center.distanceXY ( circleAccessor.getCenter ( ) );
140
141 return distance <= radius + circleAccessor.getRadius ( );
142 }
143
144 public boolean intersectsShape ( Shape shape )
145 //////////////////////////////////////////////////////////////////////
146 {
147 if ( shape instanceof CircleAccessor )
148 {
149 return intersectsCircle ( ( CircleAccessor ) shape );
150 }
151
152 if ( radius == 0.0 )
153 {
154 return shape.contains ( center.x, center.y );
155 }
156
157 return intersects ( shape.getBounds2D ( ) );
158 }
159
160 //////////////////////////////////////////////////////////////////////
161 //////////////////////////////////////////////////////////////////////
162
163 public String toString ( )
164 //////////////////////////////////////////////////////////////////////
165 {
166 return "(" + center.x + "," + center.y + "," + radius + ")";
167 }
168
169 //////////////////////////////////////////////////////////////////////
170 // private serialization methods
171 //////////////////////////////////////////////////////////////////////
172
173 private void writeObject ( ObjectOutputStream objectOutputStream )
174 throws IOException
175 //////////////////////////////////////////////////////////////////////
176 {
177 objectOutputStream.defaultWriteObject ( );
178
179 objectOutputStream.writeDouble ( x );
180
181 objectOutputStream.writeDouble ( y );
182
183 objectOutputStream.writeDouble ( width );
184
185 objectOutputStream.writeDouble ( height );
186 }
187
188 private void readObject ( ObjectInputStream objectInputStream )
189 throws IOException, ClassNotFoundException
190 //////////////////////////////////////////////////////////////////////
191 {
192 objectInputStream.defaultReadObject ( );
193
194 x = objectInputStream.readDouble ( );
195
196 y = objectInputStream.readDouble ( );
197
198 width = objectInputStream.readDouble ( );
199
200 height = objectInputStream.readDouble ( );
201 }
202
203 //////////////////////////////////////////////////////////////////////
204 //////////////////////////////////////////////////////////////////////
205 }