#ifndef __BSPLINE_H
#define __BSPLINE_H


struct serialBsplineTimeT
	{
	int time,  /* For computing of T for Basis spline function (T=time/all). */ 
			index;  /* The index of vector*serialBspline data */
	};
typedef struct serialBsplineTimeT serialBsplineTimeT;


struct vector1SerialBsplineDataT
	{
	int size;  /* The size of one data lists. This value is greater than or
			equal to 7, because as for getBspline() */
	float *data[1];  /* The sizes of 1 data lists are equal */
	int *time;  /* The size of this is 'size'-3 */
	};
typedef struct vector1SerialBsplineDataT vector1SerialBsplineDataT;

struct vector2SerialBsplineDataT
	{
	int size;  /* The size of one data lists. This value is greater than or
			equal to 7, because as for getBspline() */
	float *data[2];  /* The sizes of 2 data lists are equal */
	int *time;  /* The size of this is 'size'-3 */
	};
typedef struct vector2SerialBsplineDataT vector2SerialBsplineDataT;

struct vector3SerialBsplineDataT
	{
	int size;  /* The size of one data lists. This value is greater than or
			equal to 7, because as for getBspline() */
	float *data[3];  /* The sizes of 3 data lists are equal */
	int *time;  /* The size of this is 'size'-3 */
	};
typedef struct vector3SerialBsplineDataT vector3SerialBsplineDataT;


struct vector33SerialBsplineDataT
	{
	vector3SerialBsplineDataT vector3SerialBsplineData[2];
	};
typedef struct vector33SerialBsplineDataT vector33SerialBsplineDataT;

struct vector333SerialBsplineDataT
	{
	vector3SerialBsplineDataT vector3SerialBsplineData[3];
	};
typedef struct vector333SerialBsplineDataT vector333SerialBsplineDataT;

struct vector331SerialBsplineDataT
	{
	vector3SerialBsplineDataT vector3SerialBsplineData[2];
	vector1SerialBsplineDataT vector1SerialBsplineData[1];
	};
typedef struct vector331SerialBsplineDataT vector331SerialBsplineDataT;

struct vector3331SerialBsplineDataT
	{
	vector3SerialBsplineDataT vector3SerialBsplineData[3];
	vector1SerialBsplineDataT vector1SerialBsplineData[1];
	};
typedef struct vector3331SerialBsplineDataT vector3331SerialBsplineDataT;


float getBspline(float T,int nIndex,float *pData,int nElement);
	/*
	Return the result of Basis spline function.
		T : A parameter. The range of 0.0F to 1.0F, otherwise undefined.
		nIndex : The index of pData for Basis spline function,
				in the range of 0 to nElement-4 (0<=nIndex<nElement-3).
		pData : A data for Basis spline function.
		nElement : The number of elements of pData. That this is greater than or
				equal to 7 (nElement>=7) is better, in this case the beginning and
				the end of a line are correct to pData. Otherwise, the end of the
				line is not equal to the point of the end of pData, but at least
				the line is serial.
	*/

void initializeSerialBsplineTime(serialBsplineTimeT *pTime,int size);

void getVector1SerialBspline(float *fCoord,serialBsplineTimeT *pTime,
		const vector1SerialBsplineDataT *pData);
void getVector3SerialBspline(float *fCoord,serialBsplineTimeT *pTime,
		const vector3SerialBsplineDataT *pData);
void getVector33SerialBspline(float *fCoord,serialBsplineTimeT *pTime,
		const vector33SerialBsplineDataT *pData);
void getVector333SerialBspline(float *fCoord,serialBsplineTimeT *pTime,
		const vector333SerialBsplineDataT *pData);
void getVector331SerialBspline(float *fCoord,serialBsplineTimeT *pTime,
		const vector331SerialBsplineDataT *pData);
void getVector3331SerialBspline(float *fCoord,serialBsplineTimeT *pTime,
		const vector3331SerialBsplineDataT *pData);
	/*
	Return the result of Basis spline function, to fCoord.
		fCoord : The result of Basis spline function.
		pTime : For computing of Basis spline function.
				With calling this, pTime->time or(and) index is changed,
				if at the end of pData then pTime->index=-1.
		pData : Data for Basis spline function in n dimensions.
	*/


#endif  /* __BSPLINE_H */
