/** * $Id: mxSpline.java,v 1.1 2012/11/15 13:26:39 gaudenz Exp $ * Copyright (c) 2010, David Benson */ package com.mxgraph.util; import java.util.List; public class mxSpline { /** * Array representing the relative proportion of the total distance * of each point in the line ( i.e. first point is 0.0, end point is * 1.0, a point halfway on line is 0.5 ). */ private double[] t; private mxSpline1D splineX; private mxSpline1D splineY; /** * Total length tracing the points on the spline */ private double length; public mxSpline(List<mxPoint> points) { if (points != null) { double[] x = new double[points.size()]; double[] y = new double[points.size()]; int i = 0; for (mxPoint point : points) { x[i] = point.getX(); y[i++] = point.getY(); } init(x, y); } } /** * Creates a new mxSpline. * @param x * @param y */ public void Spline2D(double[] x, double[] y) { init(x, y); } protected void init(double[] x, double[] y) { if (x.length != y.length) { // Arrays must have the same length // TODO log something return; } if (x.length < 2) { // Spline edges must have at least two points // TODO log something return; } t = new double[x.length]; t[0] = 0.0; // start point is always 0.0 length = 0.0; // Calculate the partial proportions of each section between each set // of points and the total length of sum of all sections for (int i = 1; i < t.length; i++) { double lx = x[i] - x[i - 1]; double ly = y[i] - y[i - 1]; // If either diff is zero there is no point performing the square root if (0.0 == lx) { t[i] = Math.abs(ly); } else if (0.0 == ly) { t[i] = Math.abs(lx); } else { t[i] = Math.sqrt(lx * lx + ly * ly); } length += t[i]; t[i] += t[i - 1]; } for (int j = 1; j < (t.length) - 1; j++) { t[j] = t[j] / length; } t[(t.length) - 1] = 1.0; // end point is always 1.0 splineX = new mxSpline1D(t, x); splineY = new mxSpline1D(t, y); } /** * @param t 0 <= t <= 1 */ public mxPoint getPoint(double t) { mxPoint result = new mxPoint(splineX.getValue(t), splineY.getValue(t)); return result; } /** * Used to check the correctness of this spline */ public boolean checkValues() { return (splineX.len.length > 1 && splineY.len.length > 1); } public double getDx(double t) { return splineX.getDx(t); } public double getDy(double t) { return splineY.getDx(t); } public mxSpline1D getSplineX() { return splineX; } public mxSpline1D getSplineY() { return splineY; } public double getLength() { return length; } }