Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / core / FPolyline2D.java @ 4835

History | View | Annotate | Download (10.1 KB)

1 1100 fjp
/* 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 262 fjp
package com.iver.cit.gvsig.fmap.core;
42
43 2196 vcaballero
import org.cresques.cts.ICoordTrans;
44
45 2859 fjp
import com.iver.cit.gvsig.fmap.core.v02.FConverter;
46
47 305 fjp
import java.awt.Rectangle;
48
import java.awt.geom.AffineTransform;
49 2183 fernando
import java.awt.geom.PathIterator;
50 2196 vcaballero
import java.awt.geom.Line2D;
51 305 fjp
import java.awt.geom.Point2D;
52 267 fjp
import java.awt.geom.Rectangle2D;
53 1132 vcaballero
import java.util.ArrayList;
54 885 fjp
55 262 fjp
56 885 fjp
/**
57
 * DOCUMENT ME!
58
 *
59
 * @author Fernando Gonz?lez Cort?s
60
 */
61 2196 vcaballero
public class FPolyline2D implements FShape {
62 262 fjp
        protected GeneralPathX gp;
63 885 fjp
        /**
64
         * Crea un nuevo FPolyline2D.
65
         *
66 1005 vcaballero
         * @param gpx GeneralPathX.
67 885 fjp
         */
68 266 fjp
        public FPolyline2D(GeneralPathX gpx) {
69 262 fjp
                gp = gpx;
70
        }
71
72 305 fjp
        /* (non-Javadoc)
73
         * @see java.awt.Shape#contains(double, double)
74 262 fjp
         */
75 305 fjp
        public boolean contains(double x, double y) {
76 885 fjp
                return gp.contains(x, y);
77 262 fjp
        }
78
79 305 fjp
        /* (non-Javadoc)
80
         * @see java.awt.Shape#contains(double, double, double, double)
81
         */
82
        public boolean contains(double x, double y, double w, double h) {
83 885 fjp
                return gp.contains(x, y, w, h);
84 305 fjp
        }
85 262 fjp
86 305 fjp
        /* (non-Javadoc)
87
         * @see java.awt.Shape#intersects(double, double, double, double)
88
         */
89
        public boolean intersects(double x, double y, double w, double h) {
90 1298 fjp
            // M?s r?pido
91 885 fjp
                return gp.intersects(x, y, w, h);
92 305 fjp
        }
93 262 fjp
94 305 fjp
        /* (non-Javadoc)
95
         * @see java.awt.Shape#getBounds()
96 262 fjp
         */
97 305 fjp
        public Rectangle getBounds() {
98
                return gp.getBounds();
99 262 fjp
        }
100
101 305 fjp
        /* (non-Javadoc)
102
         * @see java.awt.Shape#contains(java.awt.geom.Point2D)
103 262 fjp
         */
104 305 fjp
        public boolean contains(Point2D p) {
105
                return gp.contains(p);
106 262 fjp
        }
107
108 267 fjp
        /* (non-Javadoc)
109 305 fjp
         * @see java.awt.Shape#getBounds2D()
110 267 fjp
         */
111 305 fjp
        public Rectangle2D getBounds2D() {
112
                return gp.getBounds2D();
113
        }
114
115
        /* (non-Javadoc)
116
         * @see java.awt.Shape#contains(java.awt.geom.Rectangle2D)
117
         */
118
        public boolean contains(Rectangle2D r) {
119
                return gp.contains(r);
120
        }
121
122 790 jmorell
        /**
123 885 fjp
         * El m?todo intersects de java.awt.Shape que define la intersecci?n entre
124
         * una polil?nea y un Rectangle2D considera la polil?nea como un Shape
125
         * gen?rico y se producen errores en la selecci?n de polil?neas. Por este
126
         * motivo se ha modificado este m?todo intersect() de FPolyline2D para que
127
         * realize la intersecci?n estricta entre el Rectangle2D y la polil?nea en
128
         * cuesti?n. El precio es un incremento de tiempo m?ximo del 50%.
129
         *
130 1005 vcaballero
         * @param r Rect?ngulo.
131 885 fjp
         *
132 1005 vcaballero
         * @return True si intersecta con el rectangulo que se pasa como par?metro.
133 305 fjp
         */
134 267 fjp
        public boolean intersects(Rectangle2D r) {
135 1296 jmorell
                //return gp.intersects(r);
136 1298 fjp
            // M?s exacto
137 1296 jmorell
                boolean bool = false;
138 885 fjp
                   if (gp.intersects(r)) {
139
                           ArrayList arrayCoords;
140
                           int theType;
141
                           //Use this array to store segment coordinate data
142
                           double[] theData = new double[6];
143
                           PathIterator theIterator;
144 3833 caballero
145 885 fjp
                       Point2D p1 = new Point2D.Double(r.getMinX(),r.getMinY());
146
                       Point2D p2 = new Point2D.Double(r.getMinX(),r.getMaxY());
147
                       Point2D p3 = new Point2D.Double(r.getMaxX(),r.getMaxY());
148
                       Point2D p4 = new Point2D.Double(r.getMaxX(),r.getMinY());
149
                       Line2D l1 = new Line2D.Double(p1,p2);
150
                       Line2D l2 = new Line2D.Double(p2,p3);
151
                       Line2D l3 = new Line2D.Double(p3,p4);
152
                       Line2D l4 = new Line2D.Double(p4,p1);
153 3833 caballero
154 885 fjp
                           theIterator = this.getPathIterator(null);
155
                           arrayCoords = new ArrayList();
156
                            while(!theIterator.isDone()) {
157
                                    theType = theIterator.currentSegment(theData);
158
                           if (theType==PathIterator.SEG_MOVETO) {
159
                                    arrayCoords.add(new Point2D.Double(theData[0], theData[1]));
160
                           } else if (theType==PathIterator.SEG_LINETO) {
161
                                   arrayCoords.add(new Point2D.Double(theData[0], theData[1]));
162
                                   Point2D pAnt = (Point2D)arrayCoords.get(arrayCoords.size()-2);
163
                                   Line2D l = new Line2D.Double(pAnt.getX(),pAnt.getY(),theData[0],theData[1]);
164
                                   if (l.intersectsLine(l1.getX1(),l1.getY1(),l1.getX2(),l1.getY2())
165
                                                   || l.intersectsLine(l2.getX1(),l2.getY1(),l2.getX2(),l2.getY2())
166
                                                   || l.intersectsLine(l3.getX1(),l3.getY1(),l3.getX2(),l3.getY2())
167
                                                   || l.intersectsLine(l4.getX1(),l4.getY1(),l4.getX2(),l4.getY2())
168
                                                   || r.intersectsLine(l)) {
169
                                           bool = true;
170
                                   }
171
                           } else {
172
                                    System.out.println("Not supported here");
173
                           }
174
                                theIterator.next();
175
                            }
176
                   }
177 1296 jmorell
                   return bool;
178 267 fjp
        }
179
180
        /* (non-Javadoc)
181 305 fjp
         * @see java.awt.Shape#getPathIterator(java.awt.geom.AffineTransform)
182 267 fjp
         */
183 305 fjp
        public PathIterator getPathIterator(AffineTransform at) {
184
                return gp.getPathIterator(at);
185 267 fjp
        }
186
187 305 fjp
        /* (non-Javadoc)
188
         * @see java.awt.Shape#getPathIterator(java.awt.geom.AffineTransform, double)
189
         */
190
        public PathIterator getPathIterator(AffineTransform at, double flatness) {
191 885 fjp
                return gp.getPathIterator(at, flatness);
192 305 fjp
        }
193
194 885 fjp
        /**
195
         * DOCUMENT ME!
196
         *
197
         * @param at DOCUMENT ME!
198
         */
199
        public void transform(AffineTransform at) {
200 3833 caballero
201 2859 fjp
        // TODO: PRUEBA. BORRAR ESTA LINEA
202
        // gp = FConverter.transformToInts(gp, at);
203 3833 caballero
204 305 fjp
                gp.transform(at);
205
        }
206
207 324 fernando
        /**
208
         * @see com.iver.cit.gvsig.fmap.core.FShape#getShapeType()
209
         */
210
        public int getShapeType() {
211
                return FShape.LINE;
212
        }
213
214 703 fjp
        /* (non-Javadoc)
215
         * @see com.iver.cit.gvsig.fmap.core.FShape#cloneFShape()
216
         */
217
        public FShape cloneFShape() {
218
                return new FPolyline2D((GeneralPathX) gp.clone());
219
        }
220
221 885 fjp
        /* (non-Javadoc)
222
         * @see com.iver.cit.gvsig.fmap.core.FShape#reProject(org.cresques.cts.ICoordTrans)
223
         */
224
        public void reProject(ICoordTrans ct) {
225
                gp.reProject(ct);
226
        }
227 3833 caballero
228
        /* (non-Javadoc)
229
         * @see com.iver.cit.gvsig.fmap.core.FShape#getStretchingHandlers()
230
         */
231
        public Handler[] getStretchingHandlers() {
232
                ArrayList handlers = new ArrayList();
233
                GeneralPathXIterator gpi = null;
234
                gpi = (GeneralPathXIterator) getPathIterator(null);
235
236
                double[] theData = new double[6];
237
                int i=0;
238
                while (!gpi.isDone()) {
239
                        int theType = gpi.currentSegment(theData);
240
                        //g.fillRect((int)(theData[0]-3),(int)(theData[1]-3),6,6);
241
                        handlers.add(new PointHandler(i,theData[0], theData[1]));
242
                        i++;
243
                        gpi.next();
244
                }
245
246
                return (Handler[]) handlers.toArray(new Handler[0]);
247
        }
248
249
        /* (non-Javadoc)
250
         * @see com.iver.cit.gvsig.fmap.core.FShape#getSelectHandlers()
251
         */
252
        public Handler[] getSelectHandlers() {
253
                ArrayList handlers = new ArrayList();
254
                GeneralPathXIterator gpi = null;
255
                gpi = (GeneralPathXIterator) getPathIterator(null);
256
257
                double[] theData = new double[6];
258
                int i=0;
259 4120 caballero
                boolean isFirst=true;
260 3833 caballero
                while (!gpi.isDone()) {
261
                        int theType = gpi.currentSegment(theData);
262
                        //g.fillRect((int)(theData[0]-3),(int)(theData[1]-3),6,6);
263 4135 fjp
                        /* if (!(this instanceof FPolygon2D && isFirst)){
264 4120 caballero
                                handlers.add(new PointSelHandler(i,theData[0], theData[1]));
265
                                i++;
266
                        }
267 4135 fjp
                        isFirst=false; */
268
                        switch (theType)
269
                        {
270
                        case GeneralPathXIterator.SEG_MOVETO:
271
                                handlers.add(new PointSelHandler(i++,theData[0], theData[1]));
272
                                break;
273
                        case GeneralPathXIterator.SEG_LINETO:
274
                                handlers.add(new PointSelHandler(i++,theData[0], theData[1]));
275
                                break;
276
                        case GeneralPathXIterator.SEG_CLOSE:
277
                                break;
278
                        case GeneralPathXIterator.SEG_QUADTO:
279
                                handlers.add(new PointSelHandler(i++,theData[0], theData[1]));
280
                                handlers.add(new PointSelHandler(i++,theData[2], theData[3]));
281
                                break;
282
                        case GeneralPathXIterator.SEG_CUBICTO:
283
                                handlers.add(new PointSelHandler(i++,theData[0], theData[1]));
284
                                handlers.add(new PointSelHandler(i++,theData[2], theData[3]));
285
                                handlers.add(new PointSelHandler(i++,theData[4], theData[5]));
286
                                break;
287
288
                        }
289 3833 caballero
                        gpi.next();
290 4120 caballero
291
292 3833 caballero
                }
293
294
                return (Handler[]) handlers.toArray(new Handler[0]);
295
        }
296
        /**
297
         * DOCUMENT ME!
298
         *
299
         * @author Vicente Caballero Navarro
300
         */
301
        class PointHandler extends AbstractHandler {
302
                /**
303
                 * Crea un nuevo PointHandler.
304
                 *
305
                 * @param x DOCUMENT ME!
306
                 * @param y DOCUMENT ME!
307
                 */
308
                public PointHandler(int i,double x, double y) {
309
                        point = new Point2D.Double(x, y);
310
                        index=i;
311
                }
312
313
                /**
314
                 * DOCUMENT ME!
315
                 *
316
                 * @param x DOCUMENT ME!
317
                 * @param y DOCUMENT ME!
318
                 *
319
                 * @return DOCUMENT ME!
320
                 */
321
                public void move(double x, double y) {
322
                        gp.pointCoords[index*2]+=x;
323
                        gp.pointCoords[index*2+1]+=y;
324
                }
325
326
                /**
327
                 * @see com.iver.cit.gvsig.fmap.core.Handler#set(double, double)
328
                 */
329
                public void set(double x, double y) {
330
                        gp.pointCoords[index*2]=x;
331
                        gp.pointCoords[index*2+1]=y;
332
                }
333
        }
334
        /**
335
         * DOCUMENT ME!
336
         *
337
         * @author Vicente Caballero Navarro
338
         */
339
        class PointSelHandler extends AbstractHandler {
340
                /**
341
                 * Crea un nuevo PointHandler.
342
                 *
343
                 * @param x DOCUMENT ME!
344
                 * @param y DOCUMENT ME!
345
                 */
346
                public PointSelHandler(int i,double x, double y) {
347
                        point = new Point2D.Double(x, y);
348
                        index=i;
349
                }
350
351
                /**
352
                 * DOCUMENT ME!
353
                 *
354
                 * @param x DOCUMENT ME!
355
                 * @param y DOCUMENT ME!
356
                 *
357
                 * @return DOCUMENT ME!
358
                 */
359
                public void move(double x, double y) {
360
                        gp.pointCoords[index*2]+=x;
361
                        gp.pointCoords[index*2+1]+=y;
362
                }
363
364
                /**
365
                 * @see com.iver.cit.gvsig.fmap.core.Handler#set(double, double)
366
                 */
367
                public void set(double x, double y) {
368
                        gp.pointCoords[index*2]=x;
369
                        gp.pointCoords[index*2+1]=y;
370
                }
371
        }
372 262 fjp
}