1 #include <stdio.h> 2 #include <math.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include <sys/time.h> 6 #include "linalg.h" 7 8 #ifdef EXTERN 9 #undef EXTERN 10 #define EXTERN 11 #else 12 #define EXTERN extern 13 #endif 14 15 16 /*------------------ various consts ----------------------------------*/ 17 18 #define X 0 19 #define Y 1 20 #define Z 2 21 22 #define TRUE 1 23 #define FALSE 0 24 25 /* constants defined to prevent unnecessary double->float ops on i860's */ 26 #define ZERO (float)(0.0) 27 #define EPS (float)(1e-5) 28 #define LP_EPS (float)(1e-5) 29 #define GP_EPS (float)(1e-3) 30 #define EPSILON (float)(1e-7) 31 #define HALF (float)(0.5) 32 #define FCEIL (float)(0.999999) 33 #define ONE (float)(1.0) 34 #define FCEIL_PLUS_1 (float)(1.999999) 35 #define PI (float)(3.14159265358979323846) 36 #define TWO_PI (float)(6.28318530717958647692) 37 #define DEG_TO_RAD (float)(.01745329251994329576) /* pi/180 */ 38 39 #define MINC 0 40 #define MAXC 1 41 42 #define MAX_TESS_LEN 1.2 43 44 #define MAX_TYPES 5 45 46 #define MAX_DENSITY 15 /* max no of atoms in a voxel(odd for algn) */ 47 48 #define MAX_CONSTRAINT 4000 /* 700 */ 49 #define PERT_Q 4001 /* smallest prime exceeding MAX_CONSTRAINT*/ 50 51 52 53 /*-------------------- general-purpose macros ------------------------*/ 54 55 #define START gettimeofday(&tm,&tz);\ 56 et = (tm.tv_sec)+ (0.000001* (tm.tv_usec)); 57 58 #define STOP gettimeofday(&tm,&tz);\ 59 et = (tm.tv_sec)+(0.000001*(tm.tv_usec)) - et; 60 61 #define ALLOCN(PTR,TYPE,N) \ 62 { PTR = (TYPE *) malloc(((unsigned)(N))*sizeof(TYPE)); \ 63 if (PTR == NULL) { \ 64 printf("malloc failed"); \ 65 exit(-1); \ 66 } \ 67 } 68 69 #define FMAX(x,y) ((x)>(y) ? (x) : (y)) 70 #define FMIN(x,y) ((x)<(y) ? (x) : (y)) 71 #define FP_EQ_EPS( a, b, c ) ((((a) - (b)) < (c)) && (((a) - (b)) > -(c))) 72 #define INDEX(x, y, z, num) (((x)*(num[1]) + (y))*(num[2]) + (z)) 73 #define AINDEX(a, num) (((a[0])*(num[1]) + (a[1]))*(num[2]) + (a[2])) 74 #define SQ(a) ((a)*(a)) 75 76 /*---------------------------structs-------------------------------------*/ 77 typedef unsigned char byte; 78 79 typedef double POINT[3]; 80 81 typedef struct 82 { float coeff[4]; 83 int atom_id; 84 } Vector; 85 86 87 typedef float VectorType[3]; /* vector in three-space */ 88 typedef float PointType[3]; /* point in homogenous three-space */ 89 typedef struct { 90 PointType Coord; 91 VectorType Normal; 92 } VertexType; 93 94 typedef struct 95 { float radius; 96 float center[3]; 97 float tes_origin[3]; 98 short num_cons; 99 short type; 100 short boundary; 101 } Gp_Atom; 102 103 typedef struct 104 { short num_neighbors; 105 short neighbor[MAX_DENSITY]; 106 } Atom_List; 107 108 struct Torus 109 { int face_atoms[2]; 110 int end_atoms[2]; 111 int face_id; 112 int edge_id[2]; 113 int num_int_verts; 114 struct Torus *next; 115 struct Torus *prev; 116 }; 117 118 typedef struct 119 { VertexType vt; 120 POINT tes_dir; 121 } Big_Point; 122 123 124 /*---------------------------variables-------------------------------------*/ 125 extern double find_area(); 126 extern double find_angle(); 127 extern double sph_dist(); 128 extern int linear_prog(); 129 extern int find_circle(); 130 extern int find_vertex_order(); 131 132 EXTERN float Probe_radius; 133 EXTERN Gp_Atom *atoms; 134 EXTERN int Num_atoms; 135 EXTERN int Checks_On; 136 EXTERN int Max_Gp_Polys; 137 EXTERN double Max_Tess_Len, Max_Tess_Len_Sq; 138 EXTERN VertexType **verts; 139 EXTERN short *atom_type; 140 EXTERN int Num_polys; 141 EXTERN Vector New_Origin; 142 EXTERN int Current_atom; 143 EXTERN FILE *Opf; 144 EXTERN Vector temp_cons[2][MAX_CONSTRAINT+6]; 145 EXTERN int Write_Option; 146 EXTERN struct timeval tm; 147 EXTERN struct timezone tz; 148 EXTERN double et; 149 EXTERN_LINALG 150