Trisurf Monte Carlo simulator
Samo Penic
2010-12-27 3131dcbf73ff8a0699a688119d57eaf386f49590
commit | author | age
d7639a 1 #include<stdlib.h>
SP 2 #include<stdio.h>
3 #include "general.h"
4 #include "triangle.h"
5 #include<math.h>
6
bb77ca 7 /** @brief Prepares the list for triangles.
SP 8   *
9   * Create empty list for holding the information on triangles. Triangles are
10   * added later on with triangle_add().
11   * Returns pointer to the tlist datastructure it has created. This pointer must
12   * be assigned to some variable or it will be lost.
13   *
14   *
15   * Example of usage:
16   *     ts_triangle_list *tlist;
17   *        tlist=triangle_data_free();
18   *
19   *        Initalized data structure for holding the information on triangles.
20   *        
21   */
a2a676 22 ts_triangle_list *init_triangle_list(){
SP 23     ts_triangle_list *tlist=(ts_triangle_list *)malloc(sizeof(ts_triangle_list));
d7639a 24     tlist->n = 0;
a2a676 25     tlist->tria=NULL;
SP 26     return tlist;
d7639a 27 }
SP 28
bb77ca 29 /** @brief Add the triangle to the triangle list and create necessary data
SP 30  * structures.
31   *
32   * Add the triangle ts_triangle with ts_triangle_data to the ts_triangle_list.
33   * The triangle list is resized, the ts_triangle is allocated and
34   * ts_triangle_data is allocated and zeroed. The function receives 4 arguments:
35   * ts_triangle_list *tlist as list of triangles and 3 ts_vertex *vtx as
36   * vertices that are used to form a triangle. Returns a pointer to newly
37   * created triangle. This pointer doesn't need assigning, since it is
38   * referenced by triangle list.
39   *
40   * WARNING: Function can be accelerated a bit by removing the NULL checks.
41   * However the time gained by removal doesn't justify the time spent by
42   * debugging stupid NULL pointers.
43   *
44   * Example of usage:
45   *        triangle_add(tlist, vlist->vtx[1], vlist->vtx[2], vlist->vtx[3]);
46   *
47   *        Creates a triangle with given vertices and puts it into the list.
48   *        
49   */
a2a676 50 ts_triangle *triangle_add(ts_triangle_list *tlist, ts_vertex *vtx1, ts_vertex *vtx2, ts_vertex *vtx3){
SP 51         if(vtx1==NULL || vtx2==NULL || vtx3==NULL){
52             return NULL;
53         }
d7639a 54         tlist->n++;
a2a676 55         tlist->tria=(ts_triangle **)realloc(tlist->tria,tlist->n*sizeof(ts_triangle *));
SP 56         if(tlist->tria==NULL) fatal("Cannot reallocate memory for additional ts_triangle.",5);
57
58         tlist->tria[tlist->n-1]=(ts_triangle *)calloc(1,sizeof(ts_triangle));
59         if(tlist->tria[tlist->n-1]==NULL) fatal("Cannot reallocate memory for additional ts_triangle.",5);
60         tlist->tria[tlist->n-1]->data=(ts_triangle_data *)calloc(1,sizeof(ts_triangle_data));
61
d7639a 62         //NOW insert vertices!
a2a676 63         tlist->tria[tlist->n - 1]->idx=tlist->n-1;
SP 64         tlist->tria[tlist->n - 1]->data->vertex[0]=vtx1;
65         tlist->tria[tlist->n - 1]->data->vertex[1]=vtx2;
66         tlist->tria[tlist->n - 1]->data->vertex[2]=vtx3;
67         return tlist->tria[tlist->n-1];
d7639a 68 }
SP 69
bb77ca 70 /** @brief Add the neigbour to triangles.
SP 71   *
72   * Add the neigbour to the list of neighbouring triangles. The
73   * neighbouring triangles are those, who share two vertices. Function resizes
74   * the list and adds the pointer to neighbour. It receives two arguments of
75   * ts_triangle type. It then adds eachother to eachother's list. Upon
76   * success it returns TS_SUCCESS, upon detecting NULL pointers 
77   * returns TS_FAIL and it FATALY ends when the data structure
78   * cannot be resized.
79   *
80   *
81   * WARNING: Function can be accelerated a bit by removing the NULL checks.
82   * However the time gained by removal doesn't justify the time spent by
83   * debugging stupid NULL pointers.
84   *
85   * Example of usage:
86   *        triangle_remove_neighbour(tlist->tria[3], tlist->tria[4]);
87   *
88   *        Triangles 3 and 4 are not neighbours anymore.
89   *        
90   */
d7639a 91
SP 92 ts_bool triangle_add_neighbour(ts_triangle *tria, ts_triangle *ntria){
a2a676 93     if(tria==NULL || ntria==NULL) return TS_FAIL;
SP 94 /*TODO: check if the neighbour already exists! Now there is no such check
95  * because of the performance issue. */
96     tria->data->neigh_no++;
97     tria->data->neigh=realloc(tria->data->neigh,tria->data->neigh_no*sizeof(ts_triangle *));
98     if(tria->data->neigh == NULL)
d7639a 99             fatal("Reallocation of memory failed during insertion of triangle neighbour in triangle_add_neighbour",3);
a2a676 100     tria->data->neigh[tria->data->neigh_no-1]=ntria;
3131dc 101   
SP 102  
a2a676 103 /* we repeat the procedure for the neighbour */  
3131dc 104 /*    ntria->data->neigh_no++;
a2a676 105     ntria->data->neigh=realloc(ntria->data->neigh,ntria->data->neigh_no*sizeof(ts_triangle *));
SP 106     if(ntria->data->neigh == NULL)
107             fatal("Reallocation of memory failed during insertion of triangle neighbour in triangle_add_neighbour",3);
108     ntria->data->neigh[ntria->data->neigh_no-1]=tria;
3131dc 109 */
d7639a 110     return TS_SUCCESS;
SP 111 }
112
bb77ca 113 /** @brief Remove the neigbours from triangle.
SP 114   *
115   * Removes the neigbour from the list of neighbouring triangles. The
116   * neighbouring triangles are those, who share two vertices. Function resizes
117   * the list and deletes the pointer to neighbour. It receives two arguments of
118   * ts_triangle type. It then removes eachother form eachother's list. Upon
119   * success it returns TS_SUCCESS, upon failure to find the triangle in the
120   * neighbour list returns TS_FAIL and it FATALY ends when the datastructure
121   * cannot be resized.
122   *
123   * WARNING: The function doesn't check whether the pointer is NULL or invalid. It is the
124   * job of programmer to make sure the pointer is valid.
125   *
126   * WARNING: Function is slow. Do not use it often!
127   *
128   * Example of usage:
129   *        triangle_remove_neighbour(tlist->tria[3], tlist->tria[4]);
130   *
131   *        Triangles 3 and 4 are not neighbours anymore.
132   *        
133   */
d7639a 134 ts_bool triangle_remove_neighbour(ts_triangle *tria, ts_triangle *ntria){
a2a676 135     ts_uint i,j=0; 
SP 136     if(tria==NULL || ntria==NULL) return TS_FAIL;
137
138     for(i=0;i<tria->data->neigh_no;i++){
139         if(tria->data->neigh[i]!=ntria){
140             tria->data->neigh[j]=tria->data->neigh[i];
d7639a 141             j++;
SP 142         } 
143     }
a2a676 144     if(j==i) {
SP 145         return TS_FAIL; 
146         //fatal("In triangle_remove_neighbour: Specified neighbour does not exist for given triangle",3);
147     }
148     tria->data->neigh_no--;
149     tria->data->neigh=(ts_triangle **)realloc(tria->data->neigh,tria->data->neigh_no*sizeof(ts_triangle *));
150     if(tria->data->neigh == NULL){
151         fatal("Reallocation of memory failed during removal of vertex neighbour in triangle_remove_neighbour",100);
152     }
153 /* we repeat the procedure for neighbour */
154     for(i=0;i<ntria->data->neigh_no;i++){
155         if(ntria->data->neigh[i]!=tria){
156             ntria->data->neigh[j]=ntria->data->neigh[i];
157             j++;
158         } 
159     }
160     if(j==i) {
161         return TS_FAIL; 
162         //fatal("In triangle_remove_neighbour: Specified neighbour does not exist for given triangle",3);
163     }
164     ntria->data->neigh_no--;
165     ntria->data->neigh=(ts_triangle **)realloc(ntria->data->neigh,ntria->data->neigh_no*sizeof(ts_triangle *));
166     if(ntria->data->neigh == NULL){
167         fatal("Reallocation of memory failed during removal of vertex neighbour in triangle_remove_neighbour",100);
168     }
d7639a 169     return TS_SUCCESS;
SP 170 }
171
bb77ca 172
SP 173 /** @brief Calculates normal vector of the triangle.
174
175   *
176   * Calculate normal vector of the triangle (xnorm, ynorm and znorm) and stores
177   * information in underlying ts_triangle_data data_structure.
178   *
179   * Function receives one argument of type ts_triangle. It should be corectly
180   * initialized with underlying data structure of type ts_triangle_data. the
181   * result is stored in triangle->data->xnorm, triangle->data->ynorm,
182   * triangle->data->znorm. Returns TS_SUCCESS on completion. 
183   *
184   * NOTE: Function uses math.h library. pow function implementation is selected
185   * accordind to the setting in genreal.h
186   *
187   * Example of usage:
188   *        triangle_normal_vector(tlist->tria[3]);
189   *
190   *        Computes normals and stores information into tlist->tria[3]->xnorm,
191   *        tlist->tria[3]->ynorm, tlist->tria[3]->znorm.
192   *        
193   */
d7639a 194 ts_bool triangle_normal_vector(ts_triangle *tria){
SP 195     ts_double x21,x31,y21,y31,z21,z31,xden;
a2a676 196     x21=tria->data->vertex[1]->data->x - tria->data->vertex[0]->data->x;
SP 197     x31=tria->data->vertex[2]->data->x - tria->data->vertex[0]->data->x;
198     y21=tria->data->vertex[1]->data->y - tria->data->vertex[0]->data->y;
199     y31=tria->data->vertex[2]->data->y - tria->data->vertex[0]->data->y;
200     z21=tria->data->vertex[1]->data->z - tria->data->vertex[0]->data->z;
201     z31=tria->data->vertex[2]->data->z - tria->data->vertex[0]->data->z;
d7639a 202
a2a676 203     tria->data->xnorm=y21*z31 - z21*y31;
SP 204     tria->data->ynorm=z21*x31 - x21*z31;
205     tria->data->znorm=x21*y31 - y21*x31;
206     xden=tria->data->xnorm*tria->data->xnorm +
207          tria->data->ynorm*tria->data->ynorm + 
208          tria->data->znorm*tria->data->znorm;
d7639a 209 #ifdef TS_DOUBLE_DOUBLE
SP 210     xden=sqrt(xden);
211 #endif
212 #ifdef TS_DOUBLE_FLOAT
213     xden=sqrtf(xden);
214 #endif
215 #ifdef TS_DOUBLE_LONGDOUBLE
216     xden=sqrtl(xden);
217 #endif
a2a676 218     tria->data->xnorm=tria->data->xnorm/xden;
SP 219     tria->data->ynorm=tria->data->ynorm/xden;
220     tria->data->znorm=tria->data->znorm/xden;    
d7639a 221     return TS_SUCCESS;
SP 222 }
223
224
bb77ca 225
SP 226
227
228 /** @brief Frees the memory allocated for data structure of triangle data
229  * (ts_triangle_data)
230   *
231   * Function frees the memory of ts_triangle_data previously allocated. It
232   * accepts one argument, the address of data structure. It destroys all
233   * pointers the structure might have (currently only neigh -- the pointer to
234   * list of neighbouring triangles) and data structure itself. The return value
235   * is always TS_SUCCESS.
236   *
237   * WARNING: The function doesn't check whether the pointer is NULL or invalid. It is the
238   * job of programmer to make sure the pointer is valid.
239   *
240   * Example of usage:
241   *        triangle_data_free(tlist->tria[3]->data);
242   *
243   *        Clears the data structure with all pointers.
244   *        
245   */
a2a676 246 ts_bool triangle_data_free(ts_triangle_data *data){
SP 247     if(data->neigh!=NULL) free(data->neigh);
248     free(data);
d7639a 249     return TS_SUCCESS;
SP 250 }
251
bb77ca 252 /** @brief Frees the memory allocated for data structure of triangle list
SP 253  * (ts_triangle_list)
254   *
255   * Function frees the memory of ts_triangle_list previously allocated. It
256   * accepts one argument, the address of data structure. It destroys all
257   * ts_triangle's in the list with underlying data (by calling
258   * triangle_data_free()), and the list itself.
259   *
260   * Should be used eveytime the deletion of triangle list (created by
261   * init_triangle_list() and altered by add_triangle() or remove_triangle()) is desired.
262   *
263   * WARNING: The function doesn't check whether the pointer is NULL or invalid. It is the
264   * job of programmer to make sure the pointer is valid.
265   *
266   * WARNING: Careful when destroying triangle lists. There could be pointers to
267   * that information remaining in structures like vertex_data. This pointers
268   * will be rendered invalid by this operation and should not be used anymore.
269   *
270   * Example of usage:
271   *        triangle_list_free(tlist);
272   *
273   *        Clears all the information on triangles.
274   *        
275   */
d7639a 276 ts_bool triangle_list_free(ts_triangle_list *tlist){
a2a676 277     ts_uint i;
d7639a 278     for(i=0;i<tlist->n;i++){
a2a676 279         triangle_data_free(tlist->tria[i]->data);
SP 280         free(tlist->tria[i]);
d7639a 281     }
a2a676 282     free(tlist->tria);
SP 283     free(tlist);  
d7639a 284     return TS_SUCCESS;
SP 285 }
286