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 |
} |