code: function ( u, distance ) {
  
  		var arcLengths = this.getLengths();
  
  		var i = 0, il = arcLengths.length;
  
  		var targetArcLength; // The targeted u distance value to get
  
  		if ( distance ) {
  
  			targetArcLength = distance;
  
  		} else {
  
  			targetArcLength = u * arcLengths[ il - 1 ];
  
  		}
  
  		//var time = Date.now();
  
  		// binary search for the index with largest value smaller than target u distance
  
  		var low = 0, high = il - 1, comparison;
  
  		while ( low <= high ) {
  
  			i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats
  
  			comparison = arcLengths[ i ] - targetArcLength;
  
  			if ( comparison < 0 ) {
  
  				low = i + 1;
  
  			} else if ( comparison > 0 ) {
  
  				high = i - 1;
  
  			} else {
  
  				high = i;
  				break;
  
  				// DONE
  
  			}
  
  		}
  
  		i = high;
  
  		//console.log('b' , i, low, high, Date.now()- time);
  
  		if ( arcLengths[ i ] === targetArcLength ) {
  
  			var t = i / ( il - 1 );
  			return t;
  
  		}
  
  		// we could get finer grain at lengths, or use simple interpolation between two points
  
  		var lengthBefore = arcLengths[ i ];
  		var lengthAfter = arcLengths[ i + 1 ];
  
  		var segmentLength = lengthAfter - lengthBefore;
  
  		// determine where we are between the 'before' and 'after' points
  
  		var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;
  
  		// add that fractional amount to t
  
  		var t = ( i + segmentFraction ) / ( il - 1 );
  
  		return t;
  
  	}
docs: Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant