Statistics
| Revision:

root / tags / v2_0_0_Build_2049 / applications / appgvSIG / src / org / gvsig / app / project / documents / view / toolListeners / snapping / snappers / TangentPointSnapper.java @ 38460

History | View | Annotate | Download (4.03 KB)

1 29598 jpiera
package org.gvsig.app.project.documents.view.toolListeners.snapping.snappers;
2 23642 vcaballero
3
import java.awt.geom.PathIterator;
4
import java.awt.geom.Point2D;
5
6
import org.gvsig.fmap.geom.Geometry;
7 27035 jpiera
import org.gvsig.fmap.geom.primitive.Arc;
8
import org.gvsig.fmap.geom.primitive.Circle;
9
import org.gvsig.fmap.geom.primitive.Ellipse;
10
import org.gvsig.fmap.geom.primitive.Spline;
11 30349 jpiera
import org.gvsig.fmap.mapcontrol.PrimitivesDrawer;
12 23642 vcaballero
import org.gvsig.fmap.mapcontrol.tools.snapping.snappers.ISnapperVectorial;
13 30349 jpiera
import org.gvsig.fmap.mapcontrol.tools.snapping.snappers.impl.AbstractSnapper;
14 38226 jldominguez
import org.gvsig.i18n.Messages;
15 23642 vcaballero
16
import com.vividsolutions.jts.geom.Coordinate;
17
import com.vividsolutions.jts.geom.LineSegment;
18
19
20
/**
21
 * Tangent point snapper.
22
 *
23
 * @author Vicente Caballero Navarro
24
 */
25
public class TangentPointSnapper extends AbstractSnapper
26
    implements ISnapperVectorial {
27
        /* (non-Javadoc)
28
     * @see com.iver.cit.gvsig.gui.cad.snapping.ISnapper#getSnapPoint(Point2D point,
29
     * IGeometry geom,double tolerance, Point2D lastPointEntered)
30
     */
31
    public Point2D getSnapPoint(Point2D point, Geometry geom,
32
        double tolerance, Point2D lastPointEntered) {
33 27035 jpiera
        if (!(geom instanceof Circle ||
34
                geom instanceof Arc ||
35
                geom instanceof Ellipse ||
36
                geom instanceof Spline)) {
37 23642 vcaballero
            return null;
38
        }
39
40
        Point2D resul = null;
41
        Coordinate c = new Coordinate(point.getX(), point.getY());
42
43
        PathIterator theIterator = geom.getPathIterator(null,
44 30337 jpiera
                geomManager.getFlatness());
45 23642 vcaballero
        double[] theData = new double[6];
46
        double minDist = tolerance;
47
        Coordinate from = null;
48
        Coordinate first = null;
49
50
        while (!theIterator.isDone()) {
51
            //while not done
52
            int theType = theIterator.currentSegment(theData);
53
54
            switch (theType) {
55
            case PathIterator.SEG_MOVETO:
56
                from = new Coordinate(theData[0], theData[1]);
57
                first = from;
58
59
                break;
60
61
            case PathIterator.SEG_LINETO:
62
63
                // System.out.println("SEG_LINETO");
64
                Coordinate to = new Coordinate(theData[0], theData[1]);
65
                LineSegment line = new LineSegment(from, to);
66
                Coordinate closestPoint = line.closestPoint(c);
67
                double dist = c.distance(closestPoint);
68
69
                if ((dist < minDist)) {
70
                    resul = new Point2D.Double(closestPoint.x, closestPoint.y);
71
                    minDist = dist;
72
                }
73
74
                from = to;
75
76
                break;
77
78
            case PathIterator.SEG_CLOSE:
79
                line = new LineSegment(from, first);
80
                closestPoint = line.closestPoint(c);
81
                dist = c.distance(closestPoint);
82
83
                if ((dist < minDist)) {
84
                    resul = new Point2D.Double(closestPoint.x, closestPoint.y);
85
                    minDist = dist;
86
                }
87
88
                from = first;
89
90
                break;
91
            } //end switch
92
93
            theIterator.next();
94
        }
95
96
        return resul;
97
    }
98
99
    /* (non-Javadoc)
100
     * @see com.iver.cit.gvsig.gui.cad.snapping.ISnapper#getToolTipText()
101
     */
102
    public String getToolTipText() {
103 38226 jldominguez
        return Messages.getText("Tangent_point");
104 23642 vcaballero
    }
105
106 30349 jpiera
    /*
107
     * (non-Javadoc)
108
     * @see org.gvsig.fmap.mapcontrol.tools.snapping.snappers.ISnapper#draw(org.gvsig.fmap.mapcontrol.PrimitivesDrawer, java.awt.geom.Point2D)
109 23642 vcaballero
     */
110 30349 jpiera
    public void draw(PrimitivesDrawer primitivesDrawer, Point2D pPixels) {
111
            primitivesDrawer.setColor(getColor());
112 23642 vcaballero
113
        int half = getSizePixels() / 2;
114 30349 jpiera
        primitivesDrawer.drawLine((int) (pPixels.getX() - half),
115 23642 vcaballero
            (int) (pPixels.getY() - half), (int) (pPixels.getX() + half),
116
            (int) (pPixels.getY() - half));
117 30349 jpiera
        primitivesDrawer.drawOval((int) (pPixels.getX() - half),
118 23642 vcaballero
            (int) (pPixels.getY() - half), getSizePixels(), getSizePixels());
119
    }
120
121
122
}