root / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / core / FEllipse2D.java @ 7000
History | View | Annotate | Download (11 KB)
1 | 3783 | caballero | /* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
|
---|---|---|---|
2 | *
|
||
3 | * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
|
||
4 | *
|
||
5 | * This program is free software; you can redistribute it and/or
|
||
6 | * modify it under the terms of the GNU General Public License
|
||
7 | * as published by the Free Software Foundation; either version 2
|
||
8 | * of the License, or (at your option) any later version.
|
||
9 | *
|
||
10 | * This program is distributed in the hope that it will be useful,
|
||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
13 | * GNU General Public License for more details.
|
||
14 | *
|
||
15 | * You should have received a copy of the GNU General Public License
|
||
16 | * along with this program; if not, write to the Free Software
|
||
17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
|
||
18 | *
|
||
19 | * For more information, contact:
|
||
20 | *
|
||
21 | * Generalitat Valenciana
|
||
22 | * Conselleria d'Infraestructures i Transport
|
||
23 | * Av. Blasco Ib??ez, 50
|
||
24 | * 46010 VALENCIA
|
||
25 | * SPAIN
|
||
26 | *
|
||
27 | * +34 963862235
|
||
28 | * gvsig@gva.es
|
||
29 | * www.gvsig.gva.es
|
||
30 | *
|
||
31 | * or
|
||
32 | *
|
||
33 | * IVER T.I. S.A
|
||
34 | * Salamanca 50
|
||
35 | * 46005 Valencia
|
||
36 | * Spain
|
||
37 | *
|
||
38 | * +34 963163400
|
||
39 | * dac@iver.es
|
||
40 | */
|
||
41 | package com.iver.cit.gvsig.fmap.core; |
||
42 | |||
43 | import java.awt.geom.AffineTransform; |
||
44 | import java.awt.geom.Arc2D; |
||
45 | 5880 | fjp | import java.awt.geom.Line2D; |
46 | 3783 | caballero | import java.awt.geom.Point2D; |
47 | import java.awt.geom.Rectangle2D; |
||
48 | 5880 | fjp | |
49 | 3783 | caballero | import java.util.ArrayList; |
50 | |||
51 | import com.iver.cit.gvsig.fmap.edition.UtilFunctions; |
||
52 | |||
53 | |||
54 | /**
|
||
55 | * DOCUMENT ME!
|
||
56 | *
|
||
57 | * @author Vicente Caballero Navarro
|
||
58 | */
|
||
59 | 6013 | fjp | public class FEllipse2D extends FPolygon2D { |
60 | 3783 | caballero | private Point2D init; |
61 | private Point2D end; |
||
62 | private double ydist; |
||
63 | /**
|
||
64 | * DOCUMENT ME!
|
||
65 | *
|
||
66 | * @param gpx
|
||
67 | */
|
||
68 | public FEllipse2D(GeneralPathX gpx,Point2D i,Point2D e,double d) { |
||
69 | super(gpx);
|
||
70 | init=i; |
||
71 | end=e; |
||
72 | ydist=d; |
||
73 | } |
||
74 | |||
75 | public Point2D getInit(){ |
||
76 | return init;
|
||
77 | } |
||
78 | public Point2D getEnd(){ |
||
79 | return end;
|
||
80 | } |
||
81 | public double getDist(){ |
||
82 | return ydist;
|
||
83 | } |
||
84 | /* (non-Javadoc)
|
||
85 | * @see com.iver.cit.gvsig.fmap.core.FShape#cloneFShape()
|
||
86 | */
|
||
87 | public FShape cloneFShape() {
|
||
88 | return new FEllipse2D((GeneralPathX) gp.clone(),init,end,ydist); |
||
89 | } |
||
90 | /**
|
||
91 | * @see com.iver.cit.gvsig.fmap.core.FShape#getShapeType()
|
||
92 | */
|
||
93 | public int getShapeType() { |
||
94 | return FShape.ELLIPSE;
|
||
95 | } |
||
96 | /**
|
||
97 | * DOCUMENT ME!
|
||
98 | *
|
||
99 | * @param at DOCUMENT ME!
|
||
100 | */
|
||
101 | public void transform(AffineTransform at) { |
||
102 | Point2D center=new Point2D.Double((init.getX() + end.getX()) / 2, |
||
103 | (init.getY() + end.getY()) / 2);
|
||
104 | Point2D pdist=UtilFunctions.getPerpendicularPoint(init,end,center,ydist);
|
||
105 | Point2D aux1=new Point2D.Double(); |
||
106 | at.transform(init,aux1); |
||
107 | init=aux1; |
||
108 | Point2D aux2=new Point2D.Double(); |
||
109 | at.transform(end,aux2); |
||
110 | end=aux2; |
||
111 | |||
112 | center=new Point2D.Double((init.getX() + end.getX()) / 2, |
||
113 | (init.getY() + end.getY()) / 2);
|
||
114 | |||
115 | Point2D aux3=new Point2D.Double(); |
||
116 | at.transform(pdist,aux3); |
||
117 | ydist=center.distance(aux3); |
||
118 | gp.transform(at); |
||
119 | } |
||
120 | /**
|
||
121 | * DOCUMENT ME!
|
||
122 | *
|
||
123 | * @return DOCUMENT ME!
|
||
124 | */
|
||
125 | 3885 | caballero | public Handler[] getStretchingHandlers() { |
126 | 3783 | caballero | ArrayList handlers = new ArrayList(); |
127 | Rectangle2D rect = this.getBounds2D(); |
||
128 | handlers.add(new CenterHandler(0, rect.getCenterX(), rect.getCenterY())); |
||
129 | return (Handler[]) handlers.toArray(new Handler[0]); |
||
130 | } |
||
131 | public Handler[] getSelectHandlers() { |
||
132 | ArrayList handlers = new ArrayList(); |
||
133 | Rectangle2D rect = this.getBounds2D(); |
||
134 | handlers.add(new CenterSelHandler(0, rect.getCenterX(), rect.getCenterY())); |
||
135 | handlers.add(new InitSelHandler(1, init.getX(), init.getY())); |
||
136 | handlers.add(new EndSelHandler(2, end.getX(), end.getY())); |
||
137 | Point2D mediop = new Point2D.Double((end.getX() + init.getX()) / 2, |
||
138 | (end.getY() + init.getY()) / 2);
|
||
139 | 3885 | caballero | Point2D[] p=UtilFunctions.getPerpendicular(init,end,mediop); |
140 | Point2D u=UtilFunctions.getPoint(mediop,p[1],ydist); |
||
141 | Point2D d=UtilFunctions.getPoint(mediop,p[1],-ydist); |
||
142 | 3783 | caballero | |
143 | handlers.add(new RadioSelYHandler(3, u.getX(), u.getY())); |
||
144 | handlers.add(new RadioSelYHandler(4, d.getX(), d.getY())); |
||
145 | |||
146 | return (Handler[]) handlers.toArray(new Handler[0]); |
||
147 | } |
||
148 | 3885 | caballero | |
149 | 3783 | caballero | /**
|
150 | * DOCUMENT ME!
|
||
151 | *
|
||
152 | * @author Vicente Caballero Navarro
|
||
153 | */
|
||
154 | 3885 | caballero | class CenterHandler extends AbstractHandler { |
155 | 3783 | caballero | /**
|
156 | * Crea un nuevo PointHandler.
|
||
157 | *
|
||
158 | * @param i DOCUMENT ME!
|
||
159 | * @param x DOCUMENT ME!
|
||
160 | * @param y DOCUMENT ME!
|
||
161 | */
|
||
162 | 3885 | caballero | public CenterHandler(int i, double x, double y) { |
163 | 3783 | caballero | point = new Point2D.Double(x, y); |
164 | index = i; |
||
165 | } |
||
166 | 3885 | caballero | |
167 | 3783 | caballero | /**
|
168 | * DOCUMENT ME!
|
||
169 | *
|
||
170 | * @param x DOCUMENT ME!
|
||
171 | * @param y DOCUMENT ME!
|
||
172 | *
|
||
173 | * @return DOCUMENT ME!
|
||
174 | */
|
||
175 | 3885 | caballero | public void move(double x, double y) { |
176 | 3783 | caballero | for (int i=0;i<gp.numCoords/2;i++){ |
177 | gp.pointCoords[i*2]+=x;
|
||
178 | gp.pointCoords[i*2+1]+=y; |
||
179 | } |
||
180 | init = new Point2D.Double(init.getX() + x, init.getY() + y); |
||
181 | end = new Point2D.Double(end.getX() + x, end.getY() + y); |
||
182 | } |
||
183 | 3885 | caballero | |
184 | 3783 | caballero | /**
|
185 | * @see com.iver.cit.gvsig.fmap.core.Handler#set(double, double)
|
||
186 | */
|
||
187 | 3885 | caballero | public void set(double x, double y) { |
188 | 3783 | caballero | } |
189 | 3885 | caballero | } |
190 | 3783 | caballero | /**
|
191 | * DOCUMENT ME!
|
||
192 | *
|
||
193 | * @author Vicente Caballero Navarro
|
||
194 | */
|
||
195 | 3885 | caballero | class CenterSelHandler extends AbstractHandler { |
196 | 3783 | caballero | /**
|
197 | * Crea un nuevo PointHandler.
|
||
198 | *
|
||
199 | * @param i DOCUMENT ME!
|
||
200 | * @param x DOCUMENT ME!
|
||
201 | * @param y DOCUMENT ME!
|
||
202 | */
|
||
203 | 3885 | caballero | public CenterSelHandler(int i, double x, double y) { |
204 | 3783 | caballero | point = new Point2D.Double(x, y); |
205 | index = i; |
||
206 | } |
||
207 | 3885 | caballero | |
208 | 3783 | caballero | /**
|
209 | * DOCUMENT ME!
|
||
210 | *
|
||
211 | * @param x DOCUMENT ME!
|
||
212 | * @param y DOCUMENT ME!
|
||
213 | *
|
||
214 | * @return DOCUMENT ME!
|
||
215 | */
|
||
216 | 3885 | caballero | public void move(double x, double y) { |
217 | 3783 | caballero | for (int i=0;i<gp.numCoords/2;i++){ |
218 | gp.pointCoords[i*2]+=x;
|
||
219 | gp.pointCoords[i*2+1]+=y; |
||
220 | } |
||
221 | } |
||
222 | 3885 | caballero | |
223 | 3783 | caballero | /**
|
224 | * @see com.iver.cit.gvsig.fmap.core.Handler#set(double, double)
|
||
225 | */
|
||
226 | 3885 | caballero | public void set(double x, double y) { |
227 | 3783 | caballero | Point2D center=new Point2D.Double((init.getX() + end.getX()) / 2, |
228 | (init.getY() + end.getY()) / 2);
|
||
229 | double dx=x-center.getX();
|
||
230 | double dy=y-center.getY();
|
||
231 | for (int i=0;i<gp.numCoords/2;i++){ |
||
232 | gp.pointCoords[i*2]+=dx;
|
||
233 | gp.pointCoords[i*2+1]+=dy; |
||
234 | } |
||
235 | init=new Point2D.Double(init.getX()+dx,init.getY()+dy); |
||
236 | end=new Point2D.Double(end.getX()+dx,end.getY()+dy); |
||
237 | } |
||
238 | } |
||
239 | 3885 | caballero | |
240 | 3783 | caballero | /**
|
241 | * DOCUMENT ME!
|
||
242 | *
|
||
243 | * @author Vicente Caballero Navarro
|
||
244 | */
|
||
245 | 3885 | caballero | class InitSelHandler extends AbstractHandler { |
246 | 3783 | caballero | /**
|
247 | * Crea un nuevo PointHandler.
|
||
248 | *
|
||
249 | * @param i DOCUMENT ME!
|
||
250 | * @param x DOCUMENT ME!
|
||
251 | * @param y DOCUMENT ME!
|
||
252 | */
|
||
253 | 3885 | caballero | public InitSelHandler(int i, double x, double y) { |
254 | 3783 | caballero | point = new Point2D.Double(x, y); |
255 | index = i; |
||
256 | } |
||
257 | 3885 | caballero | |
258 | 3783 | caballero | /**
|
259 | * DOCUMENT ME!
|
||
260 | *
|
||
261 | * @param x DOCUMENT ME!
|
||
262 | * @param y DOCUMENT ME!
|
||
263 | *
|
||
264 | * @return DOCUMENT ME!
|
||
265 | */
|
||
266 | 3885 | caballero | public void move(double x, double y) { |
267 | 3783 | caballero | |
268 | } |
||
269 | 3885 | caballero | |
270 | 3783 | caballero | /**
|
271 | * @see com.iver.cit.gvsig.fmap.core.Handler#set(double, double)
|
||
272 | */
|
||
273 | 3885 | caballero | public void set(double x, double y) { |
274 | 3783 | caballero | double dx=x-init.getX();
|
275 | double dy=y-init.getY();
|
||
276 | Point2D center=new Point2D.Double((init.getX() + end.getX()) / 2, |
||
277 | (init.getY() + end.getY()) / 2);
|
||
278 | // Point2D[] p1=TrigonometricalFunctions.getPerpendicular(init,end,center);
|
||
279 | // Point2D[] p2=TrigonometricalFunctions.getPerpendicular(p1[0],p1[1],new Point2D.Double(x,y));
|
||
280 | |||
281 | // Point2D pl=TrigonometricalFunctions.getIntersection(p2[0],p2[1],p1[0],p1[1]);
|
||
282 | // double xdist=2*pl.distance(x,y);
|
||
283 | double xdist=2*center.distance(x,y); |
||
284 | //init=new Point2D.Double(init.getX()+dx,init.getY()+dy);
|
||
285 | 3885 | caballero | init=UtilFunctions.getPoint(center,init,center.distance(x,y)); |
286 | end=UtilFunctions.getPoint(init,center,xdist); |
||
287 | 3783 | caballero | Arc2D.Double arc = new Arc2D.Double(init.getX(), |
288 | init.getY() - ydist, xdist, 2 * ydist, 0, 360, Arc2D.OPEN); |
||
289 | Point2D rotationPoint = new Point2D.Double(init.getX() + xdist /2, init.getY()); |
||
290 | |||
291 | 3885 | caballero | double angle = UtilFunctions.getAngle(init, end);
|
292 | 3783 | caballero | AffineTransform mT = AffineTransform.getRotateInstance(angle, init.getX(), init.getY()); |
293 | gp = new GeneralPathX(arc);
|
||
294 | gp.transform(mT); |
||
295 | |||
296 | } |
||
297 | 3885 | caballero | } |
298 | 3783 | caballero | /**
|
299 | * DOCUMENT ME!
|
||
300 | *
|
||
301 | * @author Vicente Caballero Navarro
|
||
302 | */
|
||
303 | 3885 | caballero | class EndSelHandler extends AbstractHandler { |
304 | 3783 | caballero | /**
|
305 | * Crea un nuevo PointHandler.
|
||
306 | *
|
||
307 | * @param i DOCUMENT ME!
|
||
308 | * @param x DOCUMENT ME!
|
||
309 | * @param y DOCUMENT ME!
|
||
310 | */
|
||
311 | 3885 | caballero | public EndSelHandler(int i, double x, double y) { |
312 | 3783 | caballero | point = new Point2D.Double(x, y); |
313 | index = i; |
||
314 | } |
||
315 | 3885 | caballero | |
316 | 3783 | caballero | /**
|
317 | * DOCUMENT ME!
|
||
318 | *
|
||
319 | * @param x DOCUMENT ME!
|
||
320 | * @param y DOCUMENT ME!
|
||
321 | *
|
||
322 | * @return DOCUMENT ME!
|
||
323 | */
|
||
324 | 3885 | caballero | public void move(double x, double y) { |
325 | 3783 | caballero | |
326 | } |
||
327 | 3885 | caballero | |
328 | 3783 | caballero | /**
|
329 | * @see com.iver.cit.gvsig.fmap.core.Handler#set(double, double)
|
||
330 | */
|
||
331 | 3885 | caballero | public void set(double x, double y) { |
332 | 3783 | caballero | double dx=x-getPoint().getX();
|
333 | double dy=y-getPoint().getY();
|
||
334 | Point2D center=new Point2D.Double((init.getX() + end.getX()) / 2, |
||
335 | (init.getY() + end.getY()) / 2);
|
||
336 | // Point2D[] p1=TrigonometricalFunctions.getPerpendicular(init,end,center);
|
||
337 | // Point2D[] p2=TrigonometricalFunctions.getPerpendicular(p1[0],p1[1],new Point2D.Double(x,y));
|
||
338 | |||
339 | // Point2D pl=TrigonometricalFunctions.getIntersection(p2[0],p2[1],p1[0],p1[1]);
|
||
340 | // double xdist=2*pl.distance(x,y);
|
||
341 | double xdist=2*center.distance(x,y); |
||
342 | 3885 | caballero | end=UtilFunctions.getPoint(center,end,center.distance(x,y)); |
343 | 3783 | caballero | //end=new Point2D.Double(end.getX()+dx,end.getY()+dy);
|
344 | 3885 | caballero | init=UtilFunctions.getPoint(end,center,xdist); |
345 | 3783 | caballero | Arc2D.Double arc = new Arc2D.Double(init.getX(), |
346 | init.getY() - ydist, xdist, 2 * ydist, 0, 360, Arc2D.OPEN); |
||
347 | Point2D rotationPoint = new Point2D.Double(init.getX() + xdist /2, init.getY()); |
||
348 | |||
349 | 3885 | caballero | double angle = UtilFunctions.getAngle(init, end);
|
350 | 3783 | caballero | AffineTransform mT = AffineTransform.getRotateInstance(angle, init.getX(), init.getY()); |
351 | gp = new GeneralPathX(arc);
|
||
352 | gp.transform(mT); |
||
353 | |||
354 | } |
||
355 | 3885 | caballero | } |
356 | 3783 | caballero | /**
|
357 | * DOCUMENT ME!
|
||
358 | *
|
||
359 | * @author Vicente Caballero Navarro
|
||
360 | */
|
||
361 | 3885 | caballero | class RadioSelYHandler extends AbstractHandler { |
362 | 3783 | caballero | /**
|
363 | * Crea un nuevo PointHandler.
|
||
364 | *
|
||
365 | * @param i DOCUMENT ME!
|
||
366 | * @param x DOCUMENT ME!
|
||
367 | * @param y DOCUMENT ME!
|
||
368 | */
|
||
369 | 3885 | caballero | public RadioSelYHandler(int i, double x, double y) { |
370 | 3783 | caballero | point = new Point2D.Double(x, y); |
371 | index = i; |
||
372 | } |
||
373 | 3885 | caballero | |
374 | 3783 | caballero | /**
|
375 | * DOCUMENT ME!
|
||
376 | *
|
||
377 | * @param x DOCUMENT ME!
|
||
378 | * @param y DOCUMENT ME!
|
||
379 | *
|
||
380 | * @return DOCUMENT ME!
|
||
381 | */
|
||
382 | 3885 | caballero | public void move(double x, double y) { |
383 | 3783 | caballero | |
384 | } |
||
385 | 3885 | caballero | |
386 | 3783 | caballero | /**
|
387 | * @see com.iver.cit.gvsig.fmap.core.Handler#set(double, double)
|
||
388 | */
|
||
389 | 3885 | caballero | public void set(double x, double y) { |
390 | 3783 | caballero | ydist=new Point2D.Double((init.getX() + end.getX()) / 2, |
391 | (init.getY() + end.getY()) / 2).distance(x,y);
|
||
392 | //ydist=getSelectHandlers()[1].getPoint().distance(x,y);
|
||
393 | // Point2D center=new Point2D.Double((init.getX() + end.getX()) / 2,
|
||
394 | // (init.getY() + end.getY()) / 2);
|
||
395 | // Point2D[] p=TrigonometricalFunctions.getPerpendicular(init,end,new Point2D.Double(x,y));
|
||
396 | // Point2D pl=TrigonometricalFunctions.getIntersection(p[0],p[1],init,end);
|
||
397 | // double xdist=2*pl.distance(x,y);
|
||
398 | double xdist = init.distance(end);
|
||
399 | Arc2D.Double arc = new Arc2D.Double(init.getX(), |
||
400 | init.getY() - ydist, xdist, 2 * ydist, 0, 360, Arc2D.OPEN); |
||
401 | Point2D rotationPoint = new Point2D.Double(init.getX() + xdist /2, init.getY()); |
||
402 | |||
403 | 3885 | caballero | double angle = UtilFunctions.getAngle(init, end);
|
404 | 3783 | caballero | AffineTransform mT = AffineTransform.getRotateInstance(angle, init.getX(), init.getY()); |
405 | gp = new GeneralPathX(arc);
|
||
406 | gp.transform(mT); |
||
407 | 5880 | fjp | } |
408 | 3885 | caballero | } |
409 | 5880 | fjp | |
410 | 4475 | fjp | /* (non-Javadoc)
|
411 | * @see com.iver.cit.gvsig.fmap.core.FPolyline2D#intersects(java.awt.geom.Rectangle2D)
|
||
412 | */
|
||
413 | public boolean intersects(Rectangle2D r) { |
||
414 | return gp.intersects(r);
|
||
415 | } |
||
416 | |||
417 | 3783 | caballero | } |