00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 static char *id="@(#) $Id: shplnrm.c,v 1.2 2006/08/17 19:28:17 mhender Exp $";
00018
00019 #include <shInternal.h>
00020 #include <math.h>
00021
00031 void shplnrm(int *nv,float *xt,float *yt,float *zt)
00032 {
00033 float *n;
00034 float an;
00035 int m,m1,m2,m3;
00036 int i;
00037 int zero=0;
00038
00039
00040
00041 n=(float*)malloc(3*(*nv)*sizeof(float));
00042
00043 for(m=0;m<*nv;m++)
00044 {
00045 m1=m;
00046 m3=m-1;
00047 if(m3<1)m3=*nv;
00048 m2=m+1;
00049 if(m2>*nv)m2=1;
00050 m1=1;
00051 m2=2;
00052 m3=3;
00053 n[3*m]=(yt[m2]-yt[m1])*(zt[m3]-zt[m1])-(yt[m3]-yt[m1])*(zt[m2]-zt[m1]);
00054 n[1+3*m]=(xt[m3]-xt[m1])*(zt[m2]-zt[m1])-(xt[m2]-xt[m1])*(zt[m3]-zt[m1]);
00055 n[2+3*m]=(xt[m2]-xt[m1])*(yt[m3]-yt[m1])-(xt[m3]-xt[m1])*(yt[m2]-yt[m1]);
00056 an=sqrt(n[3*m]*n[3*m]+n[1+3*m]*n[1+3*m]+n[2+3*m]*n[2+3*m]);
00057 if(an==0.)return;
00058 an=1./an;
00059 n[3*m]=n[3*m]*an;
00060 n[1+3*m]=n[1+3*m]*an;
00061 n[2+3*m]=n[2+3*m]*an;
00062 }
00063
00064 for(i=0;i<*nv-1;i++)
00065 shlnonrm(xt+i,yt+i,zt+i,&(n[3*i]),xt+i+1,yt+i+1,zt+i+1,&(n[3*i+3]),&zero,&zero,&zero);
00066 return;
00067 }