Statistics
| Revision:

gvsig-vectorediting / org.gvsig.vectorediting / trunk / org.gvsig.vectorediting / org.gvsig.vectorediting.lib / org.gvsig.vectorediting.lib.prov / org.gvsig.vectorediting.lib.prov.editvertex / src / main / java / org / gvsig / vectorediting / lib / prov / editvertex / operation / EllipseEditVertexOperation.java @ 2616

History | View | Annotate | Download (6.55 KB)

1
package org.gvsig.vectorediting.lib.prov.editvertex.operation;
2

    
3
import java.util.ArrayList;
4
import java.util.List;
5
import org.gvsig.fmap.geom.Geometry;
6
import org.gvsig.fmap.geom.GeometryLocator;
7
import org.gvsig.fmap.geom.GeometryManager;
8
import org.gvsig.fmap.geom.exception.CreateGeometryException;
9
import org.gvsig.fmap.geom.operation.GeometryOperationException;
10
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
11
import org.gvsig.fmap.geom.primitive.Line;
12
import org.gvsig.fmap.geom.primitive.PeriEllipse;
13
import org.gvsig.fmap.geom.primitive.Point;
14
import org.gvsig.fmap.geom.primitive.Primitive;
15
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
16
import org.gvsig.vectorediting.lib.spi.DefaultDrawingStatus;
17
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
18
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
19

    
20
public class EllipseEditVertexOperation implements EditVertexOperation {
21

    
22
    public EllipseEditVertexOperation() {
23
        // TODO Auto-generated constructor stub
24
    }
25

    
26
    @Override
27
    public Geometry insertVertex(Primitive geom, int index)
28
        throws CreateGeometryException {
29
        return null;
30
    }
31

    
32
    @Override
33
    public Geometry removeVertex(Primitive geom, int index)
34
        throws CreateGeometryException {
35
        return null;
36
    }
37

    
38
    @Override
39
    public Geometry moveVertex(Primitive geom, int index, Point point) throws CreateGeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
40
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
41
        PeriEllipse original = (PeriEllipse)geom;
42
        PeriEllipse result = (PeriEllipse) original.cloneGeometry();
43
        switch (index) {
44
            case 0:
45
                result.setPoints(point, original.getAxis1End(), original.getAxis2Dist());
46
                break;
47
            case 1:
48
                result.setPoints(original.getAxis1Start(), point, original.getAxis2Dist());
49
                break;
50
            case 2:
51
                Point axis1Start = original.getAxis1Start();
52
                Point axis1End = original.getAxis1End();
53
                Point center = geometryManager.createPoint(
54
                        (axis1Start.getX()+axis1End.getX())/2,
55
                        (axis1Start.getY()+axis1End.getY())/2,
56
                        geom.getGeometryType().getSubType());
57
                result.setPoints(original.getAxis1Start(), original.getAxis1End(), center.distance(point));
58
                break;
59
            default:
60
                break;
61
        }
62
        return result;
63
    }
64

    
65
    @Override
66
    public List<Point> getVertexesList(Primitive geom) throws CreateGeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
67
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
68
        ArrayList<Point> vertexList = new ArrayList<>();
69
        PeriEllipse ellipse = (PeriEllipse) geom;
70
        Point axis1Start = ellipse.getAxis1Start();
71
        vertexList.add(axis1Start);
72
        Point axis1End = ellipse.getAxis1End();
73
        vertexList.add(axis1End);
74
        Point center = geometryManager.createPoint(
75
            (axis1Start.getX()+axis1End.getX())/2,
76
            (axis1Start.getY()+axis1End.getY())/2,
77
            geom.getGeometryType().getSubType());
78

    
79
        double angle = getAngle(axis1Start, axis1End);
80

    
81
        vertexList.add(geometryManager.createPoint(
82
            center.getX() + ellipse.getAxis2Dist()*Math.cos(angle+Math.PI/2),
83
            center.getY() + ellipse.getAxis2Dist()*Math.sin(angle+Math.PI/2),
84
            geom.getGeometryType().getSubType()));
85

    
86
        return vertexList;
87
    }
88

    
89
    @Override
90
    public int getNumVertex(Primitive geom) {
91
        return 3;
92
    }
93

    
94
    @Override
95
    public boolean canInsertVertex(Primitive geom, int index) {
96
        return false;
97
    }
98

    
99
    @Override
100
    public boolean canRemoveVertex(Primitive geom, int index) {
101
        return false;
102
    }
103

    
104
    @Override
105
    public boolean canMoveVertex(int index, Point point) {
106
        return true;
107
    }
108

    
109
    public double getAngle(Point start, Point end)
110
        throws GeometryOperationNotSupportedException,
111
        GeometryOperationException {
112
        double angle =
113
            Math.acos((end.getX() - start.getX()) / start.distance(end));
114

    
115
        if (start.getY() > end.getY()) {
116
            angle = -angle;
117
        }
118

    
119
        if (angle < 0) {
120
            angle += (2 * Math.PI);
121
        }
122

    
123
        return angle;
124
    }
125

    
126
    @Override
127
    public void addToDrawingStatus(DefaultDrawingStatus drawingStatus,
128
        Primitive primitive) throws CreateGeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
129
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
130
        EditingProviderManager editingProviderManager =
131
            EditingProviderLocator.getProviderManager();
132
        ISymbol auxiliaryLineSymbolEditing =
133
            editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
134
        ISymbol lineSymbolEditing =
135
            editingProviderManager.getSymbol("line-symbol-editing");
136
        PeriEllipse ellipse = (PeriEllipse)primitive;
137
        Point axis1Start = ellipse.getAxis1Start();
138
        Point axis1End = ellipse.getAxis1End();
139
        Line axis1Line = geometryManager.createLine(primitive.getGeometryType().getSubType());
140
        axis1Line.setPoints(axis1Start,axis1End);
141
        drawingStatus.addStatus(axis1Line, auxiliaryLineSymbolEditing, "");
142

    
143
        Line axis2Line = geometryManager.createLine(primitive.getGeometryType().getSubType());
144

    
145
        Point center = geometryManager.createPoint(
146
            (axis1Start.getX()+axis1End.getX())/2,
147
            (axis1Start.getY()+axis1End.getY())/2,
148
            primitive.getGeometryType().getSubType());
149

    
150
        double angle = getAngle(axis1Start, axis1End);
151

    
152
        Point axis2Point1 = geometryManager.createPoint(
153
        center.getX() + ellipse.getAxis2Dist()*Math.cos(angle+Math.PI/2),
154
        center.getY() + ellipse.getAxis2Dist()*Math.sin(angle+Math.PI/2),
155
        primitive.getGeometryType().getSubType());
156

    
157
        Point axis2Point2 = geometryManager.createPoint(
158
        center.getX() - ellipse.getAxis2Dist()*Math.cos(angle+Math.PI/2),
159
        center.getY() - ellipse.getAxis2Dist()*Math.sin(angle+Math.PI/2),
160
        primitive.getGeometryType().getSubType());
161

    
162
        axis2Line.setPoints(axis2Point1,
163
            axis2Point2);
164
        drawingStatus.addStatus(axis2Line, auxiliaryLineSymbolEditing, "");
165

    
166
        drawingStatus.addStatus(primitive, drawingStatus.getPreviewSymbol(), "");
167
        drawingStatus.addStatus(primitive, lineSymbolEditing, "");
168
    }
169

    
170
}