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