List of usage examples for org.apache.commons.math3.analysis.polynomials PolynomialSplineFunction derivative
public UnivariateFunction derivative()
From source file:de.biomedical_imaging.traJ.features.SplineCurveDynamicsFeature.java
@Override public double[] evaluate() { PolynomialSplineFunction spline = null; if (recalculate) { splinefit = new TrajectorySplineFit(t, nSegments); spline = splinefit.calculateSpline(); } else {/*from w w w .j a va2 s. c om*/ spline = splinefit.getSpline(); } if (!splinefit.wasSuccessfull()) { return new double[] { Double.NaN, Double.NaN, Double.NaN }; } Trajectory tr = splinefit.getRotatedTrajectory(); UnivariateFunction derivative = spline.derivative(); int N = 0; double sumParallel = 0; double sumPerpendicular = 0; //Split each step into replacment rependicular and parallel to spline tangent for (int i = timelag; i < t.size(); i += timelag) { Point2D.Double pRef = splinefit.minDistancePointSpline(new Point2D.Double(tr.get(i).x, tr.get(i).y), 50); Point2D.Double pTangend = new Point2D.Double(pRef.x + 1, derivative.value(pRef.x) * (pRef.x + 1 - pRef.x) + spline.value(pRef.x)); Point2D.Double pNormal = new Point2D.Double(-1 * pTangend.y, pTangend.x); Point2D.Double dp = new Point2D.Double(pRef.x + tr.get(i).x - tr.get(i - timelag).x, pRef.y + tr.get(i).y - tr.get(i - timelag).y); sumParallel += Math.pow(splinefit.distancePointLine(pRef, pNormal, dp), 2); sumPerpendicular += Math.pow(splinefit.distancePointLine(pRef, pTangend, dp), 2); N++; } //System.out.println("N: " +spline.getN()); double msdParallel = sumParallel / N; double msdPerpendicular = sumPerpendicular / N; result = new double[] { msdParallel, msdPerpendicular, N }; recalculate = false; return result; }