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.smoothline / src / main / java / org / gvsig / vectorediting / lib / prov / smoothline / Bezier.java @ 338

History | View | Annotate | Download (1.81 KB)

1
package org.gvsig.vectorediting.lib.prov.smoothline;
2

    
3
import org.gvsig.fmap.geom.GeometryLocator;
4
import org.gvsig.fmap.geom.GeometryManager;
5
import org.gvsig.fmap.geom.exception.CreateGeometryException;
6
import org.gvsig.fmap.geom.primitive.Line;
7
import org.gvsig.fmap.geom.primitive.Point;
8

    
9
public class Bezier extends ControlCurve {
10

    
11
    public Bezier(final Line line) {
12
        super(line);
13
    }
14

    
15
    // the basis function for a Bezier spline
16
    static float b(final int i, final float t) {
17
        switch (i) {
18
        case 0:
19
            return (1 - t) * (1 - t) * (1 - t);
20
        case 1:
21
            return 3 * t * (1 - t) * (1 - t);
22
        case 2:
23
            return 3 * t * t * (1 - t);
24
        case 3:
25
            return t * t * t;
26
        }
27
        return 0; // we only get here if an invalid i is specified
28
    }
29

    
30
    // evaluate a point on the B spline
31
    Point p(final int i, final float t, int subtype) throws CreateGeometryException {
32
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
33
        float px = 0;
34
        float py = 0;
35
        for (int j = 0; j <= 3; j++) {
36
            px += b(j, t) * m_X[i + j];
37
            py += b(j, t) * m_Y[i + j];
38
        }
39
        return geomManager.createPoint((int) Math.round(px), (int) Math.round(py),subtype);
40
    }
41

    
42
    @Override
43
    public Line getSmoothedLine(final int iSteps, int subtype) throws CreateGeometryException {
44
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
45
        Line line = geomManager.createLine(subtype);
46

    
47
        Point q = p(0, 0, subtype);
48
        line.addVertex(q);
49
        for (int i = 0; i < m_X.length - 3; i += 3) {
50
            for (int j = 1; j <= iSteps; j++) {
51
                q = p(i, j / (float) iSteps, subtype);
52
                line.addVertex(q);
53
            }
54
        }
55
        return line;
56
    }
57
}