www.pudn.com > 3dSimplifier.zip > Geometry.h, change:1999-06-03,size:6162b


/* geometry.h 常用数学操作宏定义 
 * 作者:周昆 1998 
 */ 
    
/* Protection from multiple includes. */
#ifndef INCLUDED_OFFSET_GEOMETRY_H
#define INCLUDED_OFFSET_GEOMETRY_H
 
#include <math.h> 

#include <stdio.h>

#define LO 0
#define HI 1

#define X 0
#define Y 1
#define Z 2

#define FALSE           0
#define TRUE            1

/*--------------------------------- Macros ----------------------------------*/

#define FMAX(x,y) ((x)>(y) ? (x) : (y))
#define FMIN(x,y) ((x)<(y) ? (x) : (y))
#define MAX(x,y) ((x)>(y) ? (x) : (y)) 
#define MIN(x,y) ((x)<(y) ? (x) : (y)) 
#define POINT_IN_BOX(p,box) \ 
	((p[X]<box[HI][X])&&(p[Y]<box[HI][Y])&&(p[Z]<box[HI][Z])&&(p[X]>=box[LO][X])&&(p[Y]>=box[LO][Y])&&(p[Z]>=box[LO][Z])) 
 
#define BBOX_OVERLAP(box1, box2)						\ 
    (((((box1)[HI][X]  (box2)[LO][X]) || ((box2)[HI][X]  (box1)[LO][X])) ||	\ 
     (((box1)[HI][Y]  (box2)[LO][Y]) || ((box2)[HI][Y]  (box1)[LO][Y])) ||	\ 
     (((box1)[HI][Z]  (box2)[LO][Z]) || ((box2)[HI][Z]  (box1)[LO][Z]))) ?	\ 
       FALSE : TRUE) 
 

#define BBOX_OVERLAP(box1, box2)						\
    (((((box1)[HI][X]  (box2)[LO][X]) || ((box2)[HI][X]  (box1)[LO][X])) ||	\
     (((box1)[HI][Y]  (box2)[LO][Y]) || ((box2)[HI][Y]  (box1)[LO][Y])) ||	\
     (((box1)[HI][Z]  (box2)[LO][Z]) || ((box2)[HI][Z]  (box1)[LO][Z]))) ?	\
       FALSE : TRUE)


/*==================== 3D vector macros ===================*/

#define VEC3_ZERO(vec)	       { (vec)[0]=(vec)[1]=(vec)[2]=0; }
#define VEC4_ZERO(vec)	       { (vec)[0]=(vec)[1]=(vec)[2]=(vec)[3]=0; }
#define VEC3_NEG(dest,src)     { (dest)[0]= -(src)[0]; (dest)[1]= -(src)[1];(dest)[2]= -(src)[2];}
#define VEC4_NEG(dest,src)     { (dest)[0]= -(src)[0]; (dest)[1]= -(src)[1];(dest)[2]= -(src)[2]; (dest)[3]=-(src)[3];}
#define VEC3_EQ(a,b)           (((a)[0]==(b)[0]) && ((a)[1]==(b)[1]) && ((a)[2]==(b)[2]))
#define VEC4_EQ(a,b)           (((a)[0]==(b)[0]) && ((a)[1]==(b)[1]) && ((a)[2]==(b)[2])&&((a)[3]==(b)[3]))
#define ZERO3_TOL(a, tol)      { (a)[0] = (((a)[0]<tol)&&((a)[0]>-tol))?0.0:(a)[0];\
				 (a)[1] = (((a)[1]<tol)&&((a)[1]>-tol))?0.0:(a)[1];\
			         (a)[2] = (((a)[2]<tol)&&((a)[2]>-tol))?0.0:(a)[2];\
			       }

#define VEC3_V_OP_S(a,b,op,c)  {  (a)[0] = (b)[0] op (c);  \
				  (a)[1] = (b)[1] op (c);  \
				  (a)[2] = (b)[2] op (c);  }

#define VEC4_V_OP_S(a,b,op,c)  {  (a)[0] = (b)[0] op (c);  \
				  (a)[1] = (b)[1] op (c);  \
				  (a)[2] = (b)[2] op (c);  \
				  (a)[3] = (b)[3] op (c);  }

#define VEC3_V_OP_V(a,b,op,c)  { (a)[0] = (b)[0] op (c)[0]; \
				 (a)[1] = (b)[1] op (c)[1]; \
				 (a)[2] = (b)[2] op (c)[2]; \
				}

#define VEC4_V_OP_V(a,b,op,c)  { (a)[0] = (b)[0] op (c)[0]; \
				 (a)[1] = (b)[1] op (c)[1]; \
				 (a)[2] = (b)[2] op (c)[2]; \
				 (a)[3] = (b)[3] op (c)[3]; \
				}

