| | |
| | | #include<cross-section.h> |
| | | #include<coord.h> |
| | | #include<cairo/cairo.h> |
| | | #include<stdint.h> |
| | | /** @brief Calculates cross-section of vesicle with plane. |
| | | * |
| | | * 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: |
| | |
| | | if(Dsq<vesicle->dmax){ |
| | | for(j=0;j<vtx->neigh_no;j++){ |
| | | ppn1=vtx->neigh[j]->x*a+vtx->neigh[j]->y*b+vtx->neigh[j]->z*c+d; |
| | | if(pp*ppn1<=0){ //the combination of vertices are good candidates for a crossection |
| | | if(pp*ppn1<=0.0){ //the combination of vertices are good candidates for a crossection |
| | | //find triangle that belongs to the two vertices |
| | | ntria=0; |
| | | for(k=0;k<vtx->tristar_no;k++){ |
| | |
| | | ntria++; |
| | | } |
| | | } |
| | | // if ntria !=1 there is probably something wrong I would say... |
| | | if(ntria==0) continue; |
| | | /* if(ntria!=1) { //there should be 2 triangles. of course, all some of them will be doubled. |
| | | fprintf(stderr,"ntria=%u\n",ntria); |
| | | fatal ("Error in mesh. 2 triangles not found",123123); |
| | | } */ |
| | | if(ntria==0) continue; // no need to continue |
| | | //find the two intersections (in general) to form a intersection line |
| | | for(l=0;l<ntria;l++){ |
| | | //we add intersection line between two points for each of the triangles found above. |
| | |
| | | ts_bool add_crosssection_point(ts_coord_list *pts, ts_double a, ts_double b, ts_double c, ts_double d, ts_vertex *vtx1, ts_vertex *vtx2){ |
| | | ts_double pp=vtx1->x*a+vtx1->y*b+vtx1->z*c+d; |
| | | ts_double pp2=vtx2->x*a+vtx1->y*b+vtx2->z*c+d; |
| | | if(pp*pp2<=0){ |
| | | if(pp*pp2<=0.0){ |
| | | ts_double u=pp/(a*(vtx1->x-vtx2->x)+b*(vtx1->y-vtx2->y)+c*(vtx1->z-vtx2->z)); |
| | | add_coord(pts, vtx1->x+u*(vtx2->x - vtx1->x), |
| | | vtx1->y+u*(vtx2->y - vtx1->y), |
| | |
| | | cairo_surface_t *surface; |
| | | cairo_t *cr; |
| | | ts_uint i; |
| | | surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 1800, 1800); |
| | | surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 768, 576); |
| | | cr = cairo_create (surface); |
| | | cairo_rectangle(cr, 0.0, 0.0, 1800,1800); |
| | | cairo_set_source_rgb(cr, 0.3, 0.3, 0.3); |
| | | cairo_rectangle(cr, 0.0, 0.0, 768,576); |
| | | cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); |
| | | cairo_fill(cr); |
| | | cairo_set_line_width (cr, 5.0/30.0); |
| | | cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); |
| | | cairo_translate(cr, 900,900); |
| | | cairo_scale (cr, 30, 30); |
| | | cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); |
| | | cairo_set_line_width (cr, 2.0/8.0); |
| | | cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); |
| | | cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND); |
| | | cairo_translate(cr, 380,250); |
| | | cairo_scale (cr, 8.0, 8.0); |
| | | cairo_set_source_rgb (cr, 0.3, 0.3, 0.3); |
| | | |
| | | for(i=0;i<pts->n;i+=2){ |
| | | cairo_move_to(cr, pts->coord[i]->e1, pts->coord[i]->e2); |
| | |
| | | } |
| | | cairo_stroke(cr); |
| | | cairo_surface_write_to_png (surface,filename); |
| | | append_to_isak_program_raw(surface,"experimental.img"); |
| | | cairo_surface_finish (surface); |
| | | return TS_SUCCESS; |
| | | } |
| | |
| | | crossection_to_png(pts,filename); |
| | | return TS_SUCCESS; |
| | | } |
| | | |
| | | ts_bool append_to_isak_program_raw(cairo_surface_t *surface, char *filename){ |
| | | |
| | | unsigned char *d=cairo_image_surface_get_data(surface); |
| | | int w=cairo_image_surface_get_width(surface); |
| | | int h=cairo_image_surface_get_height(surface); |
| | | int s=cairo_image_surface_get_stride(surface); |
| | | int i,j; |
| | | FILE *fd=fopen(filename, "a+"); |
| | | |
| | | uint32_t *pixelptr; |
| | | uint32_t my_pixel; |
| | | uint8_t pixel_channel; |
| | | // red = (pixel[8] >> 16) & 0xFF; |
| | | |
| | | |
| | | |
| | | fwrite (&w,sizeof(uint32_t),1,fd); |
| | | fwrite (&h,sizeof(uint32_t),1,fd); |
| | | fwrite (&w,sizeof(uint32_t),1,fd);//time! |
| | | for(i=0;i<h;i++){ |
| | | for(j=0;j<w;j++){ |
| | | pixelptr=(uint32_t *)(d + i * s); |
| | | my_pixel = pixelptr[j]; |
| | | pixel_channel=(my_pixel>>16)&0xFF; |
| | | fwrite(&pixel_channel,sizeof(uint8_t), 1,fd); |
| | | } |
| | | } |
| | | fclose(fd); |
| | | return TS_SUCCESS; |
| | | } |
| | | |
| | | /*ts_bool init_isak_program_raw_output_file(ts_uint w, ts_uint h, char *filename){ |
| | | |
| | | |
| | | }*/ |