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         }