www.pudn.com > RayTracing Code.rar > Vector.cpp, change:2004-04-11,size:8118b
/** 3DGPL *************************************************\
* () *
* Header for operations on vectors used by the ray *
* tracer. *
* *
* Defines: *
* V_zero Initialize a vector; *
* V_vector_coordinates Set the vector's coordinates;*
* V_vector_points Make a vector from points; *
* V_set Copy a vector; *
* V_multiply Multiply by a scalar; *
* V_scalar_product Find a scalar product; *
* V_vector_product Find a vector product; *
* V_sum Sum two vectors; *
* V_difference Compute difference; *
* V_unit_vector Compute unit vector; *
* V_plane Coeffs of a plane equation; *
* V_vertex_on_plane Checks if in the plane. *
* *
* (c) 1995-98 Sergei Savchenko, (savs@cs.mcgill.ca) *
\**********************************************************/
#include <math.h> /* sqrt */
#include "vector.h" /* self definition */
/**********************************************************\
* Initialize a vector to zero. *
* *
* RETURNS: Initializeed vector. *
* -------- *
\**********************************************************/
float *V_zero(float *vec)
{
//Ò»¸öfloatÐ͵ÄÖ¸ÕëºÍÒ»¸öʸÁ¿ÓÐʲô¹ØÏµå
vec[0]=0; vec[1]=0; vec[2]=0; return(vec);
}
/**********************************************************\
* Sets the coordinates of a vector. *
* *
* RETURNS: Resulting vector. *
* -------- *
\**********************************************************/
float *V_vector_coordinates(float *vector,float x,float y,float z)
{
vector[0]=x;
vector[1]=y;
vector[2]=z;
return(vector);
}
/**********************************************************\
* Computes a vector base on the coordinates of the *
* beginning and the end. *
* *
* RETURNS: Resulting vector. *
* -------- *
\**********************************************************/
float *V_vector_points(float *vector,float *from,float *to)
{
vector[0]=to[0]-from[0];
vector[1]=to[1]-from[1];
vector[2]=to[2]-from[2];
return(vector);
}
/**********************************************************\
* Copy a vector from another vector. *
* *
* RETURNS: Resulting vector. *
* -------- *
\**********************************************************/
float *V_set(float *what,float *to)
{
what[0]=to[0]; what[1]=to[1]; what[2]=to[2];
return(what);
}
/**********************************************************\
* Multiply a vector by a scalar number. *
* *
* RETURNS: Resulting vector. *
* -------- *
\**********************************************************/
float *V_multiply(float *result,float *vector,float m)
{
result[0]=vector[0]*m; result[1]=vector[1]*m; result[2]=vector[2]*m;
return(result);
}
/**********************************************************\
* Computes a scalar product of two vectors. *
* *
* RETURNS: Scalar product. *
* -------- *
\**********************************************************/
float V_scalar_product(float *a,float *b)
{
return(a[0]*b[0]+a[1]*b[1]+a[2]*b[2]);
}
/**********************************************************\
* Computes a vector product of two vectors. *
* *
* RETURNS: Vector product. *
* -------- *
\**********************************************************/
float* V_vector_product(float *product,float *a,float *b)
{
product[0]=a[1]*b[2]-a[2]*b[1];
product[1]=a[2]*b[0]-a[0]*b[2];
product[2]=a[0]*b[1]-a[1]*b[0];
return(product);
}
/**********************************************************\
* Computes a sum of two vectors. *
* *
* RETURNS: Resulting vector. *
* -------- *
\**********************************************************/
float *V_sum(float *sm,float *a,float *b)
{
sm[0]=a[0]+b[0]; sm[1]=a[1]+b[1]; sm[2]=a[2]+b[2];
return(sm);
}
/**********************************************************\
* Computes difference of two vectors. *
* *
* RETURNS: Resulting vector. *
* -------- *
\**********************************************************/
float *V_difference(float *differ,float *a,float *b)
{
differ[0]=a[0]-b[0]; differ[1]=a[1]-b[1]; differ[2]=a[2]-b[2];
return(differ);
}
/**********************************************************\
* Computes a unit length vector base on the coordinates *
* of the beginning and the end. *
* *
* RETURNS: Resulting vector. *
* -------- *
\**********************************************************/
float *V_unit_vector(float *vector,float *from,float *to)
{
float lng;
vector[0]=to[0]-from[0]; vector[1]=to[1]-from[1]; vector[2]=to[2]-from[2];
lng=sqrt(vector[0]*vector[0]+vector[1]*vector[1]+vector[2]*vector[2]);
vector[0]/=lng; vector[1]/=lng; vector[2]/=lng;
//·µ»ØµÄÊǵ¥Î»»¯¹ýµÄ·½ÏòʸÁ¿
return(vector);
}
/**********************************************************\
* Computes coefficients of a plane equation. *
* *
* RETURNS: Pointer to the coefficients. *
* -------- *
\**********************************************************/
float *V_plane(float *plane,float *normal,float *origine)
{
plane[0]=normal[0];
plane[1]=normal[1];
plane[2]=normal[2];
plane[3]=-(origine[0]*normal[0]+origine[1]*normal[1]+origine[2]*normal[2]);
return(plane);
}
/**********************************************************\
* Checking if a vertex belongs to the plane. *
* *
* RETURNS: 0 when the vertex belongs to the plane; *
* -------- "+" when in the normal pointed *
* halfplane; *
* "-" otherwise. *
\**********************************************************/
float V_vertex_on_plane(float *plane,float *vertex)
{
return(vertex[0]*plane[0]+
vertex[1]*plane[1]+
vertex[2]*plane[2]+
plane[3]
);
}
/**********************************************************/