Provided by: libgraphviz-dev_2.38.0-12ubuntu2.1_amd64 bug

NAME

       libpathplan - finds and smooths shortest paths

SYNOPSIS

       #include <graphviz/pathplan.h>

       typedef struct Pxy_t {
           double x, y;
       } Pxy_t;

       typedef struct Pxy_t Ppoint_t;
       typedef struct Pxy_t Pvector_t;

       typedef struct Ppoly_t {
           Ppoint_t *ps;
           int pn;
       } Ppoly_t;

       typedef Ppoly_t Ppolyline_t;

       typedef struct Pedge_t {
           Ppoint_t a, b;
       } Pedge_t;

       typedef struct vconfig_s vconfig_t;

       #define POLYID_NONE
       #define POLYID_UNKNOWN

       int Pshortestpath(Ppoly_t *boundary, Ppoint_t endpoints[2], Ppolyline_t *output_route);

       vconfig_t *Pobsopen(Ppoly_t **obstacles, int n_obstacles);
       int Pobspath(vconfig_t *config, Ppoint_t p0, int poly0, Ppoint_t p1, int poly1, Ppolyline_t *output_route);
       void Pobsclose(vconfig_t *config);

       int Proutespline (Pedge_t *barriers, int n_barriers, Ppolyline_t input_route, Pvector_t endpoint_slopes[2],
              Ppolyline_t *output_route);

       int Ppolybarriers(Ppoly_t **polys, int n_polys, Pedge_t **barriers, int *n_barriers);

DESCRIPTION

       libpathplan provides functions for creating spline paths in the plane that are constrained
       by a polygonal boundary or obstacles to avoid.  All polygons must be simple, but need  not
       be convex.

      int Pshortestpath(Ppoly_t *boundary, Ppoint_t endpoints[2], Ppolyline_t *output_route);
       The  function  Pshortestpath finds a shortest path between two points in a simple polygon.
       The  polygon  is  specified  by  a  list  of  its  vertices,  in   either   clockwise   or
       counterclockwise  order.  You pass endpoints interior to the polygon boundary.  A shortest
       path connecting the points that remains in the polygon is returned  in  output_route.   If
       either  endpoint  does not lie in the polygon, -1 is returned; otherwise, 0 is returned on
       success.  The array of points in output_route is static to the library. It should  not  be
       freed, and should be used before another call to Pshortestpath.

       vconfig_t *Pobsopen(Ppoly_t **obstacles, int n_obstacles);
        Pobspath(vconfig_t  *config,  Ppoint_t p0, int poly0, Ppoint_t p1, int poly1, Ppolyline_t
       *output_route);
       void Pobsclose(vconfig_t *config);
       These functions find a shortest path  between  two  points  in  the  plane  that  contains
       polygonal  obstacles  (holes).  Pobsopen creates a configuration (an opaque struct of type
       vconfig_t) on a set of obstacles.  The  n_obstacles  obstacles  are  given  in  the  array
       obstacles;  the  points  of  each  polygon  should  be  in  clockwise order.  The function
       Pobsclose frees the data allocated in Pobsopen.

       Pobspath finds a shortest path between the endpoints that remains outside  the  obstacles.
       If  the  endpoints  are known to lie inside obstacles, poly0 or poly1 should be set to the
       index in the obstacles array.  If an endpoint is definitely not inside an  obstacle,  then
       POLYID_NONE  should  be passed.  If the caller has not checked, then POLYID_UNKNOWN should
       be passed, and the path library will perform the test.  The  resulting  shortest  path  is
       returned in output_route. Note that this function does not provide for a boundary polygon.
       The array of points stored in output_route are allocated by the  library,  but  should  be
       freed by the user.

       int  Proutespline  (Pedge_t  *barriers, int n_barriers, Ppolyline_t input_route, Pvector_t
       endpoint_slopes[2], Ppolyline_t *output_route);
       This function fits a cubic B-spline curve to a polyline path.  The curve is constructed to
       avoid  a  set  of n_barriers barrier line segments specified in the array barriers. If you
       start with polygonal obstacles, you can supply each polygon's edges as part of the barrier
       list.   The polyline input_route provides a template for the final path; it is usually the
       output_route of one of the shortest path finders, but it  can  be  any  simple  path  that
       doesn't  cross  any  barrier  segment.  The input also allows the specification of desired
       slopes at the endpoints via endpoint_slopes. These are specified as vectors.  For example,
       to have an angle of T at an endpoing, one could use (cos(T),sin(T)).  A vector (0,0) means
       unconstrained slope.  The output is returned in output_route and consists of  the  control
       points  of  the B-spline. The function return 0 on success; a return value of -1 indicates
       failure.  The array of points in output_route is static to the library. It should  not  be
       freed, and should be used before another call to Proutespline.

      int Ppolybarriers(Ppoly_t **polys, int n_polys, Pedge_t **barriers, int *n_barriers);
       This  is a utility function that converts an input list of polygons into an output list of
       barrier segments.  The array of points in barriers is static to the library. It should not
       be freed, and should be used before another call to Ppolybarriers.  The function returns 1
       on success.

BUGS

       The function Proutespline does not guarantee that it will preserve  the  topology  of  the
       input path as regards the boundaries. For example, if some of the segments correspond to a
       small polygon, it may be possible that the final path has flipped over the obstacle.

AUTHORS

       David Dobkin (dpd@cs.princeton.edu), Eleftherios Koutsofios  (ek@research.att.com),  Emden
       Gansner (erg@research.att.com).

                                          01 APRIL 1997                                LIBPATH(3)