00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 static char *id="@(#) $Id: shsphere.c,v 1.2 2006/08/17 19:28:17 mhender Exp $";
00018
00019 #include <shInternal.h>
00020 #include <math.h>
00021 #include <stdio.h>
00022
00031 void shsphere(float *xo,float *yo,float *zo,float *r)
00032 {
00033 float *xt,*yt,*zt;
00034 float x[3]={0.,0.,0.};
00035 float y[3]={0.,0.,0.};
00036 float z[3]={0.,0.,0.};
00037 float nrm[9]={0.,0.,0.,0.,0.,0.,0.,0.,0.};
00038 float xa,ya,za,xb,yb,zb,xc,yc,zc;
00039 float x0,y0,z0,x1,y1,z1,x2,y2,z2;
00040 float d;
00041 int maxtri;
00042 int i;
00043 int itri,ntri,mtri;
00044 int n,ismooth;
00045 int nlevel;
00046
00047
00048
00049 ismooth=1;
00050 nlevel=4;
00051
00052 maxtri=8;
00053 for(i=0;i<nlevel;i++)maxtri=maxtri*4;
00054
00055 xt=(float*)malloc(3*maxtri*sizeof(float));
00056 yt=(float*)malloc(3*maxtri*sizeof(float));
00057 zt=(float*)malloc(3*maxtri*sizeof(float));
00058
00059
00060 ntri=0;
00061 xt[ 3*ntri]= 0.;
00062 yt[ 3*ntri]= 1.;
00063 zt[ 3*ntri]= 0.;
00064 xt[1+3*ntri]= 0.;
00065 yt[1+3*ntri]= 0.;
00066 zt[1+3*ntri]= 1.;
00067 xt[2+3*ntri]= 1.;
00068 yt[2+3*ntri]= 0.;
00069 zt[2+3*ntri]= 0.;
00070 ntri++;
00071
00072
00073 xt[ 3*ntri]= 0.;
00074 yt[ 3*ntri]= 1.;
00075 zt[ 3*ntri]= 0.;
00076 xt[1+3*ntri]=-1.;
00077 yt[1+3*ntri]= 0.;
00078 zt[1+3*ntri]= 0.;
00079 xt[2+3*ntri]= 0.;
00080 yt[2+3*ntri]= 0.;
00081 zt[2+3*ntri]= 1.;
00082 ntri++;
00083
00084
00085 xt[ 3*ntri]= 0.;
00086 yt[ 3*ntri]= 1.;
00087 zt[ 3*ntri]= 0.;
00088 xt[1+3*ntri]= 0.;
00089 yt[1+3*ntri]= 0.;
00090 zt[1+3*ntri]=-1.;
00091 xt[2+3*ntri]=-1.;
00092 yt[2+3*ntri]= 0.;
00093 zt[2+3*ntri]= 0.;
00094 ntri++;
00095
00096
00097 xt[ 3*ntri]= 0.;
00098 yt[ 3*ntri]= 1.;
00099 zt[ 3*ntri]= 0.;
00100 xt[1+3*ntri]= 1.;
00101 yt[1+3*ntri]= 0.;
00102 zt[1+3*ntri]= 0.;
00103 xt[2+3*ntri]= 0.;
00104 yt[2+3*ntri]= 0.;
00105 zt[2+3*ntri]=-1.;
00106 ntri++;
00107
00108
00109 xt[ 3*ntri]= 0.;
00110 yt[ 3*ntri]=-1.;
00111 zt[ 3*ntri]= 0.;
00112 xt[2+3*ntri]= 0.;
00113 yt[2+3*ntri]= 0.;
00114 zt[2+3*ntri]= 1.;
00115 xt[1+3*ntri]= 1.;
00116 yt[1+3*ntri]= 0.;
00117 zt[1+3*ntri]= 0.;
00118 ntri++;
00119
00120
00121 xt[ 3*ntri]= 0.;
00122 yt[ 3*ntri]=-1.;
00123 zt[ 3*ntri]= 0.;
00124 xt[2+3*ntri]=-1.;
00125 yt[2+3*ntri]= 0.;
00126 zt[2+3*ntri]= 0.;
00127 xt[1+3*ntri]= 0.;
00128 yt[1+3*ntri]= 0.;
00129 zt[1+3*ntri]= 1.;
00130 ntri++;
00131
00132
00133 xt[ 3*ntri]= 0.;
00134 yt[ 3*ntri]=-1.;
00135 zt[ 3*ntri]= 0.;
00136 xt[2+3*ntri]= 0.;
00137 yt[2+3*ntri]= 0.;
00138 zt[2+3*ntri]=-1.;
00139 xt[1+3*ntri]=-1.;
00140 yt[1+3*ntri]= 0.;
00141 zt[1+3*ntri]= 0.;
00142 ntri++;
00143
00144
00145 xt[ 3*ntri]= 0.;
00146 yt[ 3*ntri]=-1.;
00147 zt[ 3*ntri]= 0.;
00148 xt[2+3*ntri]= 1.;
00149 yt[2+3*ntri]= 0.;
00150 zt[2+3*ntri]= 0.;
00151 xt[1+3*ntri]= 0.;
00152 yt[1+3*ntri]= 0.;
00153 zt[1+3*ntri]=-1.;
00154 ntri++;
00155
00156 if(nlevel>0)
00157 {
00158 for(i=0;i<nlevel;i++)
00159 {
00160 mtri=ntri;
00161 for(itri=0;itri<ntri;itri++)
00162 {
00163 x0=xt[3*itri];
00164 y0=yt[3*itri];
00165 z0=zt[3*itri];
00166 x1=xt[1+3*itri];
00167 y1=yt[1+3*itri];
00168 z1=zt[1+3*itri];
00169 x2=xt[2+3*itri];
00170 y2=yt[2+3*itri];
00171 z2=zt[2+3*itri];
00172
00173 xa=.5*(x0+x1);
00174 ya=.5*(y0+y1);
00175 za=.5*(z0+z1);
00176 d=1./sqrt(xa*xa+ya*ya+za*za);
00177 xa=xa*d;
00178 ya=ya*d;
00179 za=za*d;
00180
00181 xb=.5*(x1+x2);
00182 yb=.5*(y1+y2);
00183 zb=.5*(z1+z2);
00184 d=1./sqrt(xb*xb+yb*yb+zb*zb);
00185 xb=xb*d;
00186 yb=yb*d;
00187 zb=zb*d;
00188
00189 xc=.5*(x2+x0);
00190 yc=.5*(y2+y0);
00191 zc=.5*(z2+z0);
00192 d=1./sqrt(xc*xc+yc*yc+zc*zc);
00193 xc=xc*d;
00194 yc=yc*d;
00195 zc=zc*d;
00196
00197 xt[ 3*itri]=x0;
00198 yt[ 3*itri]=y0;
00199 zt[ 3*itri]=z0;
00200 xt[1+3*itri]=xa;
00201 yt[1+3*itri]=ya;
00202 zt[1+3*itri]=za;
00203 xt[2+3*itri]=xc;
00204 yt[2+3*itri]=yc;
00205 zt[2+3*itri]=zc;
00206
00207 xt[ 3*mtri]=xa;
00208 yt[ 3*mtri]=ya;
00209 zt[ 3*mtri]=za;
00210 xt[1+3*mtri]=x1;
00211 yt[1+3*mtri]=y1;
00212 zt[1+3*mtri]=z1;
00213 xt[2+3*mtri]=xb;
00214 yt[2+3*mtri]=yb;
00215 zt[2+3*mtri]=zb;
00216 mtri++;
00217
00218 xt[ 3*mtri]=xb;
00219 yt[ 3*mtri]=yb;
00220 zt[ 3*mtri]=zb;
00221 xt[1+3*mtri]=x2;
00222 yt[1+3*mtri]=y2;
00223 zt[1+3*mtri]=z2;
00224 xt[2+3*mtri]=xc;
00225 yt[2+3*mtri]=yc;
00226 zt[2+3*mtri]=zc;
00227 mtri++;
00228
00229 xt[ 3*mtri]=xa;
00230 yt[ 3*mtri]=ya;
00231 zt[ 3*mtri]=za;
00232 xt[1+3*mtri]=xb;
00233 yt[1+3*mtri]=yb;
00234 zt[1+3*mtri]=zb;
00235 xt[2+3*mtri]=xc;
00236 yt[2+3*mtri]=yc;
00237 zt[2+3*mtri]=zc;
00238 mtri++;
00239 }
00240 ntri=mtri;
00241 }
00242 }
00243
00244 for(itri=0;itri<ntri;itri++)
00245 {
00246 for(i=0;i<3;i++)
00247 {
00248 nrm[0+3*i]= xt[i+3*itri];
00249 nrm[1+3*i]= yt[i+3*itri];
00250 nrm[2+3*i]= zt[i+3*itri];
00251 x[i]=(*xo)+(*r)*xt[i+3*itri];
00252 y[i]=(*yo)+(*r)*yt[i+3*itri];
00253 z[i]=(*zo)+(*r)*zt[i+3*itri];
00254 }
00255 n=3;
00256 if(ismooth!=0)shpgnrm(&n,x,y,z,nrm);
00257 else if(ismooth<0)shpl(&n,x,y,z);
00258 else shpg(&n,x,y,z);
00259 }
00260
00261 free(xt);
00262 free(yt);
00263 free(zt);
00264
00265 return;
00266 }