#define VEC3_V_OP_V_OP_S(a,b,op1,c,op2,d)  \
				{ (a)[0] = (b)[0] op1 (c)[0] op2 (d); \
				  (a)[1] = (b)[1] op1 (c)[1] op2 (d); \
				  (a)[2] = (b)[2] op1 (c)[2] op2 (d); }

#define VEC3_VOPV_OP_S(a,b,op1,c,op2,d)  \
				{ (a)[0] = ((b)[0] op1 (c)[0]) op2 (d); \
				  (a)[1] = ((b)[1] op1 (c)[1]) op2 (d); \
				  (a)[2] = ((b)[2] op1 (c)[2]) op2 (d); }

#define VEC3_V_OP_V_OP_V(a,b,op1,c,op2,d)  \
				{ (a)[0] = (b)[0] op1 (c)[0] op2 (d)[0]; \
				  (a)[1] = (b)[1] op1 (c)[1] op2 (d)[1]; \
				  (a)[2] = (b)[2] op1 (c)[2] op2 (d)[2]; }

#define VEC3_ASN_OP(a,op,b)      {a[0] op b[0]; a[1] op b[1]; a[2] op b[2];}
#define VEC4_ASN_OP(a,op,b)      {a[0] op b[0]; a[1] op b[1]; a[2] op b[2]; a[3] op b[3];}

#define DOTPROD3(a, b)		 ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2])
#define DOTPROD4(a, b)		 ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2] + (a)[3]*(b)[3])

#define CROSSPROD3(a,b,c)       {(a)[0]=(b)[1]*(c)[2]-(b)[2]*(c)[1]; \
                                 (a)[1]=(b)[2]*(c)[0]-(b)[0]*(c)[2]; \
                                 (a)[2]=(b)[0]*(c)[1]-(b)[1]*(c)[0];}


#define SQ_DIST3(a, b)          (((a)[0]-(b)[0])*((a)[0]-(b)[0]) +      \
                                 ((a)[1]-(b)[1])*((a)[1]-(b)[1]) +      \
                                 ((a)[2]-(b)[2])*((a)[2]-(b)[2]))

/* assumes normalized plane normal */
#define POINT_PLANE_DIST(point, plane)  (DOTPROD3(point,plane)-plane[3])

/*==================== Transformation Macros===================*/
#define TRANSFORM_POINT(dest_point, matrix, src_point)		\
        {							\
            (dest_point)[X] = (matrix)[0][0]*(src_point)[X] +	\
		              (matrix)[0][1]*(src_point)[Y] +	\
			      (matrix)[0][2]*(src_point)[Z] +	\
			      (matrix)[0][3];			\
            (dest_point)[Y] = (matrix)[1][0]*(src_point)[X] +	\
		              (matrix)[1][1]*(src_point)[Y] +	\
			      (matrix)[1][2]*(src_point)[Z] +	\
			      (matrix)[1][3];			\
            (dest_point)[Z] = (matrix)[2][0]*(src_point)[X] +	\
		              (matrix)[2][1]*(src_point)[Y] +	\
			      (matrix)[2][2]*(src_point)[Z] +	\
			      (matrix)[2][3];			\
        }

#define TRANSFORM_VECTOR(dest_vector, matrix, src_vector)	\
        {							\
            (dest_vector)[X] = (matrix)[0][0]*(src_vector)[X] +	\
		               (matrix)[0][1]*(src_vector)[Y] +	\
			       (matrix)[0][2]*(src_vector)[Z];	\
            (dest_vector)[Y] = (matrix)[1][0]*(src_vector)[X] +	\
		               (matrix)[1][1]*(src_vector)[Y] +	\
			       (matrix)[1][2]*(src_vector)[Z];	\
            (dest_vector)[Z] = (matrix)[2][0]*(src_vector)[X] +	\
		               (matrix)[2][1]*(src_vector)[Y] +	\
			       (matrix)[2][2]*(src_vector)[Z];	\
        }




#define VERTS_TO_LINESEG(vert1, vert2, lineseg)				\
        {								\
	    VEC3_ASN_OP((lineseg).endpoints[0], =, (vert1)->coord);	\
	    VEC3_ASN_OP((lineseg).endpoints[1], =, (vert2)->coord);	\
	}

/*---------------------------------- Types ----------------------------------*/


typedef float Point[3];
typedef float Vector[3];
typedef float Matrix[3][4];
typedef float Extents[2][3];

typedef struct RawTriangle
{
    Point  verts[3];
    float plane_eq[4];
} RawTriangle;

typedef struct RawEdge
{
    Point  verts[2];
} RawEdge;

typedef struct LineSegment
{
    Point  endpoints[2];
} LineSegment;


/* Protection from multiple includes. */
#endif INCLUDED_OFFSET_GEOMETRY_H