Exemple #1
0
/***************************************************************************
 *
 *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;
}
Exemple #2
0
/**************************************************************************
 *
 *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);
        }
    }
Exemple #4
0
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;
}
Exemple #5
0
/*************************************************************************
 *
 *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);

     }
  }

}
Exemple #6
0
/*************************************************************************
 *
 *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);

     }
  }

}
Exemple #7
0
/*************************************************************************
 *
 *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);

     }
  }

}