Revision 42283 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.geometry/org.gvsig.fmap.geometry.jts/src/main/java/org/gvsig/fmap/geom/jts/aggregate/AbstractMultiSurface.java

View differences:

AbstractMultiSurface.java
22 22
 */
23 23
package org.gvsig.fmap.geom.jts.aggregate;
24 24

  
25

  
26
import java.awt.Shape;
27
import java.awt.geom.AffineTransform;
28
import java.awt.geom.PathIterator;
29
import java.util.ArrayList;
30
import java.util.Iterator;
31
import java.util.List;
32

  
25 33
import org.gvsig.fmap.geom.Geometry;
26 34
import org.gvsig.fmap.geom.aggregate.MultiSurface;
35
import org.gvsig.fmap.geom.jts.gputils.DefaultGeneralPathX;
36
import org.gvsig.fmap.geom.jts.gputils.GeneralPathXIterator;
37
import org.gvsig.fmap.geom.primitive.GeneralPathX;
38
import org.gvsig.fmap.geom.primitive.Primitive;
27 39
import org.gvsig.fmap.geom.primitive.Surface;
28 40

  
29 41

  
......
41 53
    /**
42 54
     * @param type
43 55
     */
56
    public AbstractMultiSurface(int type, int subtype) {
57
        super(type, subtype);
58
    }
59

  
60
    /**
61
     * @param type
62
     */
44 63
    public AbstractMultiSurface(int subtype) {
45 64
        super(Geometry.TYPES.MULTISURFACE, subtype);
46 65
    }
47 66

  
48 67
    /* (non-Javadoc)
49
     * @see org.gvsig.fmap.geom.aggregate.MultiSurface#addSurface(org.gvsig.fmap.geom.primitive.Surface)
68
     * @see org.gvsig.fmap.geom.aggregate.MultiSurface#getSurfaceAt(int)
50 69
     */
51
    public void addSurface(Surface surface) {
52
        primitives.add(fixPrimitive(surface));
70
    public Surface getSurfaceAt(int index) {
71
        return (Surface)getPrimitiveAt(index);
72
    }
53 73

  
74

  
75
    /* (non-Javadoc)
76
     * @see org.gvsig.fmap.geom.Geometry#getShape(java.awt.geom.AffineTransform)
77
     */
78
    public Shape getShape(AffineTransform affineTransform) {
79
        return new DefaultGeneralPathX(getPathIterator(affineTransform),false,0);
54 80
    }
55 81

  
56 82
    /* (non-Javadoc)
57
     * @see org.gvsig.fmap.geom.aggregate.MultiSurface#getSurfaceAt(int)
83
     * @see org.gvsig.fmap.geom.Geometry#getShape()
58 84
     */
59
    public Surface getSurfaceAt(int index) {
60
        return (Surface)getPrimitiveAt(index);
85
    public Shape getShape() {
86
        return getShape(null);
61 87
    }
88

  
89
    /* (non-Javadoc)
90
     * @see org.gvsig.fmap.geom.Geometry#getPathIterator(java.awt.geom.AffineTransform)
91
     */
92
    public PathIterator getPathIterator(AffineTransform at) {
93
        MultiSurfaceIterator pi = new MultiSurfaceIterator(at);
94
        return pi;
95
    }
96

  
97
    /* (non-Javadoc)
98
     * @see org.gvsig.fmap.geom.Geometry#getPathIterator(java.awt.geom.AffineTransform, double)
99
     */
100
    public PathIterator getPathIterator(AffineTransform at, double flatness) {
101
        return getPathIterator(at);
102
    }
103

  
104
    /* (non-Javadoc)
105
     * @see org.gvsig.fmap.geom.Geometry#getGeneralPath()
106
     */
107
    public GeneralPathX getGeneralPath() {
108
        return new DefaultGeneralPathX(getPathIterator(null), false, 0);
109
    }
110

  
111

  
112
    protected class MultiSurfaceIterator extends GeneralPathXIterator {
113

  
114
        /** Transform applied on the coordinates during iteration */
115
        private AffineTransform at;
116

  
117
        /** True when the point has been read once */
118
        private boolean done;
119
        private int index = 0;
120
        private List<PathIterator>iterators = new ArrayList<PathIterator>(primitives.size());
121

  
122
        /**
123
         * Creates a new PointIterator object.
124
         *
125
         * @param p
126
         *            The polygon
127
         * @param at
128
         *            The affine transform applied to coordinates during
129
         *            iteration
130
         */
131
        public MultiSurfaceIterator(AffineTransform at) {
132
            super(new GeneralPathX());
133
            if (at == null) {
134
                at = new AffineTransform();
135
            }
136

  
137
            this.at = at;
138
            for (Iterator iterator = primitives.iterator(); iterator.hasNext();) {
139
                Primitive primitive = (Primitive) iterator.next();
140
                iterators.add(primitive.getPathIterator(at));
141
            }
142
            done = false;
143
        }
144

  
145
        /**
146
         * Return the winding rule for determining the interior of the path.
147
         *
148
         * @return <code>WIND_EVEN_ODD</code> by default.
149
         */
150
        public int getWindingRule() {
151
            return PathIterator.WIND_EVEN_ODD;
152
        }
153

  
154
        /**
155
         * @see java.awt.geom.PathIterator#next()
156
         */
157
        public void next() {
158
            PathIterator pathIteratorPrimitive = iterators.get(index);
159
            pathIteratorPrimitive.next();
160
            if(pathIteratorPrimitive.isDone()){
161
                index++;
162
                done = (index==primitives.size());
163
            }
164
        }
165

  
166
        /**
167
         * @see java.awt.geom.PathIterator#isDone()
168
         */
169
        public boolean isDone() {
170
            return done;
171
        }
172

  
173
        /**
174
         * @see java.awt.geom.PathIterator#currentSegment(double[])
175
         */
176
        public int currentSegment(double[] coords) {
177
            return iterators.get(index).currentSegment(coords);
178
        }
179

  
180
        /*
181
         * (non-Javadoc)
182
         *
183
         * @see java.awt.geom.PathIterator#currentSegment(float[])
184
         */
185
        public int currentSegment(float[] coords) {
186
            return iterators.get(index).currentSegment(coords);
187
        }
188
    }
189

  
62 190
}

Also available in: Unified diff