Package org.faceless.graph.math
Class Spline
- java.lang.Object
-
- org.faceless.graph.math.Curve
-
- org.faceless.graph.math.FunctionCurve
-
- org.faceless.graph.math.Spline
-
public class Spline extends FunctionCurve
Create a Spline Curve, or more accurately a sequence of spline curves which can be used to interpolate or approximate, or just plain "Smooth" a
DataCurve
.Currently this class provides two pre-defined spline curves which can be mapped to a collection of data points.
A Catmull-Rom spline is a spline curve which passes through every point on the
DataCurve
, guaranteed.A B-Spline is a spline curve which approximates the data points it's based on. A B-Spline may not pass through any of the points supplied, but will tend to lessen the influence of "spikes" in the data. B-Splines conventionally use the first and last points as control points only. This class generates useful values for the first and last points on the
DataCurve
by repeating the first and last values in the data set.The curves are defined by the basis matrix for the spline. If the basis matrix has less rows than the number of points in the datacurve, several curves are "patched" together, using the n points of the datacurve starting at point 0, then point 1, then point 2 and so on.
If you haven't understood a word of this, you failed calculus at school, but you still still want your curves to be nice and smooth, just use a Catmull-Rom spline like this:
DataCurve data = new DataCurve(); data.add(x,y); // Add data to the curve . . Curve smooth = new Spline(Spline.CATMULLROM, data);
-
-
Field Summary
Fields Modifier and Type Field Description static Matrix
BSPLINE
Defines the basis matrix for a B-splinestatic Matrix
CATMULLROM
Defines the basis matrix for a Catmull-Rom spline
-
Constructor Summary
Constructors Constructor Description Spline(Matrix matrix, double[] x, double[] y)
Return a new Spline curve of the specified type fitted to the array of X and Y values supplied.Spline(Matrix matrix, DataCurve d)
Return a new Spline curve of the specified type fitted to the suppliedDataCurve
.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description double
get(double x)
Return the value of the spline at the specified X value.double
getMax()
Return the maximum value that is defined for this curve.double
getMin()
Return the minimum value that is defined for this curve.boolean
point(double x)
If a marker is to be placed at this point on the curve then return true, otherwise return false.double[]
steps()
Return the points on the curve that it should be sampled at to get an accurate picture of it.
-
-
-
Constructor Detail
-
Spline
public Spline(Matrix matrix, DataCurve d)
Return a new Spline curve of the specified type fitted to the suppliedDataCurve
.- Parameters:
matrix
- The basis matrix for the curve. May beCATMULLROM
,BSPLINE
or a user-defined 4x4 matrix.d
- the data-curve to fit to.
-
Spline
public Spline(Matrix matrix, double[] x, double[] y)
Return a new Spline curve of the specified type fitted to the array of X and Y values supplied. Note that although a Spline may loop back on itself (i.e. for any X position there may be more than one Y value) this class does not account for it (as it's meaning is to smooth curves, not provide a fully fledged spline interpolator). The results are undefined if the data passed in loops back upon itself.- Parameters:
matrix
- The basis matrix for the curve. May beCATMULLROM
,BSPLINE
or a user-defined matrix.x
- the X values to fit the curve toy
- the Y values to fit the curve to
-
-
Method Detail
-
get
public double get(double x)
Return the value of the spline at the specified X value. Note that unlike other spline libraries you may encounter, the value supplied is not the position along the length of the curve, but the position on the X axis. Remember this class is intended only for use with Line Graphs, not for general spline interpolation.
-
getMin
public double getMin()
Description copied from class:Curve
Return the minimum value that is defined for this curve. For curves with no minimum (like most mathematical functions), this should returnDouble.POSITIVE_INFINITY
(yes, positive)- Overrides:
getMin
in classFunctionCurve
-
getMax
public double getMax()
Description copied from class:Curve
Return the maximum value that is defined for this curve. For curves with no maximum (like most mathematical functions), this should returnDouble.NEGATIVE_INFINITY
(yes, negative)- Overrides:
getMax
in classFunctionCurve
-
steps
public double[] steps()
Description copied from class:Curve
Return the points on the curve that it should be sampled at to get an accurate picture of it. Subclasses ofFunctionCurve
may return an empty list if they wish, or if there are certain points that the curve must be sampled at, it can return them here.- Overrides:
steps
in classFunctionCurve
-
point
public boolean point(double x)
Description copied from class:Curve
If a marker is to be placed at this point on the curve then return true, otherwise return false. MostFunctionCurve
will return false, but curves that have been fitted to aDataCurve
may return any points from thatDataCurve
that are matched exactly by the fitted curve.- Overrides:
point
in classFunctionCurve
-
-