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 }