#include <chrono> #include <iostream> #include <cstring> #include <math.h> double cubicCalc(double xs[4], double ys[4], double xInput) {
double* H,*A,*B,*C,*D,*Z,*F,*X,*Y; double dbOutY; X = new double[4]; Y = new double[4];
A = new double[4]; B = new double[4]; C = new double[4]; D = new double[4]; H = new double[4]; memcpy(X, xs, 4*sizeof(double)); memcpy(Y, ys, 4*sizeof(double));
int M = 4; int N = 3; int i,P,L; for (i=1;i<=N;i++) { H[i-1]=X[i]-X[i-1]; }
L=N-1; for(i=1;i<=L;i++) { A[i]=H[i-1]/(H[i-1]+H[i]); B[i]=3*((1-A[i])*(Y[i]-Y[i-1])/H[i-1]+A[i]*(Y[i+1]-Y[i])/H[i]); } A[0]=1; A[N]=0; B[0]=3*(Y[1]-Y[0])/H[0]; B[N]=3*(Y[N]-Y[N-1])/H[N-1];
for(i=0;i<=N;i++) { D[i]=2; }
for(i=0;i<=N;i++) { C[i]=1-A[i]; }
P=N; for(i=1;i<=P;i++) {
if ( fabs(D[i]) <= 0.000001 ) { return false; } A[i-1]=A[i-1]/D[i-1]; B[i-1]=B[i-1]/D[i-1]; D[i]=A[i-1]*(-C[i])+D[i]; B[i]=-C[i]*B[i-1]+B[i]; } B[P]=B[P]/D[P]; for(i=1;i<=P;i++) { B[P-i]=B[P-i]-A[P-i]*B[P-i+1]; } double E,E1,K,K1,H1; int j ; if(xInput<X[0]) { j = 0;
} else if (xInput > X[N]) { j = N-1; } else { for (j=1;j<=N;j++) { if(xInput<=X[j]) { j=j-1;
break; } }
}
E=X[j+1]-xInput; E1=E*E; K=xInput-X[j]; K1=K*K; H1=H[j]*H[j];
dbOutY=(3*E1-2*E1*E/H[j])*Y[j]+(3*K1-2*K1*K/H[j])*Y[j+1]; dbOutY=dbOutY+(H[j]*E1-E1*E)*B[j]-(H[j]*K1-K1*K)*B[j+1]; dbOutY=dbOutY/H1; return dbOutY; }
|