package edu.stanford.hci.flowmap.prefuse.render;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.codemap.util.geom.CubicCurve2D;
import org.codemap.util.geom.Point2D;
import edu.stanford.hci.flowmap.utils.GraphicsGems;
/**
* This software is distributed under the Berkeley Software Distribution
* License. Please see http://graphics.stanford.edu/~dphan/code/bsd.license.html
*
*/
public class BezierSpline {
// given a list of points to interpolate through (catmull rom points),
// returns a List
// of CubicCurve2D objects with the curves to interpolate through
public static Collection<CubicCurve2D> computeSplines(Point2D[] points) {
List<CubicCurve2D> newCubics = new ArrayList<CubicCurve2D>();
CubicCurve2D bezierCurve;
int i;
// now separate out the points. we assume that there are at least 4
// points,
// of which the first and last are dummy points (so there are only 2
// real points)
for (i = 1; i < points.length - 2; i++) {
bezierCurve = new CubicCurve2D.Double();
computeOneSpline(points[i - 1], points[i], points[i + 1],
points[i + 2], bezierCurve);
newCubics.add(bezierCurve);
}
return newCubics;
}
public static void computeOneSpline(Point2D v0, Point2D v1, Point2D v2,
Point2D v3, CubicCurve2D curve) {
GraphicsGems.checkNaN(v0);
GraphicsGems.checkNaN(v1);
GraphicsGems.checkNaN(v2);
GraphicsGems.checkNaN(v3);
double ctrlx1 = (-v0.getX() / 6) + v1.getX() + v2.getX() / 6;
double ctrly1 = (-v0.getY() / 6) + v1.getY() + v2.getY() / 6;
double ctrlx2 = (v1.getX() / 6) + v2.getX() - v3.getX() / 6;
double ctrly2 = (v1.getY() / 6) + v2.getY() - v3.getY() / 6;
curve.setCurve(v1.getX(), v1.getY(), ctrlx1, ctrly1, ctrlx2, ctrly2, v2
.getX(), v2.getY());
}
}