ftp.nice.ch/pub/next/graphics/3d/geomview.1.4.1.s.tar.gz#/Geomview/src/lib/gprim/discgrp/dhpoint3.c

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.