Geometry.h
上传用户:lin85885
上传日期:2013-04-27
资源大小:796k
文件大小:6k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. /* geometry.h 常用数学操作宏定义
  2.  * 作者:周昆 1998
  3.  */
  4.    
  5. /* Protection from multiple includes. */ #ifndef INCLUDED_OFFSET_GEOMETRY_H #define INCLUDED_OFFSET_GEOMETRY_H
  6. #include <math.h>
  7. #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))
  8. #define MIN(x,y) ((x)<(y) ? (x) : (y))
  9. #define POINT_IN_BOX(p,box) 
  10. ((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]))
  11. #define BBOX_OVERLAP(box1, box2)
  12.     (((((box1)[HI][X] < (box2)[LO][X]) || ((box2)[HI][X] < (box1)[LO][X])) ||
  13.      (((box1)[HI][Y] < (box2)[LO][Y]) || ((box2)[HI][Y] < (box1)[LO][Y])) ||
  14.      (((box1)[HI][Z] < (box2)[LO][Z]) || ((box2)[HI][Z] < (box1)[LO][Z]))) ?
  15.        FALSE : TRUE)
  16. #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