Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

bloomenthal.h

Go to the documentation of this file.
00001 #ifndef BLOOMENTHAL_H
00002 #define BLOOMENTHAL_H
00003 
00004 #include "Implicit/Implicit.h"
00005 #include "jbvertices.h"
00006 
00007 #define RES     10 /* # converge iterations    */
00008 
00009 #define JB_L       0  /* left direction:   -x, -i */
00010 #define JB_R       1  /* right direction:  +x, +i */
00011 #define JB_B       2  /* bottom direction: -y, -j */
00012 #define JB_T       3  /* top direction:    +y, +j */
00013 #define JB_N       4  /* near direction:   -z, -k */
00014 #define JB_F       5  /* far direction:    +z, +k */
00015 #define JB_LBN     0  /* left bottom near corner  */
00016 #define JB_LBF     1  /* left bottom far corner   */
00017 #define JB_LTN     2  /* left top near corner     */
00018 #define JB_LTF     3  /* left top far corner      */
00019 #define JB_RBN     4  /* right bottom near corner */
00020 #define JB_RBF     5  /* right bottom far corner  */
00021 #define JB_RTN     6  /* right top near corner    */
00022 #define JB_RTF     7  /* right top far corner     */
00023 
00024 /* the LBN corner of cube (i, j, k), corresponds with location
00025  * (start.x+(i-.5)*size, start.y+(j-.5)*size, start.z+(k-.5)*size) */
00026 
00027 #define RAND()    ((rand()&32767)/32767.)  /* random number, 0--1 */
00028 #define HASHBIT   (5)
00029 #define HSIZE     (size_t)(1<<(3*HASHBIT)) /* hash table size (32768) */
00030 #define MASK      ((1<<HASHBIT)-1)
00031 #define HASH(i,j,k) \
00032 ((((((i)&MASK)<<HASHBIT)|((j)&MASK))<<HASHBIT)|((k)&MASK))
00033 #define BIT(i, bit) (((i)>>(bit))&1)
00034 #define FLIP(i,bit) ((i)^1<<(bit)) /* flip the given bit of i */
00035 
00036 class jbTest {                   /* test the function for a signed value */
00037 public:
00038     gmVector3 pt;                       /* location of test */
00039     double value;                   /* function value at p */
00040     int ok;                        /* if value is of correct sign */
00041 };
00042 
00043 class jbCornerlist {        /* list of corners */
00044 public:
00045     int i, j, k;                   /* corner id */
00046     double value;                   /* corner value */
00047     jbCornerlist *next;       /* remaining elements */
00048 };
00049 
00050 class jbCube {                   /* partitioning cell (cube) */
00051 public:
00052     int i, j, k;                   /* lattice location of cube */
00053     jbCornerlist *corners[8];        /* eight corners */
00054 };
00055 
00056 class jbCubes {             /* linked list (stack) of cubes */
00057 public:
00058     jbCube cube;                     /* a single cube */
00059     jbCubes *next;            /* remaining elements */
00060 };
00061 
00062 class jbCenterlist {        /* list of cube locations */
00063 public:
00064     int i, j, k;                   /* cube location */
00065     jbCenterlist *next;       /* remaining elements */
00066 };
00067 
00068 class jbEdgelist {          /* list of edges */
00069 public:
00070     int i1, j1, k1, i2, j2, k2;    /* edge corner ids */
00071     int vid;                       /* vertex id */
00072     jbEdgelist *next;         /* remaining elements */
00073 };
00074 
00075 class jbIntlist {           /* list of integers */
00076 public:
00077     int i;                         /* an integer */
00078     jbIntlist *next;          /* remaining elements */
00079 };
00080 
00081 class jbIntlists {          /* list of list of integers */
00082 public:
00083     jbIntlist *list;                 /* a list of integers */
00084     jbIntlists *next;         /* remaining elements */
00085 };
00086 
00087 class jbProcess {           /* parameters, function, storage */
00088 public:
00089 //    double (*function)(gmVector3 x); /* implicit surface function */
00090         Implicit *f;
00091     int (*triproc)(int i1, int i2,
00092       int i3, jbVertices vertices);  /* triangle output function */
00093     double size, delta;             /* cube size, normal delta */
00094     int bounds;                    /* cube range within lattice */
00095     gmVector3 start;                   /* start point on surface */
00096     jbCubes *cubes;                  /* active cubes */
00097     jbVertices vertices;             /* surface vertices */
00098     jbCenterlist **centers;          /* cube center hash table */
00099     jbCornerlist **corners;          /* corner value hash table */
00100     jbEdgelist **edges;              /* edge and vertex id hash table */
00101 
00102         char *polygonize (
00103 //              double (*function)(gmVector3 x),
00104                 Implicit *f,
00105                 double size,
00106                 int bounds,
00107                 gmVector3 x,
00108                 int (*triproc)(int i1, int i2, int i3, jbVertices vertices)
00109         );
00110         char *marchingcubes (
00111                 Implicit *f,
00112                 double size,
00113                 gmVector3 x0, gmVector3 x1,
00114                 int (*triproc)(int i1, int i2, int i3, jbVertices vertices)
00115         );
00116         void freeprocess();
00117         void testface (int i, int j, int k, jbCube *old, int face, int c1, int c2, int c3, int c4);
00118         gmVector3 setpoint (int i, int j, int k);
00119         jbCornerlist *setcorner (int i, int j, int k);
00120         jbTest find(int sign, gmVector3 x);
00121         int dotet (jbCube *cube, int c1, int c2, int c3, int c4);
00122         int setcenter(int i, int j, int k);
00123         void setedge (int i1, int j1, int k1, int i2, int j2, int k2, int vid);
00124         int getedge (int i1, int j1, int k1, int i2, int j2, int k2);
00125         int vertid (jbCornerlist *c1, jbCornerlist *c2);
00126         gmVector3 converge (gmVector3 p1, gmVector3 p2, double v);
00127 
00128 };
00129 
00130 char *mycalloc (int nitems, int nbytes);
00131 
00132 #endif
00133 

Generated on Mon Jun 28 14:58:13 2004 for Advanced Surface Library by doxygen 1.3.4