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 @ 575

History | View | Annotate | Download (6.2 KB)

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

    
3
import java.util.ArrayList;
4
import java.util.List;
5

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

    
21
public class EllipseEditVertexOperation implements EditVertexOperation {
22

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

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

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

    
37
    public Geometry moveVertex(Primitive geom, int index, Point point) throws CreateGeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
38
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
39
        PeriEllipse original = (PeriEllipse)geom;
40
        PeriEllipse result = (PeriEllipse) original.cloneGeometry();
41
        if(index == 0){
42
            result.setPoints(point, original.getAxis1End(), original.getAxis2Dist());
43
        } else if (index == 1){
44
            result.setPoints(original.getAxis1Start(), point, original.getAxis2Dist());
45
        } else if (index == 2){
46
            Point axis1Start = original.getAxis1Start();
47
            Point axis1End = original.getAxis1End();
48
            Point center = geometryManager.createPoint(
49
                (axis1Start.getX()+axis1End.getX())/2,
50
                (axis1Start.getY()+axis1End.getY())/2,
51
                geom.getGeometryType().getSubType());
52
            result.setPoints(original.getAxis1Start(), original.getAxis1End(), center.distance(point));
53
        }
54
        return result;
55
    }
56

    
57
    public List<Point> getVertexesList(Primitive geom) throws CreateGeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
58
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
59
        ArrayList<Point> vertexList = new ArrayList<Point>();
60
        PeriEllipse ellipse = (PeriEllipse) geom;
61
        Point axis1Start = ellipse.getAxis1Start();
62
        vertexList.add(axis1Start);
63
        Point axis1End = ellipse.getAxis1End();
64
        vertexList.add(axis1End);
65
        Point center = geometryManager.createPoint(
66
            (axis1Start.getX()+axis1End.getX())/2,
67
            (axis1Start.getY()+axis1End.getY())/2,
68
            geom.getGeometryType().getSubType());
69

    
70
        double angle = getAngle(axis1Start, axis1End);
71

    
72
        vertexList.add(geometryManager.createPoint(
73
            center.getX() + ellipse.getAxis2Dist()*Math.cos(angle+Math.PI/2),
74
            center.getY() + ellipse.getAxis2Dist()*Math.sin(angle+Math.PI/2),
75
            geom.getGeometryType().getSubType()));
76

    
77
        return vertexList;
78
    }
79

    
80
    public int getNumVertex(Primitive geom) {
81
        return 3;
82
    }
83

    
84
    public boolean canInsertVertex(Primitive geom, int index) {
85
        return false;
86
    }
87

    
88
    public boolean canRemoveVertex(Primitive geom, int index) {
89
        return false;
90
    }
91

    
92
    public boolean canMoveVertex(int index, Point point) {
93
        return true;
94
    }
95

    
96
    public double getAngle(Point start, Point end)
97
        throws GeometryOperationNotSupportedException,
98
        GeometryOperationException {
99
        double angle =
100
            Math.acos((end.getX() - start.getX()) / start.distance(end));
101

    
102
        if (start.getY() > end.getY()) {
103
            angle = -angle;
104
        }
105

    
106
        if (angle < 0) {
107
            angle += (2 * Math.PI);
108
        }
109

    
110
        return angle;
111
    }
112

    
113
    public void addToDrawingStatus(DefaultDrawingStatus drawingStatus,
114
        Primitive primitive) throws CreateGeometryException, GeometryOperationNotSupportedException, GeometryOperationException {
115
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
116
        EditingProviderManager editingProviderManager =
117
            EditingProviderLocator.getProviderManager();
118
        ISymbol auxiliaryLineSymbolEditing =
119
            editingProviderManager.getSymbol("auxiliary-line-symbol-editing");
120
        ISymbol lineSymbolEditing =
121
            editingProviderManager.getSymbol("line-symbol-editing");
122
        PeriEllipse ellipse = (PeriEllipse)primitive;
123
        Point axis1Start = ellipse.getAxis1Start();
124
        Point axis1End = ellipse.getAxis1End();
125
        Line axis1Line = geometryManager.createLine(primitive.getGeometryType().getSubType());
126
        axis1Line.setPoints(axis1Start,axis1End);
127
        drawingStatus.addStatus(axis1Line, auxiliaryLineSymbolEditing, "");
128

    
129
        Line axis2Line = geometryManager.createLine(primitive.getGeometryType().getSubType());
130

    
131
        Point center = geometryManager.createPoint(
132
            (axis1Start.getX()+axis1End.getX())/2,
133
            (axis1Start.getY()+axis1End.getY())/2,
134
            primitive.getGeometryType().getSubType());
135

    
136
        double angle = getAngle(axis1Start, axis1End);
137

    
138
        Point axis2Point1 = geometryManager.createPoint(
139
        center.getX() + ellipse.getAxis2Dist()*Math.cos(angle+Math.PI/2),
140
        center.getY() + ellipse.getAxis2Dist()*Math.sin(angle+Math.PI/2),
141
        primitive.getGeometryType().getSubType());
142

    
143
        Point axis2Point2 = geometryManager.createPoint(
144
        center.getX() - ellipse.getAxis2Dist()*Math.cos(angle+Math.PI/2),
145
        center.getY() - ellipse.getAxis2Dist()*Math.sin(angle+Math.PI/2),
146
        primitive.getGeometryType().getSubType());
147

    
148
        axis2Line.setPoints(axis2Point1,
149
            axis2Point2);
150
        drawingStatus.addStatus(axis2Line, auxiliaryLineSymbolEditing, "");
151

    
152
        drawingStatus.addStatus(primitive, lineSymbolEditing, "");
153
    }
154

    
155
}