
void InterpolSpline::calculderivsecondes(double yp0, double ypnm1, double *dersec)
{

	int 	i,k;
	double p,qn,sig,un,*u;

	u = new double[nbctrlpoints];

	//evite la pente initiale trop importante
	if (yp0 > 1e30)
		dersec[0]=u[0]=0.0;
	else
	{
		dersec[0] = -0.5;
		u[0]=(3.0/(double)(ctrlpoints[1].x-ctrlpoints[0].x))*((double)(ctrlpoints[1].y-ctrlpoints[0].y)/(double)(ctrlpoints[1].x-ctrlpoints[0].x)-yp0);
	}
	for (i=1;i<nbctrlpoints-1;i++)
	{
		sig=(double)(ctrlpoints[i].x-ctrlpoints[i-1].x)/(double)(ctrlpoints[i+1].x-ctrlpoints[i-1].x);
		p=sig*dersec[i-1]+2.0;
		dersec[i]=(sig-1.0)/p;
		u[i]=(double)(ctrlpoints[i+1].y-ctrlpoints[i].y)/(float)(ctrlpoints[i+1].x-ctrlpoints[i].x) - (double)(ctrlpoints[i].y-ctrlpoints[i-1].y)/(double)(ctrlpoints[i].x-ctrlpoints[i-1].x);
		u[i]=(6.0*u[i]/(double)(ctrlpoints[i+1].x-ctrlpoints[i-1].x)-sig*u[i-1])/p;
	}

	//evite la pente finale trop importante
	if (ypnm1 > 0.99e30)
		qn=un=0.0;
	else {
		qn=0.5;
		un=(3.0/(double)(ctrlpoints[nbctrlpoints-1].x-ctrlpoints[nbctrlpoints-2].x))*(ypnm1-(double)(ctrlpoints[nbctrlpoints-1].y-ctrlpoints[nbctrlpoints-2].y)/(double)(ctrlpoints[nbctrlpoints-1].x-ctrlpoints[nbctrlpoints-2].x));
	}
	dersec[nbctrlpoints-1]=(un-qn*u[nbctrlpoints-2])/(qn*dersec[nbctrlpoints-2]+1.0);
	for (k=nbctrlpoints-2;k>=0;k--)		dersec[k]=dersec[k]*dersec[k+1]+u[k];
	delete [] u;
}



