This is dhpoint3.c in view mode; [Download] [Up]
#include <stdio.h> #include "vec4.h" #include "dgflag.h" #include "math.h" double DHPt3Dot(point4 v0, point4 v1, int metric) { switch (metric) { case DG_EUCLIDEAN: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3]); break; case DG_HYPERBOLIC: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] - v0[3]*v1[3]); break; case DG_SPHERICAL: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3]); break; } } double DHPt3Dot3(point4 v0, point4 v1, int metric) { switch (metric) { case DG_EUCLIDEAN: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2]); break; case DG_HYPERBOLIC: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] - v0[3]*v1[3]); break; case DG_SPHERICAL: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3]); break; } } double DHPt3Distance(point4 p0, point4 p1, int metric) { double d0, d1; point4 diff; switch (metric) { case DG_EUCLIDEAN: VSUB3(p0,p1, diff); return(MAGNITUDE3(diff)); break; case DG_HYPERBOLIC: d0 =INPRO31(p0, p0); d1 =INPRO31(p1, p1); if (d0 >= 0.0 || d1 >= 0.0) { fprintf(stderr,"Invalid points in dist_proj3\n"); return(0.0); } return(acosh( ABS( INPRO31(p0, p1) / sqrt(d0 * d1)))); break; case DG_SPHERICAL: d0 =INPRO31(p0, p0); d1 =INPRO31(p1, p1); return(acos( ABS( INPRO4(p0, p1) / sqrt(d0 * d1)))); break; } } void DHPt3PerpBisect(point4 p0, point4 p1, point4 result, int metric) { switch (metric) { case DG_EUCLIDEAN: { point4 tmp; double t; VSUB3(p1, p0, result) VADD3(p0, p1, tmp) VSCALE3(tmp, .5, tmp) result[3] = -(VDOT3(tmp, result)); } break; case DG_HYPERBOLIC: NORMALIZE31(p0); NORMALIZE31(p1); VSUB4(p0, p1, result) if (INPRO31(p0, result) > 0.0) VSCALE4(result, -1, result) break; case DG_SPHERICAL: NORMALIZE4(p0); NORMALIZE4(p1); VSUB4(p0, p1, result) if (INPRO4(p0, result) > 0.0) VSCALE4(result, -1, result) break; } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.