#include #include #include "general.h" #include "triangle.h" #include ts_bool init_triangle_list(ts_triangle_list *tlist){ tlist->n = 0; tlist->triangle=NULL; return TS_SUCCESS; } ts_bool clear_triangle_values(ts_triangle *triang,ts_uint idx){ triang->idx=idx; triang->neigh_no=0; triang->vertex[0]=NULL; triang->vertex[1]=NULL; triang->vertex[2]=NULL; triang->neigh=NULL; triang->xnorm=0; triang->ynorm=0; triang->znorm=0; return TS_SUCCESS; } ts_bool triangle_add(ts_triangle_list *tlist, ts_vertex *vtx1, ts_vertex *vtx2, ts_vertex *vtx3){ tlist->n++; tlist->triangle=realloc(tlist->triangle,tlist->n*sizeof(ts_triangle)); if(tlist->triangle==NULL) fatal("Cannot reallocate memory for additional ts_triangle.",5); clear_triangle_values(&tlist->triangle[tlist->n-1],tlist->n-1); //NOW insert vertices! tlist->triangle[tlist->n - 1].idx=tlist->n; tlist->triangle[tlist->n - 1].vertex[0]=vtx1; tlist->triangle[tlist->n - 1].vertex[1]=vtx2; tlist->triangle[tlist->n - 1].vertex[2]=vtx3; return TS_SUCCESS; } ts_bool triangle_add_neighbour(ts_triangle *tria, ts_triangle *ntria){ // int i; //fprintf(stderr,"Sosedi so:\n"); // for(i=0;ineigh_no;i++) // fprintf(stderr,"\t %d\n",tria->neigh[i]); tria->neigh_no++; //We need to reallocate space! The pointer *neight must be zero if not //having neighbours yet (if neigh_no was 0 at thime of calling tria->neigh=realloc(tria->neigh,tria->neigh_no*sizeof(ts_triangle *)); if(tria->neigh == NULL){ fatal("Reallocation of memory failed during insertion of triangle neighbour in triangle_add_neighbour",3); } tria->neigh[tria->neigh_no-1]=ntria; // fprintf(stderr,"dodajamo soseda %d!\n",ntria); //fprintf(stderr,"Sosedi so:\n"); // for(i=0;ineigh_no;i++) // fprintf(stderr,"\t %d\n",tria->neigh[i]); return TS_SUCCESS; } ts_bool triangle_remove_neighbour(ts_triangle *tria, ts_triangle *ntria){ ts_uint i,j=0; /* fprintf(stderr,"Sosedi so:\n"); for(i=0;ineigh_no;i++) fprintf(stderr,"%d, ",tria->neigh[i]); fprintf(stderr,"\n"); */ for(i=0;ineigh_no;i++){ if(tria->neigh[i]!=ntria){ tria->neigh[j]=tria->neigh[i]; j++; } // else { // fprintf(stderr,"was here once\n"); // } } // fprintf(stderr,"Sosedi so:\n"); // for(i=0;ineigh_no;i++) // fprintf(stderr,"\t %d\n",tria->neigh[i]); // fprintf(stderr,"iscemo soseda %d!\n",ntria); if(j==i) fatal("In triangle_remove_neighbour: Specified neighbour does not exist for given triangle",3); // fprintf(stderr,"old nuber of neigh=%i\n",tria->neigh_no); tria->neigh_no--; // fprintf(stderr,"new nuber of neigh=%i\n",tria->neigh_no); tria->neigh=realloc(tria->neigh,tria->neigh_no*sizeof(ts_triangle *)); if(tria->neigh == NULL){ fatal("Reallocation of memory failed during insertion of vertex neighbour in triangle_remove_neighbour",3); } return TS_SUCCESS; } ts_bool triangle_normal_vector(ts_triangle *tria){ ts_double x21,x31,y21,y31,z21,z31,xden; x21=tria->vertex[1]->x - tria->vertex[0]->x; x31=tria->vertex[2]->x - tria->vertex[0]->x; y21=tria->vertex[1]->y - tria->vertex[0]->y; y31=tria->vertex[2]->y - tria->vertex[0]->y; z21=tria->vertex[1]->z - tria->vertex[0]->z; z31=tria->vertex[2]->z - tria->vertex[0]->z; tria->xnorm=y21*z31 - z21*y31; tria->ynorm=z21*x31 - x21*z31; tria->znorm=x21*y31 - y21*x31; xden=tria->xnorm*tria->xnorm + tria->ynorm*tria->ynorm + tria->znorm*tria->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->xnorm=tria->xnorm/xden; tria->ynorm=tria->ynorm/xden; tria->znorm=tria->znorm/xden; return TS_SUCCESS; } ts_bool triangle_free(ts_triangle *triang){ free(triang->neigh); return TS_SUCCESS; } ts_bool triangle_list_free(ts_triangle_list *tlist){ int i; for(i=0;in;i++){ triangle_free(&tlist->triangle[i]); } free(tlist->triangle); return TS_SUCCESS; }