PostGIS  3.2.2dev-r@@SVN_REVISION@@

◆ _lwt_FindNextRingEdge()

static int _lwt_FindNextRingEdge ( const POINTARRAY ring,
int  from,
const LWT_ISO_EDGE edges,
int  numedges 
)
static

Definition at line 2935 of file lwgeom_topo.c.

2937 {
2938  int i;
2939  POINT2D p1;
2940 
2941  /* Get starting ring point */
2942  getPoint2d_p(ring, from, &p1);
2943 
2944  LWDEBUGF(1, "Ring's 'from' point (%d) is %g,%g", from, p1.x, p1.y);
2945 
2946  /* find the edges defining the next portion of ring starting from
2947  * vertex "from" */
2948  for ( i=0; i<numedges; ++i )
2949  {
2950  const LWT_ISO_EDGE *isoe = &(edges[i]);
2951  LWLINE *edge = isoe->geom;
2952  POINTARRAY *epa = edge->points;
2953  POINT2D p2, pt;
2954  int match = 0;
2955  uint32_t j;
2956 
2957  /* Skip if the edge is a dangling one */
2958  if ( isoe->face_left == isoe->face_right )
2959  {
2960  LWDEBUGF(3, "_lwt_FindNextRingEdge: edge %" LWTFMT_ELEMID
2961  " has same face (%" LWTFMT_ELEMID
2962  ") on both sides, skipping",
2963  isoe->edge_id, isoe->face_left);
2964  continue;
2965  }
2966 
2967  if (epa->npoints < 2)
2968  {
2969  LWDEBUGF(3, "_lwt_FindNextRingEdge: edge %" LWTFMT_ELEMID
2970  " has only %"PRIu32" points",
2971  isoe->edge_id, epa->npoints);
2972  continue;
2973  }
2974 
2975 #if 0
2976  size_t sz;
2977  LWDEBUGF(1, "Edge %" LWTFMT_ELEMID " is %s",
2978  isoe->edge_id,
2979  lwgeom_to_wkt(lwline_as_lwgeom(edge), WKT_EXTENDED, 2, &sz));
2980 #endif
2981 
2982  /* ptarray_remove_repeated_points ? */
2983 
2984  getPoint2d_p(epa, 0, &p2);
2985  LWDEBUGF(1, "Edge %" LWTFMT_ELEMID " 'first' point is %g,%g",
2986  isoe->edge_id, p2.x, p2.y);
2987  LWDEBUGF(1, "Rings's 'from' point is still %g,%g", p1.x, p1.y);
2988  if ( p2d_same(&p1, &p2) )
2989  {
2990  LWDEBUG(1, "p2d_same(p1,p2) returned true");
2991  LWDEBUGF(1, "First point of edge %" LWTFMT_ELEMID
2992  " matches ring vertex %d", isoe->edge_id, from);
2993  /* first point matches, let's check next non-equal one */
2994  for ( j=1; j<epa->npoints; ++j )
2995  {
2996  getPoint2d_p(epa, j, &p2);
2997  LWDEBUGF(1, "Edge %" LWTFMT_ELEMID " 'next' point %d is %g,%g",
2998  isoe->edge_id, j, p2.x, p2.y);
2999  /* we won't check duplicated edge points */
3000  if ( p2d_same(&p1, &p2) ) continue;
3001  /* we assume there are no duplicated points in ring */
3002  getPoint2d_p(ring, from+1, &pt);
3003  LWDEBUGF(1, "Ring's point %d is %g,%g",
3004  from+1, pt.x, pt.y);
3005  match = p2d_same(&pt, &p2);
3006  break; /* we want to check a single non-equal next vertex */
3007  }
3008 #if POSTGIS_DEBUG_LEVEL > 0
3009  if ( match ) {
3010  LWDEBUGF(1, "Prev point of edge %" LWTFMT_ELEMID
3011  " matches ring vertex %d", isoe->edge_id, from+1);
3012  } else {
3013  LWDEBUGF(1, "Prev point of edge %" LWTFMT_ELEMID
3014  " does not match ring vertex %d", isoe->edge_id, from+1);
3015  }
3016 #endif
3017  }
3018 
3019  if ( ! match )
3020  {
3021  LWDEBUGF(1, "Edge %" LWTFMT_ELEMID " did not match as forward",
3022  isoe->edge_id);
3023  getPoint2d_p(epa, epa->npoints-1, &p2);
3024  LWDEBUGF(1, "Edge %" LWTFMT_ELEMID " 'last' point is %g,%g",
3025  isoe->edge_id, p2.x, p2.y);
3026  if ( p2d_same(&p1, &p2) )
3027  {
3028  LWDEBUGF(1, "Last point of edge %" LWTFMT_ELEMID
3029  " matches ring vertex %d", isoe->edge_id, from);
3030  /* last point matches, let's check next non-equal one */
3031  for ( j=2; j<=epa->npoints; j++ )
3032  {
3033  getPoint2d_p(epa, epa->npoints - j, &p2);
3034  LWDEBUGF(1, "Edge %" LWTFMT_ELEMID " 'prev' point %d is %g,%g",
3035  isoe->edge_id, epa->npoints - j, p2.x, p2.y);
3036  /* we won't check duplicated edge points */
3037  if ( p2d_same(&p1, &p2) ) continue;
3038  /* we assume there are no duplicated points in ring */
3039  getPoint2d_p(ring, from+1, &pt);
3040  LWDEBUGF(1, "Ring's point %d is %g,%g",
3041  from+1, pt.x, pt.y);
3042  match = p2d_same(&pt, &p2);
3043  break; /* we want to check a single non-equal next vertex */
3044  }
3045  }
3046 #if POSTGIS_DEBUG_LEVEL > 0
3047  if ( match ) {
3048  LWDEBUGF(1, "Prev point of edge %" LWTFMT_ELEMID
3049  " matches ring vertex %d", isoe->edge_id, from+1);
3050  } else {
3051  LWDEBUGF(1, "Prev point of edge %" LWTFMT_ELEMID
3052  " does not match ring vertex %d", isoe->edge_id, from+1);
3053  }
3054 #endif
3055  }
3056 
3057  if ( match ) return i;
3058 
3059  }
3060 
3061  return -1;
3062 }
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition: lwgeom.c:322
#define WKT_EXTENDED
Definition: liblwgeom.h:2167
int getPoint2d_p(const POINTARRAY *pa, uint32_t n, POINT2D *point)
Definition: lwgeom_api.c:343
char * lwgeom_to_wkt(const LWGEOM *geom, uint8_t variant, int precision, size_t *size_out)
WKT emitter function.
Definition: lwout_wkt.c:704
int p2d_same(const POINT2D *p1, const POINT2D *p2)
Definition: lwalgorithm.c:50
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:83
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:88
#define LWTFMT_ELEMID
Definition: lwgeom_topo.c:43
POINTARRAY * points
Definition: liblwgeom.h:497
LWT_ELEMID face_right
LWT_ELEMID face_left
LWLINE * geom
LWT_ELEMID edge_id
double y
Definition: liblwgeom.h:404
double x
Definition: liblwgeom.h:404
uint32_t npoints
Definition: liblwgeom.h:441

References LWT_ISO_EDGE::edge_id, LWT_ISO_EDGE::face_left, LWT_ISO_EDGE::face_right, LWT_ISO_EDGE::geom, getPoint2d_p(), LWDEBUG, LWDEBUGF, lwgeom_to_wkt(), lwline_as_lwgeom(), LWTFMT_ELEMID, POINTARRAY::npoints, p2d_same(), LWLINE::points, WKT_EXTENDED, POINT2D::x, and POINT2D::y.

Referenced by lwt_GetFaceEdges().

Here is the call graph for this function:
Here is the caller graph for this function: