/* geosi - intersection of two spheres */ geosi(s) double s[][7]; { int i, j, k, n, m, m0; double b1, b2, c1, c2, g, th, dh, ri; double xx, yy, zz, rr; double w[3], u[3], o[3][3]; n=4096; n=2048; g=128.0; g=64.0; g=53.0; dh=3.14159/((double)n); for (i=0; i<2; i++) for (j=0; j<2; j++) { if (i==j) continue; th=0.0; ri=s[i][3]; /* twopv(&s[i][0]); */ /* twopv(&s[i][4]); */ spheu(o,&s[i][4]); /* twopm(o); */ sphrv(w,ri,th,g*th); sphap(u,o,w,&s[i][0]); c1=-1.0; c2=-1.0; m0=3; pltms(u[0],u[2],0); for (k=0; k<n; k++) { th+=dh; sphrv(w,ri,th,g*th); sphap(w,o,w,&s[i][0]); xx=w[0]-s[j][0]; xx*=xx; yy=w[1]-s[j][1]; yy*=yy; zz=w[2]-s[j][2]; zz*=zz; rr=s[j][3]; rr*=rr; b2=xx+zz-rr; b1=b2+yy; m=3; if (s[i][1]<w[1]) m0=4; else if (b1<0.0) {m=1; m0=1;} else if (w[1]<=s[j][1]) m0=3; else if (b2>=0.0) m0=3; else m=2; switch (m0) { case 1: pltil(u[0],u[2],c1,w[0],w[2],b1,i+1); break; case 2: pltil(u[0],u[2],c2,w[0],w[2],b2,i+1); break; case 3: pltil(u[0],u[2],1.0,w[0],w[2],1.0,i+1); break; case 4: pltil(u[0],u[2],-1.0,w[0],w[2],-1.0,i+1); break; case 5: pltms(w[0],w[2],i+1); break; default: break; } u[0]=w[0]; u[1]=w[1]; u[2]=w[2]; c1=b1; c2=b2; m0=m; } /* end for k */ } /* end for j */ }