/*************************************************************************** * *N intersect_polygon_loop * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * Count the number of intersections of a plum line from the test * point to infinity and each of the edges in a polygon loop (ring). *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * x <input> == (float) test point x coordinate. * y <input> == (float) test point y coordinate. * face_id <input> == (int) given polygon loop. * start_edge <input> == (rspf_int32) one edge of the polygon loop. * edge_table <input> == (vpf_table_type) VPF edge table. * intersect_polygon_loop <output> == (int) number of intersections. *E **************************************************************************/ int intersect_polygon_loop( float x, float y, int face_id, rspf_int32 start_edge, vpf_table_type edgetable ) { edge_rec_type edge_rec; rspf_int32 next, prevnode; VPF_BOOLEAN done = FALSE; int n; edge_rec = read_edge( start_edge, edgetable ); edge_rec.dir = '+'; n = intersect_polygon_edge( x, y, edge_rec ); prevnode = edge_rec.start; next = next_polygon_edge(&edge_rec,&prevnode,face_id); if (edge_rec.coord) free(edge_rec.coord); while (!done) { if (next <= 0) done = TRUE; if (next == start_edge) done = TRUE; if (!done) { edge_rec = read_edge( next, edgetable ); next = next_polygon_edge(&edge_rec,&prevnode,face_id); n += intersect_polygon_edge( x, y, edge_rec ); if (edge_rec.coord) free(edge_rec.coord); } } return n; }
/************************************************************************** * *N distance_to_edge * *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function reads the specified edge from the given edge table * and computes the minimum distance from the given point to the * specified edge. 'edge_id' must be contained in the edge table. * edge_table must have been successfully opened with storage = DISK. *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * x <input> == (float) given point x coordinate. * y <input> == (float) given point y coordinate * edge_id <input> == (long int) specified edge. * edgetable <input> == (vpf_table_type) given edge table. * dec_degrees <input> == (float) flag to indicate if coordinates are * in decimal degrees. * distance_to_edge <output> == (float) minimum distance to the given * edge from the given point. *E *::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels, DOS Turbo C 1991 *E *************************************************************************/ float distance_to_edge( float x, float y, long int edge_id, vpf_table_type edgetable, int dec_degrees ) { edge_rec_type edge_rec; float result; edge_rec = read_edge( edge_id, edgetable ); result = distance_to_edge_rec( x, y, edge_rec, dec_degrees ); if (edge_rec.coord) free( edge_rec.coord ); return result; }
/*template<typename G>*/ void loader/*<G>*/::process_line( const std::string& str ) { char cmd='i'; std::stringstream ss (str); ss >> cmd; if (cmd == 'v') { read_vertex(ss); } else if (cmd == 'a') { read_edge (ss); } else if (cmd == 'r') { read_reach (ss); } }
static int read_edges(int count, int edges[MAX_GPIO_COUNT], char filenames[][MAX_FILENAME_LENGTH]) { int i, value, ret; memset(edges, 0, sizeof(edges)); ret = 1; for (i = 0; i < count; i++) if (read_edge(filenames[i], &value)) { edges[i] = value; } else { printf("reading edge '%s' from gpio failed\n", filenames[i] ); ret = 0; break; } return ret; }
/************************************************************************* * *N draw_polygon_loop * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function draws a loop (or ring) of a polygon by chaining * through the right and/or left edges of the edge table. Dangles * are skipped to stay along the outer boundary. * This is a good example of winged-edge topology. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * face_id <input>==(ossim_int32) row id of the specified face. * start_edge <input>==(ossim_int32) row id of the edge that starts the * loop. * edgetable <input>==(vpf_table_type) VPF edge primitive table. * poly <inout>==(Shademap *) polygon shade structure. * wrap <input>==(int) wrap around if the polygon wraps * around the screen. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *************************************************************************/ void draw_polygon_loop(ossim_int32 face_id, ossim_int32 start_edge, vpf_table_type edgetable, Shademap *poly, int wrap ) { edge_rec_type edge_rec; ossim_int32 next, prevnode; boolean done=FALSE; IPoint make_ipoint(); int xscr,yscr, color; coordinate_type coord; edge_rec = read_edge( start_edge, edgetable ); edge_rec.dir = '+'; prevnode = edge_rec.start; if (edge_rec.start != edge_rec.end) { next = next_polygon_edge( &edge_rec, &prevnode, face_id ); } else { done = TRUE; } gpgetlinecolor(&color); if (gpgetdevice()==SCREEN && color>=0) draw_polygon_edge( edge_rec ); if (edge_rec.dir == '-') coord = get_edge_coordinate(edge_rec.npts-1,&edge_rec); else coord = get_edge_coordinate(0,&edge_rec); screenxy(coord.x,coord.y,&xscr,&yscr); gpmoveto(xscr,yscr); gen_polygon_edge( edge_rec, poly, wrap ); if (edge_rec.coord) free(edge_rec.coord); while (!done) { if (next < 0) { gotoxy(1,18); printf(" VPF topology error! Edge: %ld face: %ld left: %ld right: %ld", edge_rec.id,face_id,edge_rec.left,edge_rec.right); getch(); gotoxy(1,18); printf(" "); done = TRUE; } if (next==0) { gotoxy(1,19); printf("Next edge(%d) = 0 ",edge_rec.id); done = TRUE; } if (next == start_edge) done = TRUE; if (!done) { edge_rec = read_edge( next, edgetable ); next = next_polygon_edge( &edge_rec, &prevnode, face_id ); if (gpgetdevice() == SCREEN && color>=0) draw_polygon_edge( edge_rec ); gen_polygon_edge( edge_rec, poly, wrap ); if (edge_rec.coord) free(edge_rec.coord); } } }
/************************************************************************* * *N trace_polygon_loop * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function traces a loop (or ring) of a polygon by chaining * through the right and/or left edges of the edge table, including * tracing through all dangles. This is winged-edge topology in action. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * face_id <input>==(ossim_int32) row id of the specified face. * start_edge <input>==(ossim_int32) row id of the edge that starts the * loop. * edgetable <input>==(vpf_table_type) VPF edge primitive table. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *************************************************************************/ void trace_polygon_loop(ossim_int32 face_id, ossim_int32 start_edge, vpf_table_type edgetable ) { edge_rec_type edge_rec; ossim_int32 next, prevnode; boolean done=FALSE; IPoint make_ipoint(); edge_rec = read_edge( start_edge, edgetable ); #ifdef WATCH gotoxy(1,17); printf("edge: %5ld left: %5ld edge:%5ld right: %5ld edge: %5ld", edge_rec.id,edge_rec.left,edge_rec.leftfwd,edge_rec.right, edge_rec.rightfwd); #endif #ifdef STEP getch(); #endif edge_rec.dir = '+'; prevnode = edge_rec.start; if (edge_rec.start != edge_rec.end) { if ( (edge_rec.right == face_id) && (edge_rec.left == face_id) ) { /* Dangle */ if (prevnode == edge_rec.start) { edge_rec.dir = '+'; next = edge_rec.rightfwd; prevnode = edge_rec.end; } else if (prevnode == edge_rec.end) { edge_rec.dir = '-'; next = edge_rec.leftfwd; prevnode = edge_rec.start; } else next = -1; } else if (edge_rec.right == face_id) { next = edge_rec.rightfwd; edge_rec.dir = '+'; prevnode = edge_rec.end; } else if (edge_rec.left == face_id) { next = edge_rec.leftfwd; edge_rec.dir = '-'; prevnode = edge_rec.start; } else next = -1; } else { done = TRUE; } draw_polygon_edge( edge_rec ); if (edge_rec.coord) free(edge_rec.coord); while (!done) { if (next < 0) { #ifdef WATCH gotoxy(1,18); printf(" Aaargh(r)! Edge: %ld face: %ld left: %ld right: %ld", edge_rec.id,face_id,edge_rec.left,edge_rec.right); getch(); gotoxy(1,18); printf(" "); #endif done = TRUE; } if (next==0) { #ifdef WATCH gotoxy(1,19); printf("Next edge(%d) = 0 ",edge_rec.id); #endif done = TRUE; } if (next == start_edge) done = TRUE; if (!done) { edge_rec = read_edge( next, edgetable ); #ifdef WATCH gotoxy(1,17); printf("edge: %5ld left: %5ld edge:%5ld right: %5ld edge: %5ld", next,edge_rec.left,edge_rec.leftfwd,edge_rec.right, edge_rec.rightfwd); gotoxy(1,18); printf("node: %5ld start: %5ld end: %5ld", prevnode,edge_rec.start,edge_rec.end); #endif #ifdef STEP getch(); #endif if ( (edge_rec.right == face_id) && (edge_rec.left == face_id) ) { /* Dangle */ if (prevnode == edge_rec.start) { edge_rec.dir = '+'; next = edge_rec.rightfwd; prevnode = edge_rec.end; } else if (prevnode == edge_rec.end) { edge_rec.dir = '-'; next = edge_rec.leftfwd; prevnode = edge_rec.start; } else next = -1; } else if (edge_rec.right == face_id) { edge_rec.dir = '+'; next = edge_rec.rightfwd; prevnode = edge_rec.end; } else if (edge_rec.left == face_id) { edge_rec.dir = '-'; next = edge_rec.leftfwd; prevnode = edge_rec.start; } else next = -1; draw_polygon_edge( edge_rec ); if (edge_rec.coord) free(edge_rec.coord); } } }
/************************************************************************* * *N outline_polygon_loop * *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Purpose: *P * This function outlines a loop (or ring) of a polygon by chaining * through the right forward and/or left forward edges of the edge * table. It does not fill a polygon. * *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * Parameters: *A * face_id <input>==(ossim_int32) row id of the specified face. * start_edge <input>==(ossim_int32) row id of the edge that starts the * loop. * edgetable <input>==(vpf_table_type) VPF edge primitive table. *E *:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * History: *H * Barry Michaels May 1991 DOS Turbo C *E *************************************************************************/ void outline_polygon_loop(ossim_int32 face_id, ossim_int32 start_edge, vpf_table_type edgetable) { edge_rec_type edge_rec; ossim_int32 next, prevnode; boolean done=FALSE; IPoint make_ipoint(); edge_rec = read_edge( start_edge, edgetable ); edge_rec.dir = '+'; prevnode = edge_rec.start; if (edge_rec.start != edge_rec.end) { next = next_polygon_edge( &edge_rec, &prevnode, face_id ); } else { done = TRUE; } draw_polygon_edge( edge_rec ); if (edge_rec.coord) free(edge_rec.coord); while (!done) { if (next < 0) { gotoxy(1,18); printf(" VPF topology error! Edge: %ld face: %ld left: %ld right: %ld", edge_rec.id,face_id,edge_rec.left,edge_rec.right); getch(); gotoxy(1,18); printf(" "); done = TRUE; } if (next==0) { gotoxy(1,19); printf("Next edge(%d) = 0 ",edge_rec.id); done = TRUE; } if (next == start_edge) done = TRUE; if (!done) { edge_rec = read_edge( next, edgetable ); next = next_polygon_edge( &edge_rec, &prevnode, face_id ); draw_polygon_edge( edge_rec ); if (edge_rec.coord) free(edge_rec.coord); } } }