svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.geometry / org.gvsig.fmap.geometry.impl / src / main / java / org / gvsig / fmap / geom / primitive / impl / Circle2D.java @ 40559
History | View | Annotate | Download (12.7 KB)
1 | 40559 | jjdelcerro | /**
|
---|---|---|---|
2 | * gvSIG. Desktop Geographic Information System.
|
||
3 | 40435 | jjdelcerro | *
|
4 | 40559 | jjdelcerro | * Copyright (C) 2007-2013 gvSIG Association.
|
5 | 40435 | jjdelcerro | *
|
6 | * This program is free software; you can redistribute it and/or
|
||
7 | * modify it under the terms of the GNU General Public License
|
||
8 | 40559 | jjdelcerro | * as published by the Free Software Foundation; either version 3
|
9 | 40435 | jjdelcerro | * of the License, or (at your option) any later version.
|
10 | *
|
||
11 | * This program is distributed in the hope that it will be useful,
|
||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
14 | * GNU General Public License for more details.
|
||
15 | *
|
||
16 | * You should have received a copy of the GNU General Public License
|
||
17 | * along with this program; if not, write to the Free Software
|
||
18 | 40559 | jjdelcerro | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
19 | * MA 02110-1301, USA.
|
||
20 | 40435 | jjdelcerro | *
|
21 | 40559 | jjdelcerro | * For any additional information, do not hesitate to contact us
|
22 | * at info AT gvsig.com, or visit our website www.gvsig.com.
|
||
23 | 40435 | jjdelcerro | */
|
24 | package org.gvsig.fmap.geom.primitive.impl; |
||
25 | |||
26 | import java.awt.geom.AffineTransform; |
||
27 | import java.awt.geom.Arc2D; |
||
28 | import java.awt.geom.Point2D; |
||
29 | import java.awt.geom.Rectangle2D; |
||
30 | import java.util.ArrayList; |
||
31 | |||
32 | import org.cresques.cts.IProjection; |
||
33 | |||
34 | import org.gvsig.fmap.geom.Geometry; |
||
35 | import org.gvsig.fmap.geom.handler.AbstractHandler; |
||
36 | import org.gvsig.fmap.geom.handler.CuadrantHandler; |
||
37 | import org.gvsig.fmap.geom.handler.Handler; |
||
38 | import org.gvsig.fmap.geom.primitive.Circle; |
||
39 | import org.gvsig.fmap.geom.primitive.FShape; |
||
40 | import org.gvsig.fmap.geom.primitive.GeneralPathX; |
||
41 | import org.gvsig.fmap.geom.primitive.Point; |
||
42 | import org.gvsig.fmap.geom.type.GeometryType; |
||
43 | import org.gvsig.fmap.geom.util.UtilFunctions; |
||
44 | |||
45 | /**
|
||
46 | * DOCUMENT ME!
|
||
47 | *
|
||
48 | * @author Vicente Caballero Navarro
|
||
49 | */
|
||
50 | public class Circle2D extends Surface2D implements Circle { |
||
51 | private static final long serialVersionUID = -2709867465161215668L; |
||
52 | |||
53 | private Point2D center; |
||
54 | private double radio; |
||
55 | |||
56 | /**
|
||
57 | * The constructor with the GeometryType like and argument
|
||
58 | * is used by the {@link GeometryType}{@link #create()}
|
||
59 | * to create the geometry
|
||
60 | * @param type
|
||
61 | * The geometry type
|
||
62 | */
|
||
63 | public Circle2D(GeometryType geometryType) {
|
||
64 | super(geometryType);
|
||
65 | } |
||
66 | |||
67 | /**
|
||
68 | * Constructor used in the {@link Geometry#cloneGeometry()} method
|
||
69 | */
|
||
70 | Circle2D(GeometryType geometryType, String id, IProjection projection, GeneralPathX gpx,
|
||
71 | Point2D c, double r) { |
||
72 | super(geometryType, id, projection, gpx);
|
||
73 | center = c; |
||
74 | radio = r; |
||
75 | } |
||
76 | |||
77 | /*
|
||
78 | * (non-Javadoc)
|
||
79 | * @see org.gvsig.fmap.geom.primitive.Circle#getCenter()
|
||
80 | */
|
||
81 | public Point getCenter() { |
||
82 | return new org.gvsig.fmap.geom.primitive.impl.Point2D(center.getX(), center.getY()); |
||
83 | } |
||
84 | |||
85 | /*
|
||
86 | * (non-Javadoc)
|
||
87 | * @see org.gvsig.fmap.geom.primitive.impl.Surface2D#cloneFShape()
|
||
88 | */
|
||
89 | public FShape cloneFShape() {
|
||
90 | return new Circle2D(getGeometryType(), id, projection, (GeneralPathX) gp.clone(), center, |
||
91 | radio); |
||
92 | } |
||
93 | |||
94 | /*
|
||
95 | * (non-Javadoc)
|
||
96 | * @see org.gvsig.fmap.geom.primitive.impl.Surface2D#getShapeType()
|
||
97 | */
|
||
98 | public int getShapeType() { |
||
99 | return TYPES.CIRCLE;
|
||
100 | } |
||
101 | |||
102 | /*
|
||
103 | * (non-Javadoc)
|
||
104 | * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#transform(java.awt.geom.AffineTransform)
|
||
105 | */
|
||
106 | public void transform(AffineTransform at) { |
||
107 | |||
108 | if (at == null) { |
||
109 | return;
|
||
110 | } |
||
111 | |||
112 | Point2D pdist = UtilFunctions.getPerpendicularPoint(new Point2D.Double( |
||
113 | center.getX() + 10, center.getY()), new Point2D.Double(center |
||
114 | .getX() - 10, center.getY()), center, radio);
|
||
115 | Point2D aux = new Point2D.Double(); |
||
116 | at.transform(center, aux); |
||
117 | center = aux; |
||
118 | Point2D aux3 = new Point2D.Double(); |
||
119 | at.transform(pdist, aux3); |
||
120 | radio = center.distance(aux3); |
||
121 | gp.transform(at); |
||
122 | } |
||
123 | |||
124 | /*
|
||
125 | * (non-Javadoc)
|
||
126 | * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#getStretchingHandlers()
|
||
127 | */
|
||
128 | public Handler[] getStretchingHandlers() { |
||
129 | ArrayList handlers = new ArrayList(); |
||
130 | Rectangle2D rect = this.getBounds2D(); |
||
131 | handlers |
||
132 | .add(new CenterHandler(0, rect.getCenterX(), rect.getCenterY())); |
||
133 | // handlers.add(new RadioHandler(1, rect.getX(), rect.getCenterY()));
|
||
134 | // handlers.add(new RadioHandler(2, rect.getMaxX(), rect.getCenterY()));
|
||
135 | // handlers.add(new RadioHandler(3, rect.getCenterX(), rect.getY()));
|
||
136 | // handlers.add(new RadioHandler(3, rect.getCenterX(), rect.getMaxY()));
|
||
137 | |||
138 | return (Handler[]) handlers.toArray(new Handler[0]); |
||
139 | } |
||
140 | |||
141 | /*
|
||
142 | * (non-Javadoc)
|
||
143 | * @see org.gvsig.fmap.geom.primitive.impl.OrientablePrimitive2D#getSelectHandlers()
|
||
144 | */
|
||
145 | public Handler[] getSelectHandlers() { |
||
146 | ArrayList handlers = new ArrayList(); |
||
147 | handlers.add(new CenterSelHandler(0, center.getX(), center.getY())); |
||
148 | handlers.add(new RadioSelHandler(1, center.getX() - radio, center |
||
149 | .getY())); |
||
150 | handlers.add(new RadioSelHandler(2, center.getX() + radio, center |
||
151 | .getY())); |
||
152 | handlers.add(new RadioSelHandler(3, center.getX(), center.getY() |
||
153 | - radio)); |
||
154 | handlers.add(new RadioSelHandler(3, center.getX(), center.getY() |
||
155 | + radio)); |
||
156 | |||
157 | return (Handler[]) handlers.toArray(new Handler[0]); |
||
158 | } |
||
159 | |||
160 | /**
|
||
161 | * DOCUMENT ME!
|
||
162 | *
|
||
163 | * @author Vicente Caballero Navarro
|
||
164 | */
|
||
165 | class CenterHandler extends AbstractHandler implements Handler, org.gvsig.fmap.geom.handler.CenterHandler{ |
||
166 | /**
|
||
167 | * Crea un nuevo PointHandler.
|
||
168 | *
|
||
169 | * @param i
|
||
170 | * DOCUMENT ME!
|
||
171 | * @param x
|
||
172 | * DOCUMENT ME!
|
||
173 | * @param y
|
||
174 | * DOCUMENT ME!
|
||
175 | */
|
||
176 | public CenterHandler(int i, double x, double y) { |
||
177 | point = new Point2D.Double(x, y); |
||
178 | index = i; |
||
179 | } |
||
180 | |||
181 | /**
|
||
182 | * DOCUMENT ME!
|
||
183 | *
|
||
184 | * @param x
|
||
185 | * DOCUMENT ME!
|
||
186 | * @param y
|
||
187 | * DOCUMENT ME!
|
||
188 | *
|
||
189 | * @return DOCUMENT ME!
|
||
190 | */
|
||
191 | public void move(double x, double y) { |
||
192 | center = new Point2D.Double(center.getX() + x, center.getY() + y); |
||
193 | Point point;
|
||
194 | for (int i = 0; i < gp.getNumCoords(); i++) { |
||
195 | point = gp.getPointAt(i); |
||
196 | point.setX(point.getX() + x); |
||
197 | point.setY(point.getY() + y); |
||
198 | } |
||
199 | } |
||
200 | |||
201 | /**
|
||
202 | * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
|
||
203 | */
|
||
204 | public void set(double x, double y) { |
||
205 | } |
||
206 | |||
207 | } |
||
208 | |||
209 | /**
|
||
210 | * DOCUMENT ME!
|
||
211 | *
|
||
212 | * @author Vicente Caballero Navarro
|
||
213 | */
|
||
214 | class CenterSelHandler extends AbstractHandler implements Handler, org.gvsig.fmap.geom.handler.CenterHandler { |
||
215 | /**
|
||
216 | * Crea un nuevo PointHandler.
|
||
217 | *
|
||
218 | * @param i
|
||
219 | * DOCUMENT ME!
|
||
220 | * @param x
|
||
221 | * DOCUMENT ME!
|
||
222 | * @param y
|
||
223 | * DOCUMENT ME!
|
||
224 | */
|
||
225 | public CenterSelHandler(int i, double x, double y) { |
||
226 | point = new Point2D.Double(x, y); |
||
227 | index = i; |
||
228 | } |
||
229 | |||
230 | /**
|
||
231 | * DOCUMENT ME!
|
||
232 | *
|
||
233 | * @param x
|
||
234 | * DOCUMENT ME!
|
||
235 | * @param y
|
||
236 | * DOCUMENT ME!
|
||
237 | *
|
||
238 | * @return DOCUMENT ME!
|
||
239 | */
|
||
240 | public void move(double x, double y) { |
||
241 | Point point;
|
||
242 | for (int i = 0; i < gp.getNumCoords() ; i++) { |
||
243 | point = gp.getPointAt(i); |
||
244 | point.setX(point.getX() + x); |
||
245 | point.setY(point.getY() + y); |
||
246 | } |
||
247 | } |
||
248 | |||
249 | /**
|
||
250 | * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
|
||
251 | */
|
||
252 | public void set(double x, double y) { |
||
253 | center = new Point2D.Double(x, y); |
||
254 | Arc2D.Double arc = new Arc2D.Double(center.getX() - radio, center |
||
255 | .getY() |
||
256 | - radio, 2 * radio, 2 * radio, 0, 360, Arc2D.OPEN); |
||
257 | gp = new GeneralPathX(arc.getPathIterator(null)); |
||
258 | gp.closePath(); |
||
259 | } |
||
260 | } |
||
261 | |||
262 | /**
|
||
263 | * DOCUMENT ME!
|
||
264 | *
|
||
265 | * @author Vicente Caballero Navarro
|
||
266 | */
|
||
267 | class RadioSelHandler extends AbstractHandler implements CuadrantHandler { |
||
268 | |||
269 | /**
|
||
270 | * Crea un nuevo PointHandler.
|
||
271 | *
|
||
272 | * @param i
|
||
273 | * DOCUMENT ME!
|
||
274 | * @param x
|
||
275 | * DOCUMENT ME!
|
||
276 | * @param y
|
||
277 | * DOCUMENT ME!
|
||
278 | */
|
||
279 | public RadioSelHandler(int i, double x, double y) { |
||
280 | point = new Point2D.Double(x, y); |
||
281 | index = i; |
||
282 | } |
||
283 | |||
284 | /**
|
||
285 | * DOCUMENT ME!
|
||
286 | *
|
||
287 | * @param x
|
||
288 | * DOCUMENT ME!
|
||
289 | * @param y
|
||
290 | * DOCUMENT ME!
|
||
291 | *
|
||
292 | * @return DOCUMENT ME!
|
||
293 | */
|
||
294 | public void move(double x, double y) { |
||
295 | |||
296 | } |
||
297 | |||
298 | /**
|
||
299 | * @see org.gvsig.fmap.geom.handler.Handler#set(double, double)
|
||
300 | */
|
||
301 | public void set(double x, double y) { |
||
302 | radio = center.distance(x, y); |
||
303 | Arc2D.Double arc = new Arc2D.Double(center.getX() - radio, center |
||
304 | .getY() |
||
305 | - radio, 2 * radio, 2 * radio, 0, 360, Arc2D.OPEN); |
||
306 | gp = new GeneralPathX(arc.getPathIterator(null)); |
||
307 | } |
||
308 | } |
||
309 | |||
310 | /*
|
||
311 | * (non-Javadoc)
|
||
312 | *
|
||
313 | * @see com.iver.cit.gvsig.fmap.core.FPolyline2D#intersects(java.awt.geom.Rectangle2D)
|
||
314 | */
|
||
315 | public boolean intersects(Rectangle2D r) { |
||
316 | return gp.intersects(r);
|
||
317 | } |
||
318 | |||
319 | /* (non-Javadoc)
|
||
320 | * @see org.gvsig.fmap.geom.primitive.Surface2D#setGeneralPath(org.gvsig.fmap.geom.primitive.GeneralPathX)
|
||
321 | */
|
||
322 | public void setGeneralPath(GeneralPathX generalPathX) { |
||
323 | throw new UnsupportedOperationException("Use setPoints(Point center, Point radious)"); |
||
324 | } |
||
325 | |||
326 | /* (non-Javadoc)
|
||
327 | * @see org.gvsig.fmap.geom.primitive.Circle#setPoints(org.gvsig.fmap.geom.primitive.Point, org.gvsig.fmap.geom.primitive.Point)
|
||
328 | */
|
||
329 | public void setPoints(Point center, Point radious) { |
||
330 | Point2D _center = new java.awt.geom.Point2D.Double(center.getCoordinateAt(0), center.getCoordinateAt(1)); |
||
331 | Point2D _radious = new java.awt.geom.Point2D.Double(radious.getCoordinateAt(0), radious.getCoordinateAt(1)); |
||
332 | double dRadious = _center.distance(_radious);
|
||
333 | setPoints(center, dRadious); |
||
334 | } |
||
335 | |||
336 | /*
|
||
337 | * (non-Javadoc)
|
||
338 | * @see org.gvsig.fmap.geom.primitive.Circle#setPoints(org.gvsig.fmap.geom.primitive.Point, double)
|
||
339 | */
|
||
340 | public void setPoints(Point center, double radious){ |
||
341 | Point2D _center = new java.awt.geom.Point2D.Double(center.getCoordinateAt(0), center.getCoordinateAt(1)); |
||
342 | java.awt.geom.Arc2D.Double arc = |
||
343 | new java.awt.geom.Arc2D.Double(center.getX() - radious, _center
|
||
344 | .getY() |
||
345 | - radious, 2 * radious, 2 * radious, 0, 360, Arc2D.OPEN); |
||
346 | this.gp = new GeneralPathX(arc.getPathIterator(null)); |
||
347 | gp.closePath(); |
||
348 | this.center = _center;
|
||
349 | this.radio = radious;
|
||
350 | } |
||
351 | |||
352 | /* (non-Javadoc)
|
||
353 | * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(org.gvsig.fmap.geom.primitive.Point, org.gvsig.fmap.geom.primitive.Point, org.gvsig.fmap.geom.primitive.Point)
|
||
354 | */
|
||
355 | public void setPoints(Point p1, Point p2, Point p3) { |
||
356 | Point2D _p1 = new java.awt.geom.Point2D.Double(p1.getCoordinateAt(0), p1.getCoordinateAt(1)); |
||
357 | Point2D _p2 = new java.awt.geom.Point2D.Double(p2.getCoordinateAt(0), p2.getCoordinateAt(1)); |
||
358 | Point2D _p3 = new java.awt.geom.Point2D.Double(p3.getCoordinateAt(0), p3.getCoordinateAt(1)); |
||
359 | setPoints(_p1, _p2, _p3); |
||
360 | } |
||
361 | |||
362 | /* (non-Javadoc)
|
||
363 | * @see org.gvsig.fmap.geom.primitive.Circle#setPoints(org.gvsig.fmap.geom.primitive.Point2D, org.gvsig.fmap.geom.primitive.Point2D)
|
||
364 | */
|
||
365 | public void setPoints(org.gvsig.fmap.geom.primitive.impl.Point2D center, |
||
366 | org.gvsig.fmap.geom.primitive.impl.Point2D radious) { |
||
367 | Point2D _center = new java.awt.geom.Point2D.Double(center.getCoordinateAt(0), center.getCoordinateAt(1)); |
||
368 | Point2D _radious = new java.awt.geom.Point2D.Double(radious.getCoordinateAt(0), radious.getCoordinateAt(1)); |
||
369 | setPoints(_center, _radious); |
||
370 | } |
||
371 | |||
372 | /* (non-Javadoc)
|
||
373 | * @see org.gvsig.fmap.geom.primitive.Circle#setPoints(org.gvsig.fmap.geom.primitive.Point2D, double)
|
||
374 | */
|
||
375 | public void setPoints(Point2D center, |
||
376 | double radious) {
|
||
377 | java.awt.geom.Arc2D.Double arc = |
||
378 | new java.awt.geom.Arc2D.Double(center.getX() - radious, center
|
||
379 | .getY() |
||
380 | - radious, 2 * radious, 2 * radious, 0, 360, Arc2D.OPEN); |
||
381 | this.gp = new GeneralPathX(arc.getPathIterator(null)); |
||
382 | gp.closePath(); |
||
383 | this.center = center;
|
||
384 | this.radio = radious;
|
||
385 | |||
386 | } |
||
387 | |||
388 | /* (non-Javadoc)
|
||
389 | * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(java.awt.geom.Point2D, java.awt.geom.Point2D, java.awt.geom.Point2D)
|
||
390 | */
|
||
391 | public void setPoints(Point2D p1, Point2D p2, Point2D p3) { |
||
392 | Point2D center = UtilFunctions.getCenter(p1, p2, p3);
|
||
393 | if (center != null) { |
||
394 | setPoints(center, p1); |
||
395 | } |
||
396 | } |
||
397 | |||
398 | /* (non-Javadoc)
|
||
399 | * @see org.gvsig.fmap.geom.primitive.Curve#setCoordinateAt(int, int, double)
|
||
400 | */
|
||
401 | public void setCoordinateAt(int index, int dimension, double value) { |
||
402 | throw new UnsupportedOperationException("Use setGeneralPathX"); |
||
403 | } |
||
404 | |||
405 | /* (non-Javadoc)
|
||
406 | * @see org.gvsig.fmap.geom.primitive.Circle#setPoints(java.awt.geom.Point2D, java.awt.geom.Point2D)
|
||
407 | */
|
||
408 | private void setPoints(Point2D center, Point2D radious) { |
||
409 | double radio = center.distance(radious);
|
||
410 | setPoints(center, radio); |
||
411 | } |
||
412 | |||
413 | /* (non-Javadoc)
|
||
414 | * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(org.gvsig.fmap.geom.primitive.Point, double, double, double)
|
||
415 | */
|
||
416 | public void setPoints(Point center, double radius, double initAngle, |
||
417 | double angleExt) {
|
||
418 | throw new UnsupportedOperationException("Use setGeneralPathX"); |
||
419 | } |
||
420 | |||
421 | /* (non-Javadoc)
|
||
422 | * @see org.gvsig.fmap.geom.primitive.Arc#setPoints(java.awt.geom.Point2D, double, double, double)
|
||
423 | */
|
||
424 | private void setPoints(Point2D center, double radius, double initAngle, |
||
425 | double angleExt) {
|
||
426 | throw new UnsupportedOperationException("Use setGeneralPathX"); |
||
427 | } |
||
428 | |||
429 | /* (non-Javadoc)
|
||
430 | * @see org.gvsig.fmap.geom.primitive.Circle#getRadious()
|
||
431 | */
|
||
432 | public double getRadious() { |
||
433 | return radio;
|
||
434 | } |
||
435 | |||
436 | |||
437 | } |