Geometry.h
上传用户:lin85885
上传日期:2013-04-27
资源大小:796k
文件大小:6k
- /* 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