// Example of tetrahedron volumes to get relative rotation WRT a segment int xCoord[5],yCoord[5],zCoord[5]; /*--------------------------------------------------------------------- O'Rourke ---------------------------------------------------------------------*/ double Volumei(int a, int b, int c, int p) { double vol; double ax, ay, az, bx, by, bz, cx, cy, cz; ax = xCoord[a] - xCoord[p]; ay = yCoord[a] - yCoord[p]; az = zCoord[a] - zCoord[p]; bx = xCoord[b] - xCoord[p]; by = yCoord[b] - yCoord[p]; bz = zCoord[b] - zCoord[p]; cx = xCoord[c] - xCoord[p]; cy = yCoord[c] - yCoord[p]; cz = zCoord[c] - zCoord[p]; vol = ax * (by*cz - bz*cy) + ay * (bz*cx - bx*cz) + az * (bx*cy - by*cx); return vol; } main() { int a=0,b=1,c=2,d=3,cPrime=4; xCoord[a]=50; yCoord[a]=50; zCoord[a]=50; xCoord[b]=50; yCoord[b]=20; zCoord[b]=50; //xCoord[c]=80; xCoord[c]=150; yCoord[c]=35; zCoord[c]=80; xCoord[d]=70; yCoord[d]=40; zCoord[d]=40; xCoord[cPrime]=80; yCoord[cPrime]=25; zCoord[cPrime]=60; printf("Volumei(a,b,c,d)=%f\n\n",Volumei(a,b,c,d)); printf("Volumei(a,b,cPrime,d)=%f\n\n",Volumei(a,b,cPrime,d)); printf("Volumei(a,b,c,cPrime)=%f\n\n",Volumei(a,b,c,cPrime)); }