From a2a67644115039486dc07aa4d9d636267f99b22a Mon Sep 17 00:00:00 2001 From: Samo Penic <samo@andromeda> Date: Sun, 28 Nov 2010 19:55:35 +0000 Subject: [PATCH] triangles added to the data structure. --- src/Makefile.am | 4 src/main.c | 8 ++ src/triangle.h | 7 - src/general.h | 2 src/triangle.c | 180 ++++++++++++++++++++++----------------------- src/vertex.h | 3 6 files changed, 104 insertions(+), 100 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 0e3fea8..9f199d7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,5 +1,5 @@ trisurfdir=../ trisurf_PROGRAMS=trisurf -trisurf_SOURCES=general.c vertex.c bond.c main.c +trisurf_SOURCES=general.c vertex.c bond.c triangle.c main.c trisurf_LDFLAGS = -lm -lconfuse -trisurf_CFLAGS = -Wall +trisurf_CFLAGS = -Wall -Werror diff --git a/src/general.h b/src/general.h index 1d1371e..340ed27 100644 --- a/src/general.h +++ b/src/general.h @@ -192,7 +192,7 @@ ts_uint n; ts_triangle **tria; }; - +typedef struct ts_triangle_list ts_triangle_list; typedef struct ts_cell { ts_uint idx; diff --git a/src/main.c b/src/main.c index bfbd732..3052ada 100644 --- a/src/main.c +++ b/src/main.c @@ -3,6 +3,7 @@ #include "general.h" #include "vertex.h" #include "bond.h" +#include "triangle.h" //#include "io.h" //#include "initial_timestep.h" @@ -16,6 +17,9 @@ ts_bool retval; ts_vertex_list *vlist=init_vertex_list(5); ts_bond_list *blist=init_bond_list(); +ts_triangle_list *tlist=init_triangle_list(); + + retval=vtx_add_cneighbour(blist,vlist->vtx[1],vlist->vtx[0]); if(retval==TS_FAIL) printf("1. already a member or vertex is null!\n"); @@ -30,7 +34,11 @@ vlist->vtx[0]->data->x=1.1; bond_add(blist, vlist->vtx[1],vlist->vtx[0]); +triangle_add(tlist,vlist->vtx[1],vlist->vtx[2],vlist->vtx[3]); +triangle_add(tlist,vlist->vtx[1],vlist->vtx[2],vlist->vtx[3]); + +triangle_list_free(tlist); bond_list_free(blist); vtx_list_free(vlist); printf("Done.\n"); diff --git a/src/triangle.c b/src/triangle.c index d24665e..79a0ada 100644 --- a/src/triangle.c +++ b/src/triangle.c @@ -4,115 +4,108 @@ #include "triangle.h" #include<math.h> -ts_bool init_triangle_list(ts_triangle_list *tlist){ +ts_triangle_list *init_triangle_list(){ + ts_triangle_list *tlist=(ts_triangle_list *)malloc(sizeof(ts_triangle_list)); tlist->n = 0; - tlist->triangle=NULL; - return TS_SUCCESS; + tlist->tria=NULL; + return tlist; } -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){ +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->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); + 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->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; + 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){ - // int i; - //fprintf(stderr,"Sosedi so:\n"); - // for(i=0;i<tria->neigh_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){ + 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->neigh[tria->neigh_no-1]=ntria; - // fprintf(stderr,"dodajamo soseda %d!\n",ntria); - - //fprintf(stderr,"Sosedi so:\n"); - // for(i=0;i<tria->neigh_no;i++) - // fprintf(stderr,"\t %d\n",tria->neigh[i]); - - - + 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; -/* fprintf(stderr,"Sosedi so:\n"); - for(i=0;i<tria->neigh_no;i++) - fprintf(stderr,"%d, ",tria->neigh[i]); - fprintf(stderr,"\n"); - */ - - for(i=0;i<tria->neigh_no;i++){ - if(tria->neigh[i]!=ntria){ - tria->neigh[j]=tria->neigh[i]; + ts_uint i,j=0; + if(tria==NULL || ntria==NULL) return TS_FAIL; + + for(i=0;i<tria->data->neigh_no;i++){ + if(tria->data->neigh[i]!=ntria){ + tria->data->neigh[j]=tria->data->neigh[i]; j++; - } - // else { - // fprintf(stderr,"was here once\n"); - - // } } - - // fprintf(stderr,"Sosedi so:\n"); - // for(i=0;i<tria->neigh_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); - } + 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;i<ntria->data->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->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; + 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->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; + 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 @@ -122,24 +115,27 @@ #ifdef TS_DOUBLE_LONGDOUBLE xden=sqrtl(xden); #endif - tria->xnorm=tria->xnorm/xden; - tria->ynorm=tria->ynorm/xden; - tria->znorm=tria->znorm/xden; + 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_free(ts_triangle *triang){ - free(triang->neigh); +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){ - int i; + ts_uint i; for(i=0;i<tlist->n;i++){ - triangle_free(&tlist->triangle[i]); + triangle_data_free(tlist->tria[i]->data); + free(tlist->tria[i]); } - free(tlist->triangle); + free(tlist->tria); + free(tlist); return TS_SUCCESS; } diff --git a/src/triangle.h b/src/triangle.h index 9643396..46be57e 100644 --- a/src/triangle.h +++ b/src/triangle.h @@ -1,9 +1,8 @@ #ifndef _TRIANGLE_H #define _TRIANGLE_H -ts_bool init_triangle_list(ts_triangle_list *tlist); -ts_bool clear_triangle_values(ts_triangle *triang,ts_uint idx); -ts_bool triangle_add(ts_triangle_list *tlist, ts_vertex *vtx1, ts_vertex *vtx2, ts_vertex *vtx3); +ts_triangle_list *init_triangle_list(void); +ts_triangle *triangle_add(ts_triangle_list *tlist, ts_vertex *vtx1, ts_vertex *vtx2, ts_vertex *vtx3); /** Adds a neighbouring triangle in a list * @param *tria is a pointer to the triangle, to which additional member want to be added @@ -12,7 +11,7 @@ */ ts_bool triangle_add_neighbour(ts_triangle *tria, ts_triangle *ntria); ts_bool triangle_normal_vector(ts_triangle *tria); -ts_bool triangle_free(ts_triangle *triang); +ts_bool triangle_data_free(ts_triangle_data *triang); ts_bool triangle_list_free(ts_triangle_list *tlist); #endif diff --git a/src/vertex.h b/src/vertex.h index 1db3f1f..152fc0d 100644 --- a/src/vertex.h +++ b/src/vertex.h @@ -10,7 +10,7 @@ * @param zero_them is boolean value. 0 skip setting zeros to idx * and (x,y,z) coordinates for each points, 1 means to zero all * information on points > 1 requests zeroing of coordinates and - * indexing the vertexes 0..N-1. + * indexing the vertices 0..N-1. * @returns ts_bool value 1 on success, 0 otherwise */ ts_vertex_list *init_vertex_list(ts_uint N); @@ -18,6 +18,7 @@ ts_bool vtx_add_neighbour(ts_vertex *vtx, ts_vertex *nvtx); ts_bool vtx_add_cneighbour(ts_bond_list *blist,ts_vertex *vtx1,ts_vertex *vtx2); ts_bool vtx_add_bond(ts_bond_list *blist,ts_vertex *vtx1,ts_vertex *vtx2); +ts_bool vtx_remove_neighbour(ts_vertex *vtx, ts_vertex *nvtx); ts_bool vtx_data_free(ts_vertex_data *data); ts_bool vtx_free(ts_vertex *vtx); ts_bool vtx_list_free(ts_vertex_list *vlist); -- Gitblit v1.9.3