public static int colorSpline(int x, int numKnots, int[] xknots, int[] yknots) {
		int span;
		int numSpans = numKnots - 3;
		float k0, k1, k2, k3;
		float c0, c1, c2, c3;
		
		if (numSpans < 1)
			throw new IllegalArgumentException("Too few knots in spline");
		
		for (span = 0; span < numSpans; span++)
			if (xknots[span+1] > x)
				break;
		if (span > numKnots-3)
			span = numKnots-3;
		float t = (float)(x-xknots[span]) / (xknots[span+1]-xknots[span]);
		span--;
		if (span < 0) {
			span = 0;
			t = 0;
		}

		int v = 0;
		for (int i = 0; i < 4; i++) {
			int shift = i * 8;
			
			k0 = (yknots[span] >> shift) & 0xff;
			k1 = (yknots[span+1] >> shift) & 0xff;
			k2 = (yknots[span+2] >> shift) & 0xff;
			k3 = (yknots[span+3] >> shift) & 0xff;
			
			c3 = m00*k0 + m01*k1 + m02*k2 + m03*k3;
			c2 = m10*k0 + m11*k1 + m12*k2 + m13*k3;
			c1 = m20*k0 + m21*k1 + m22*k2 + m23*k3;
			c0 = m30*k0 + m31*k1 + m32*k2 + m33*k3;
			int n = (int)(((c3*t + c2)*t + c1)*t + c0);
			if (n < 0)
				n = 0;
			else if (n > 255)
				n = 255;
			v |= n << shift;
		}
		
		return v;
	}
public static int colorSpline ( int x , int numKnots , int [ ] xknots , int [ ] yknots ) { int span ; int numSpans = numKnots - 3 ; float k0 , k1 , k2 , k3 ; float c0 , c1 , c2 , c3 ; if ( numSpans < 1 ) throw new IllegalArgumentException ( "Too few knots in spline" ) ; for ( span = 0 ; span < numSpans ; span ++ ) if ( xknots [ span + 1 ] > x ) break ; if ( span > numKnots - 3 ) span = numKnots - 3 ; float t = ( float ) ( x - xknots [ span ] ) / ( xknots [ span + 1 ] - xknots [ span ] ) ; span -- ; if ( span < 0 ) { span = 0 ; t = 0 ; } int v = 0 ; for ( int i = 0 ; i < 4 ; i ++ ) { int shift = i * 8 ; k0 = ( yknots [ span ] > > shift ) & 0xff ; k1 = ( yknots [ span + 1 ] > > shift ) & 0xff ; k2 = ( yknots [ span + 2 ] > > shift ) & 0xff ; k3 = ( yknots [ span + 3 ] > > shift ) & 0xff ; c3 = m00 * k0 + m01 * k1 + m02 * k2 + m03 * k3 ; c2 = m10 * k0 + m11 * k1 + m12 * k2 + m13 * k3 ; c1 = m20 * k0 + m21 * k1 + m22 * k2 + m23 * k3 ; c0 = m30 * k0 + m31 * k1 + m32 * k2 + m33 * k3 ; int n = ( int ) ( ( ( c3 * t + c2 ) * t + c1 ) * t + c0 ) ; if ( n < 0 ) n = 0 ; else if ( n > 255 ) n = 255 ; v |= n << shift ; } return v ; }
Compute a Catmull-Rom spline for RGB values, but with variable knot spacing.
@param x the input parameter
@param numKnots the number of knots in the spline
@param xknots the array of knot x values
@param yknots the array of knot y values
@return the spline value