home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 8
/
CDASC08.ISO
/
NEWS
/
RADIANCE
/
SRC
/
COMMON
/
FVECT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-10-07
|
3KB
|
140 lines
/* Copyright (c) 1986 Regents of the University of California */
#ifndef lint
static char SCCSid[] = "@(#)fvect.c 2.2 10/2/92 LBL";
#endif
/*
* fvect.c - routines for float vector calculations
*
* 8/14/85
*/
#include <math.h>
#include "fvect.h"
double
fdot(v1, v2) /* return the dot product of two vectors */
register FVECT v1, v2;
{
return(DOT(v1,v2));
}
double
dist2(p1, p2) /* return square of distance between points */
register FVECT p1, p2;
{
static FVECT delta;
delta[0] = p2[0] - p1[0];
delta[1] = p2[1] - p1[1];
delta[2] = p2[2] - p1[2];
return(DOT(delta, delta));
}
double
dist2line(p, ep1, ep2) /* return square of distance to line */
FVECT p; /* the point */
FVECT ep1, ep2; /* points on the line */
{
static double d, d1, d2;
d = dist2(ep1, ep2);
d1 = dist2(ep1, p);
d2 = dist2(ep2, p);
return(d1 - (d+d1-d2)*(d+d1-d2)/d/4);
}
double
dist2lseg(p, ep1, ep2) /* return square of distance to line segment */
FVECT p; /* the point */
FVECT ep1, ep2; /* the end points */
{
static double d, d1, d2;
d = dist2(ep1, ep2);
d1 = dist2(ep1, p);
d2 = dist2(ep2, p);
if (d2 > d1) { /* check if past endpoints */
if (d2 - d1 > d)
return(d1);
} else {
if (d1 - d2 > d)
return(d2);
}
return(d1 - (d+d1-d2)*(d+d1-d2)/d/4); /* distance to line */
}
fcross(vres, v1, v2) /* vres = v1 X v2 */
register FVECT vres, v1, v2;
{
vres[0] = v1[1]*v2[2] - v1[2]*v2[1];
vres[1] = v1[2]*v2[0] - v1[0]*v2[2];
vres[2] = v1[0]*v2[1] - v1[1]*v2[0];
}
fvsum(vres, v0, v1, f) /* vres = v0 + f*v1 */
FVECT vres, v0, v1;
double f;
{
vres[0] = v0[0] + f*v1[0];
vres[1] = v0[1] + f*v1[1];
vres[2] = v0[2] + f*v1[2];
}
double
normalize(v) /* normalize a vector, return old magnitude */
register FVECT v;
{
static double len;
len = DOT(v, v);
if (len <= 0.0)
return(0.0);
/****** problematic
if (len >= (1.0-FTINY)*(1.0-FTINY) &&
len <= (1.0+FTINY)*(1.0+FTINY))
return(1.0);
******/
len = sqrt(len);
v[0] /= len;
v[1] /= len;
v[2] /= len;
return(len);
}
spinvector(vres, vorig, vnorm, theta) /* rotate vector around normal */
FVECT vres, vorig, vnorm;
double theta;
{
double sint, cost, normprod;
FVECT vperp;
register int i;
if (theta == 0.0) {
if (vres != vorig)
VCOPY(vres, vorig);
return;
}
cost = cos(theta);
sint = sin(theta);
normprod = DOT(vorig, vnorm)*(1.-cost);
fcross(vperp, vnorm, vorig);
for (i = 0; i < 3; i++)
vres[i] = vorig[i]*cost + vnorm[i]*normprod + vperp[i]*sint;
}