#include #include #include "general.h" #include "triangle.h" #include ts_triangle_list *init_triangle_list(){ ts_triangle_list *tlist=(ts_triangle_list *)malloc(sizeof(ts_triangle_list)); tlist->n = 0; tlist->tria=NULL; return tlist; } ts_triangle *triangle_add(ts_triangle_list *tlist, ts_vertex *vtx1, ts_vertex *vtx2, ts_vertex *vtx3){ if(vtx1==NULL || vtx2==NULL || vtx3==NULL){ return NULL; } tlist->n++; tlist->tria=(ts_triangle **)realloc(tlist->tria,tlist->n*sizeof(ts_triangle *)); if(tlist->tria==NULL) fatal("Cannot reallocate memory for additional ts_triangle.",5); tlist->tria[tlist->n-1]=(ts_triangle *)calloc(1,sizeof(ts_triangle)); if(tlist->tria[tlist->n-1]==NULL) fatal("Cannot reallocate memory for additional ts_triangle.",5); tlist->tria[tlist->n-1]->data=(ts_triangle_data *)calloc(1,sizeof(ts_triangle_data)); //NOW insert vertices! tlist->tria[tlist->n - 1]->idx=tlist->n-1; tlist->tria[tlist->n - 1]->data->vertex[0]=vtx1; tlist->tria[tlist->n - 1]->data->vertex[1]=vtx2; tlist->tria[tlist->n - 1]->data->vertex[2]=vtx3; return tlist->tria[tlist->n-1]; } ts_bool triangle_add_neighbour(ts_triangle *tria, ts_triangle *ntria){ if(tria==NULL || ntria==NULL) return TS_FAIL; /*TODO: check if the neighbour already exists! Now there is no such check * because of the performance issue. */ tria->data->neigh_no++; tria->data->neigh=realloc(tria->data->neigh,tria->data->neigh_no*sizeof(ts_triangle *)); if(tria->data->neigh == NULL) fatal("Reallocation of memory failed during insertion of triangle neighbour in triangle_add_neighbour",3); tria->data->neigh[tria->data->neigh_no-1]=ntria; /* we repeat the procedure for the neighbour */ ntria->data->neigh_no++; ntria->data->neigh=realloc(ntria->data->neigh,ntria->data->neigh_no*sizeof(ts_triangle *)); if(ntria->data->neigh == NULL) fatal("Reallocation of memory failed during insertion of triangle neighbour in triangle_add_neighbour",3); ntria->data->neigh[ntria->data->neigh_no-1]=tria; return TS_SUCCESS; } ts_bool triangle_remove_neighbour(ts_triangle *tria, ts_triangle *ntria){ ts_uint i,j=0; if(tria==NULL || ntria==NULL) return TS_FAIL; for(i=0;idata->neigh_no;i++){ if(tria->data->neigh[i]!=ntria){ tria->data->neigh[j]=tria->data->neigh[i]; j++; } } if(j==i) { return TS_FAIL; //fatal("In triangle_remove_neighbour: Specified neighbour does not exist for given triangle",3); } tria->data->neigh_no--; tria->data->neigh=(ts_triangle **)realloc(tria->data->neigh,tria->data->neigh_no*sizeof(ts_triangle *)); if(tria->data->neigh == NULL){ fatal("Reallocation of memory failed during removal of vertex neighbour in triangle_remove_neighbour",100); } /* we repeat the procedure for neighbour */ for(i=0;idata->neigh_no;i++){ if(ntria->data->neigh[i]!=tria){ ntria->data->neigh[j]=ntria->data->neigh[i]; j++; } } if(j==i) { return TS_FAIL; //fatal("In triangle_remove_neighbour: Specified neighbour does not exist for given triangle",3); } ntria->data->neigh_no--; ntria->data->neigh=(ts_triangle **)realloc(ntria->data->neigh,ntria->data->neigh_no*sizeof(ts_triangle *)); if(ntria->data->neigh == NULL){ fatal("Reallocation of memory failed during removal of vertex neighbour in triangle_remove_neighbour",100); } return TS_SUCCESS; } ts_bool triangle_normal_vector(ts_triangle *tria){ ts_double x21,x31,y21,y31,z21,z31,xden; x21=tria->data->vertex[1]->data->x - tria->data->vertex[0]->data->x; x31=tria->data->vertex[2]->data->x - tria->data->vertex[0]->data->x; y21=tria->data->vertex[1]->data->y - tria->data->vertex[0]->data->y; y31=tria->data->vertex[2]->data->y - tria->data->vertex[0]->data->y; z21=tria->data->vertex[1]->data->z - tria->data->vertex[0]->data->z; z31=tria->data->vertex[2]->data->z - tria->data->vertex[0]->data->z; tria->data->xnorm=y21*z31 - z21*y31; tria->data->ynorm=z21*x31 - x21*z31; tria->data->znorm=x21*y31 - y21*x31; xden=tria->data->xnorm*tria->data->xnorm + tria->data->ynorm*tria->data->ynorm + tria->data->znorm*tria->data->znorm; #ifdef TS_DOUBLE_DOUBLE xden=sqrt(xden); #endif #ifdef TS_DOUBLE_FLOAT xden=sqrtf(xden); #endif #ifdef TS_DOUBLE_LONGDOUBLE xden=sqrtl(xden); #endif tria->data->xnorm=tria->data->xnorm/xden; tria->data->ynorm=tria->data->ynorm/xden; tria->data->znorm=tria->data->znorm/xden; return TS_SUCCESS; } ts_bool triangle_data_free(ts_triangle_data *data){ if(data->neigh!=NULL) free(data->neigh); free(data); return TS_SUCCESS; } ts_bool triangle_list_free(ts_triangle_list *tlist){ ts_uint i; for(i=0;in;i++){ triangle_data_free(tlist->tria[i]->data); free(tlist->tria[i]); } free(tlist->tria); free(tlist); return TS_SUCCESS; }