Statistics
| Revision:

root / trunk / org.gvsig.dwg / org.gvsig.dwg.lib / src / main / java / org / gvsig / dwg / lib / util / FMapUtil.java @ 74

History | View | Annotate | Download (3.69 KB)

1
/*
2
 * Created on 18-ene-2007 by azabala
3
 *
4
 */
5
package org.gvsig.dwg.lib.util;
6

    
7
import java.awt.geom.Point2D;
8
import java.util.Iterator;
9
import java.util.List;
10

    
11
import org.gvsig.dwg.lib.IDwgVertex;
12
import org.gvsig.fmap.geom.Geometry;
13
import org.gvsig.fmap.geom.GeometryLocator;
14
import org.gvsig.fmap.geom.GeometryManager;
15
import org.gvsig.fmap.geom.aggregate.MultiCurve;
16
import org.gvsig.fmap.geom.aggregate.MultiLine;
17
import org.gvsig.fmap.geom.exception.CreateGeometryException;
18
import org.gvsig.fmap.geom.primitive.Line;
19
import org.gvsig.fmap.geom.primitive.Point;
20
import org.gvsig.fmap.geom.primitive.Polygon;
21
import org.gvsig.fmap.geom.primitive.Surface;
22

    
23
/**
24
 * @author alzabord
25
 *
26
 */
27
public class FMapUtil {
28

    
29
    private static final GeometryManager gManager = GeometryLocator
30
            .getGeometryManager();
31

    
32
    public static MultiCurve ptsToMultiLine(List<double[]> pts, int subType)
33
            throws CreateGeometryException {
34

    
35
        if (pts.size() < 2) {
36
            throw new IllegalArgumentException();
37
        }
38

    
39
        Point point, prevPoint;
40
        Line line;
41

    
42
        MultiLine multi = gManager.createMultiLine(subType);
43
        prevPoint = FMapUtil.createPoint(subType, pts.get(0));
44
        for (int i = 1; i < pts.size(); i++) {
45
            point = FMapUtil.createPoint(subType, pts.get(i));
46
            line = gManager.createLine(subType);
47
            line.addVertex(prevPoint);
48
            line.addVertex(point);
49
            multi.addPrimitive(line);
50
            prevPoint = FMapUtil.createPoint(subType, pts.get(i));
51
        }
52
        return multi;
53

    
54
    }
55

    
56
    public static Surface ptsToPolygon(List<double[]> pts, int subType)
57
            throws CreateGeometryException {
58

    
59
        if (pts.size() < 3) {
60
            throw new IllegalArgumentException();
61
        }
62

    
63
        Polygon polygon = gManager.createPolygon(subType);
64

    
65
        Iterator<double[]> iter = pts.iterator();
66
        while (iter.hasNext()) {
67
            Point vertex = createPoint(subType, iter.next());
68
            polygon.addVertex(vertex);
69
        }
70
        return polygon;
71
    }
72

    
73
    public static Point createPoint(int subType, double[] point) throws CreateGeometryException {
74
        Point result = gManager.createPoint(point[0], point[1], subType);
75
        if (subType == Geometry.SUBTYPES.GEOM3D) {
76
            result.setCoordinateAt(Geometry.DIMENSIONS.Z, point[2]);
77
        }
78
        return result;
79
    }
80

    
81
    public static Point createPoint(int subType, Point2D point) throws CreateGeometryException {
82
        Point result = gManager.createPoint(point.getX(), point.getY(), subType);
83
        return result;
84
    }
85

    
86
    public static Point createPoint(int subType, IDwgVertex dwgvertex) throws CreateGeometryException {
87
        double[] point = dwgvertex.getPoint();
88
        Point result = gManager.createPoint(point[0], point[1], subType);
89
        if (subType == Geometry.SUBTYPES.GEOM3D) {
90
            result.setCoordinateAt(Geometry.DIMENSIONS.Z, point[2]);
91
        }
92
        return result;
93
    }
94

    
95
    /**
96
     * Devuelve la distancia desde angle1 a angle2. Angulo en radianes de
97
     * diferencia entre angle1 y angle2 en sentido antihorario
98
     *
99
     * @param angle1 angulo en radianes. Debe ser positivo y no dar ninguna
100
     * vuelta a la circunferencia
101
     * @param angle2 angulo en radianes. Debe ser positivo y no dar ninguna
102
     * vuelta a la circunferencia
103
     *
104
     * @return distancia entre los �ngulos
105
     */
106
    public static double angleDistance(double angle1, double angle2) {
107
        if (angle1 < angle2) {
108
            return angle2 - angle1;
109
        } else {
110
            return ((Math.PI * 2) - angle1) + angle2;
111
        }
112
    }
113
}