Provided by: libgraphviz-dev_2.36.0-0ubuntu3.2_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)