src/shsphere.c

00001 
00006 /*
00007  *  PROGRAM NAME:  sh
00008  *
00009  *  (c) COPYRIGHT INTERNATIONAL BUSINESS MACHINES
00010  *  CORPORATION 12/1/2001.  ALL RIGHTS RESERVED.
00011  *
00012  *  Please refer to the LICENSE file in the top directory
00013  *
00014  *      author: Mike Henderson mhender@watson.ibm.com
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 /* Draws a tesselated sphere, 8*4**n triangles, if ismooth^=0 smoothed. */
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 /* 1 */
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 /* 2 */
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 /* 3 */
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 /* 4 */
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 /* 5 */
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 /*  6 */
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 /*  7 */
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 /*  8 */
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  }

Generated on Thu Aug 17 15:29:43 2006 for sh by  doxygen 1.4.6