| | |
| | | #include "vertex.h" |
| | | #include<stdio.h> |
| | | |
| | | /* Argument je struktura vlist in stevilo vertexov, ki jih zelimo dati v |
| | | * vlist je lahko NULL, N mora biti vecje od 0. Ce vlist obstaja, potem resizamo |
| | | * vlist na stevilo N. |
| | | */ |
| | | ts_vertex **init_vertex_list(ts_uint N){ |
| | | ts_vertex_list *init_vertex_list(ts_uint N){ |
| | | ts_int i; |
| | | ts_vertex **vlist; |
| | | ts_vertex_list *vlist=(ts_vertex_list *)malloc(sizeof(ts_vertex_list *)); |
| | | |
| | | if(N==0){ |
| | | err("Initialized vertex list with zero elements. Pointer set to NULL"); |
| | | vlist=NULL; |
| | | return NULL; |
| | | vlist->n=0; |
| | | vlist->vtx=NULL; |
| | | return vlist; |
| | | } |
| | | vlist=(ts_vertex **)malloc(N*sizeof(ts_vertex *)); |
| | | if(vlist==NULL) |
| | | fatal("Fatal error reserving memory space for vertex list! Could number of requsted vertices be too large?", 100); |
| | | |
| | | for(i=0;i<N;i++){ |
| | | vlist[i]=init_vertex(i); |
| | | } |
| | | |
| | | vlist->vtx=(ts_vertex *)malloc(N*sizeof(ts_vertex)); |
| | | if(vlist->vtx==NULL) |
| | | fatal("Fatal error reserving memory space for vertex list! Could number of requsted vertices be too large?", 100); |
| | | for(i=0;i<N;i++) vlist->vtx[i].data=init_vertex_data(); |
| | | vlist->n=N; |
| | | return vlist; |
| | | } |
| | | |
| | | ts_vertex *init_vertex(ts_uint idx){ |
| | | ts_vertex *vtx; |
| | | vtx=(ts_vertex *)malloc(sizeof(ts_vertex)); |
| | | if(vtx==NULL) |
| | | ts_vertex_data *init_vertex_data(){ |
| | | ts_vertex_data *data; |
| | | data=(ts_vertex_data *)malloc(sizeof(ts_vertex_data)); |
| | | if(data==NULL) |
| | | fatal("Fatal error reserving memory space for ts_vertex! Memory full?", 100); |
| | | vtx->idx=idx; |
| | | return vtx; |
| | | return data; |
| | | } |
| | | |
| | | /* |
| | |
| | | |
| | | |
| | | |
| | | ts_bool vtx_add_neighbour(ts_vertex **vtx, ts_vertex **nvtx){ |
| | | ts_bool vtx_add_neighbour(ts_vertex *vtx, ts_vertex *nvtx){ |
| | | ts_uint i; |
| | | /* no neighbour can be null! */ |
| | | if(vtx==NULL || nvtx==NULL) return TS_FAIL; |
| | | |
| | | /*if it is already a neighbour don't add it to the list */ |
| | | for(i=0; i<(*vtx)->neigh_no;i++){ |
| | | if((*vtx)->neigh[i]==nvtx) return TS_FAIL; |
| | | for(i=0; i<vtx->data->neigh_no;i++){ |
| | | if(vtx->data->neigh[i]==nvtx) return TS_FAIL; |
| | | } |
| | | ts_uint nn=(*vtx)->neigh_no++; |
| | | (*vtx)->neigh=(ts_vertex ***)realloc((*vtx)->neigh, nn*sizeof(ts_vertex **)); |
| | | (*vtx)->neigh[nn]=nvtx; |
| | | ts_uint nn=vtx->data->neigh_no++; |
| | | vtx->data->neigh=(ts_vertex **)realloc(vtx->data->neigh, nn*sizeof(ts_vertex *)); |
| | | vtx->data->neigh[nn]=nvtx; |
| | | |
| | | /* pa se sosedu dodamo vertex */ |
| | | /*if it is already a neighbour don't add it to the list */ |
| | | for(i=0; i<(*nvtx)->neigh_no;i++){ |
| | | if((*nvtx)->neigh[i]==vtx) return TS_FAIL; |
| | | for(i=0; i<nvtx->data->neigh_no;i++){ |
| | | if(nvtx->data->neigh[i]==vtx) return TS_FAIL; |
| | | } |
| | | nn=(*nvtx)->neigh_no++; |
| | | (*nvtx)->neigh=(ts_vertex ***)realloc((*nvtx)->neigh, nn*sizeof(ts_vertex **)); |
| | | (*nvtx)->neigh[nn]=vtx; |
| | | nn=nvtx->data->neigh_no++; |
| | | nvtx->data->neigh=(ts_vertex **)realloc(nvtx->data->neigh, nn*sizeof(ts_vertex *)); |
| | | nvtx->data->neigh[nn]=vtx; |
| | | |
| | | |
| | | /* Ustvari bond in doloci dolzino */ |
| | |
| | | } |
| | | |
| | | |
| | | ts_bool vtx_free(ts_vertex **vtx){ |
| | | if((*vtx)->neigh!=NULL) free((*vtx)->neigh); |
| | | if((*vtx)->tristar!=NULL) free((*vtx)->tristar); |
| | | if((*vtx)->bond!=NULL) free((*vtx)->bond); |
| | | if((*vtx)->cell!=NULL) free((*vtx)->cell); |
| | | free(*vtx); |
| | | ts_bool vtx_data_free(ts_vertex_data *data){ |
| | | if(data->neigh!=NULL) free(data->neigh); |
| | | if(data->tristar!=NULL) free(data->tristar); |
| | | if(data->bond!=NULL) free(data->bond); |
| | | if(data->cell!=NULL) free(data->cell); |
| | | free(data); |
| | | return TS_SUCCESS; |
| | | } |
| | | |
| | | ts_bool vtx_free(ts_vertex *vtx){ |
| | | vtx_data_free(vtx->data); |
| | | free(vtx); |
| | | return TS_SUCCESS; |
| | | } |
| | | |
| | | ts_bool vtx_list_free(ts_vertex_list *vlist){ |
| | | int i; |
| | | for(i=0;i<vlist->n;i++){ |
| | | vtx_data_free(vlist->vtx[i].data); |
| | | } |
| | | free(vlist->vtx); |
| | | free(vlist); |
| | | return TS_SUCCESS; |
| | | } |
| | | |
| | | |
| | | inline ts_double vertex_distance_sq(ts_vertex **vtx1, ts_vertex **vtx2){ |
| | | |
| | | /* rewrite for additional structure in chain */ |
| | | /*inline ts_double vtx_distance_sq(ts_vertex *vtx1, ts_vertex *vtx2){ |
| | | ts_double dist; |
| | | #ifdef TS_DOUBLE_DOUBLE |
| | | dist=pow((*vtx1)->x-(*vtx2)->x,2) + pow((*vtx1)->y-(*vtx2)->y,2) + pow((*vtx1)->z-(*vtx2)->z,2); |
| | |
| | | #endif |
| | | return(dist); |
| | | } |
| | | |
| | | */ |