/* Steven Andrews, 12/98. */ /* See documentation called RnSort doc */ /* Copyright 2003 by Steven Andrews. Permission is granted for non-commercial use of and modifications to the code. */ #include #include #include "Rn.h" #include "RnSort.h" void sortV(float *a,float *b,int n) { int i,j,ir,l; float az,bz; if(!b) b=a; for(i=0;ia[i+1];i++) ; if(i==n-1) { for(i=0;i>1)+1; ir=n; for(;;) { if(l>1) { az=a[--l-1]; bz=b[l-1]; } else { az=a[ir-1]; bz=b[ir-1]; a[ir-1]=a[0]; b[ir-1]=b[0]; if(--ir==1) { a[0]=az; b[0]=bz; return; }} i=l; j=l<<1; while(j<=ir) { if(ja[i+1];i++) ; if(i==n-1) { for(i=0;i>1)+1; ir=n; for(;;) { if(l>1) { az=a[--l-1]; bz=b[l-1]; } else { az=a[ir-1]; bz=b[ir-1]; a[ir-1]=a[0]; b[ir-1]=b[0]; if(--ir==1) { a[0]=az; b[0]=bz; return; }} i=l; j=l<<1; while(j<=ir) { if(ja[i+1];i++) ; if(i==n-1) { for(i=0;i>1)+1; ir=n; for(;;) { if(l>1) { az=a[--l-1]; bzr=bc[2*(l-1)]; bzi=bc[2*(l-1)+1]; } else { az=a[ir-1]; bzr=bc[2*(ir-1)]; bzi=bc[2*(ir-1)+1]; a[ir-1]=a[0]; bc[2*(ir-1)]=bc[0]; bc[2*(ir-1)+1]=bc[1]; if(--ir==1) { a[0]=az; bc[0]=bzr; bc[1]=bzi; return; }} i=l; j=l<<1; while(j<=ir) { if(ja[i+1];i++) ; if(i==n-1) { for(i=0;i>1)+1; ir=n; for(;;) { if(l>1) { az=a[--l-1]; bz=b[l-1]; } else { az=a[ir-1]; bz=b[ir-1]; a[ir-1]=a[0]; b[ir-1]=b[0]; if(--ir==1) { a[0]=az; b[0]=bz; return; }} i=l; j=l<<1; while(j<=ir) { if(ja[0]); while(ju-jl>1) { jm=(ju+jl)>>1; if(ascnd==(x>=a[jm])) jl=jm; else ju=jm; } return jl; } int locateVdbl(double *a,double x,int n) { int jl,jm,ju,ascnd; jl=-1; ju=n; ascnd=(a[n-1]>a[0]); while(ju-jl>1) { jm=(ju+jl)>>1; if(ascnd==(x>=a[jm])) jl=jm; else ju=jm; } return jl; } int locateVli(long int *a,long int x,int n) { int jl,jm,ju,ascnd; jl=-1; ju=n; ascnd=(a[n-1]>a[0]); while(ju-jl>1) { jm=(ju+jl)>>1; if(ascnd==(x>=a[jm])) jl=jm; else ju=jm; } if(a[jl]==x) return jl; else return -1; } float interpolate1(float *ax,float *ay,int n,int *j,float x) { int i; i=*j; if(i<-1) i=locateV(ax,x,n); else while(in-2) i=n-2; if(i<0) i=0; if(n==1||ax[i+1]==ax[i]) return ay[i]; return (ay[i]*(ax[i+1]-x)+ay[i+1]*(x-ax[i]))/(ax[i+1]-ax[i]); } double interpolate1dbl(double *ax,double *ay,int n,int *j,double x) { int i; i=*j; if(i<-1) i=locateVdbl(ax,x,n); else while(in-2) i=n-2; if(i<0) i=0; if(n==1||ax[i+1]==ax[i]) return ay[i]; return (ay[i]*(ax[i+1]-x)+ay[i+1]*(x-ax[i]))/(ax[i+1]-ax[i]); } float interpolate1Cr(float *ax,float *ayc,int n,int *j,float x) { int i; i=*j; if(i<-1) i=locateV(ax,x,n); else while(in-2) i=n-2; if(i<0) i=0; if(n==1||ax[i+1]==ax[i]) return ayc[2*i]; return (ayc[2*i]*(ax[i+1]-x)+ayc[2*(i+1)]*(x-ax[i]))/(ax[i+1]-ax[i]); } float interpolate1Ci(float *ax,float *ayc,int n,int *j,float x) { int i; i=*j; if(i<-1) i=locateV(ax,x,n); else while(in-2) i=n-2; if(i<0) i=0; if(n==1||ax[i+1]==ax[i]) return ayc[2*i+1]; return (ayc[2*i+1]*(ax[i+1]-x)+ayc[2*(i+1)+1]*(x-ax[i]))/(ax[i+1]-ax[i]); } void convertxV(float *ax,float *ay,float *cx,float *cy,int na,int nc) { int ia,ic; float x,dx; if(na==nc) { for(ia=0;iana-2) ia=na-2; if(ia<0) ia=0; for(ic=0;icna-2) ia=na-2; if(ia<0) ia=0; for(ic=0;icratemax) { ratemax=rate; xmax=x; }} if(xmax>xlo) xlo=xmax-step; if(xmax