#include #include #include #include #include #include #include "sw_defs.h" #include "defs.h" #include "write.h" int write_triple (struct Site *s1, struct Site *s2, struct Site *s3 ) { int i; int node; static struct line_pnts *Points = NULL; static struct line_cats *Cats = NULL; struct Site *sa, *sb; if ( !Points ) { Points = Vect_new_line_struct (); Cats = Vect_new_cats_struct (); } if(triangulate) { for ( i = 0; i < 3; i++ ) { switch ( i ) { case 0: sa = s1; sb = s2; break; case 1: sa = s2; sb = s3; break; case 2: sa = s3; sb = s1; break; } /* Look if the line already exists */ node = Vect_find_node ( &Out, sa->coord.x, sa->coord.y, 0.0, 0.0, 0 ); if ( node > 0 ) { /* node found */ int j, nlines; int found = 0; double x, y; nlines = Vect_get_node_n_lines ( &Out, node ); for ( j = 0; j < nlines; j++ ) { int line, node2; line = Vect_get_node_line ( &Out, node, j ); if ( line > 0 ) Vect_get_line_nodes ( &Out, line, NULL, &node2 ); else Vect_get_line_nodes ( &Out, abs(line), &node2, NULL ); Vect_get_node_coor ( &Out, node2, &x, &y, NULL ); if ( x == sb->coord.x && y == sb->coord.y ) { found = 1; break; } } if ( found ) continue; /* next segment */ } /* Not found, write it */ Vect_reset_line ( Points ); Vect_append_point ( Points, sa->coord.x, sa->coord.y, 0.0 ); Vect_append_point ( Points, sb->coord.x, sb->coord.y, 0.0 ); Vect_write_line ( &Out, Type, Points, Cats ); } } return 0; }