Trisurf Monte Carlo simulator
Samo Penic
2014-06-13 d27c077296c88b4a78288bed7454c3a60279c26e
commit | author | age
0af0cf 1 #include<general.h>
SP 2 #include<cross-section.h>
3 #include<coord.h>
4
5 /** @brief Calculates cross-section of vesicle with plane.
6  *
7  * Function returns points of cross-section of vesicle with plane. Plane is described with equation $ax+by+cz+d=0$. Algorithm extracts coordinates of each vertex of a vesicle and then:
8  *
9  * if a distance of point to plane (given by equation $D=\frac{ax_0+by_0+cz_0+d}{\sqrt{a^2+b^2+c^2}}$, where $x_0$, $y_0$ and $z_0$ are coordinates of a given vertex) is less than maximal allowed distance between vertices {\tt sqrt(vesicle->dmax)} than vertex is a candidate for crossection calculation.
10  *
11  */
d27c07 12 ts_coord_list *get_crossection_with_plane(ts_vesicle *vesicle,ts_double a,ts_double b,ts_double c, ts_double d){
0af0cf 13
SP 14
d27c07 15     ts_uint i, j;
0af0cf 16     ts_double pp,Dsq; // distance from the plane squared
d27c07 17     ts_double ppn; // distance from the plane squared of a neighbor
0af0cf 18     ts_double u; //factor to scale vector from first vector to the second to get intersection
SP 19     ts_vertex *vtx;
20
21     ts_coord_list *pts=init_coord_list();
d27c07 22     for(i=0;i<vesicle->vlist->n;i++){
0af0cf 23         vtx=vesicle->vlist->vtx[i];
SP 24
25         pp=vtx->x*a+vtx->y*b+vtx->z*c+d;
26         Dsq=pp*pp/(a*a+b*b+c*c);
27         if(Dsq<vesicle->dmax){
28             for(j=0;j<vtx->neigh_no;j++){
29                 ppn=vtx->neigh[j]->x*a+vtx->neigh[j]->y*b+vtx->neigh[j]->z*c+d;
30                 if(pp*ppn<0){ //the combination of vertices are good candidates for a crossection
d27c07 31                     u=pp/(a*(vtx->x-vtx->neigh[j]->x)+b*(vtx->y-vtx->neigh[j]->y)+c*(vtx->z-vtx->neigh[j]->z));
SP 32                     add_coord(pts, vtx->x+u*(vtx->neigh[j]->x - vtx->x),
33                             vtx->y+u*(vtx->neigh[j]->y - vtx->y),        
34                             vtx->z+u*(vtx->neigh[j]->z - vtx->z),
0af0cf 35                             TS_COORD_CARTESIAN);        
SP 36                 }
37             }
38         }
39     }
40     return pts;
41 }
42
43