import java.io.*; import java.util.*; import java.lang.Math.*; public class spline3D { private double minhop = 0.39; private double maxhop = 0.40; private double D = 0.001; private static double[][][] mA = { {{1,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}, {{1,0,0,0},{-1,1,0,0},{0,0,0,0},{0,0,0,0}}, {{1,0,0,0},{-3,4,-1,0},{2,-4,2,0},{0,0,0,0}}, {{1,0,0,0},{-5.5,9,-4.5,1},{9,-22.5,18,-4.5},{-4.5,13.5,-13.5,4.5}} }; public spline3D() { } public Vector generate( vector3D[] vA ) { Vector V = new Vector(); double T = 0; double TT = 0; vector3D newPoint = null; vector3D oldPoint = null; vector3D tmpPoint = null; vector3D endPoint = null; // add first point oldPoint = new vector3D( vA[0] ); V.addElement( new vector3D( oldPoint ) ); // while not finished do { // first guess at point TT = T + D; //System.out.println( "trying " + TT ); newPoint = matrix( vA, TT ); tmpPoint = new vector3D( newPoint ); tmpPoint.sub( oldPoint ); // while to long while( tmpPoint.length() > maxhop ) { TT -= D; //System.out.println( "trying " + TT ); newPoint = matrix( vA, TT ); tmpPoint = new vector3D( newPoint ); tmpPoint.sub( oldPoint ); } // while too short while( tmpPoint.length() < minhop ) { TT += D; //System.out.println( "trying " + TT ); newPoint = matrix( vA, TT ); tmpPoint = new vector3D( newPoint ); tmpPoint.sub( oldPoint ); } // just right T = TT; V.addElement( newPoint ); oldPoint.set( newPoint ); // check distance endPoint = new vector3D( vA[1] ); endPoint.sub( newPoint ); } while( endPoint.length() > maxhop ); return V; } private vector3D matrix( vector3D[] vP, double fT ) { int dS = vP.length; double viT[] = new double[dS]; viT[0] = 1; for( int viC = 1; viC < dS; viC++ ) viT[viC] = viT[viC-1] * fT; vector3D result = new vector3D(); for( int vmR = 0; vmR < dS; vmR++ ) { for( int vmC = 0; vmC < dS; vmC++ ) { vector3D temp = new vector3D( vP[vmC] ); temp.mul( mA[dS-1][vmR][vmC] ); temp.mul( viT[vmR] ); result.add( temp ); } } return result; } }