PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ _lwt_BuildEdgeRing()

static LWT_EDGERING * _lwt_BuildEdgeRing ( __attribute__((__unused__)) LWT_TOPOLOGY topo,
LWT_ISO_EDGE_TABLE edges,
LWT_ISO_EDGE edge,
int  side 
)
static

Definition at line 353 of file lwgeom_topo_polygonizer.c.

355{
356 LWT_EDGERING *ring;
357 LWT_EDGERING_ELEM *elem;
359 int curside;
360
361 ring = lwalloc(sizeof(LWT_EDGERING));
362 LWT_EDGERING_INIT(ring);
363
364 cur = edge;
365 curside = side;
366
367 LWDEBUGF(2, "Building rings for edge %lld (side %d)", cur->edge_id, side);
368
369 do {
370 LWT_ELEMID next;
371
372 elem = lwalloc(sizeof(LWT_EDGERING_ELEM));
373 elem->edge = cur;
374 elem->left = ( curside == 1 );
375
376 /* Mark edge as "visited" */
377 if ( elem->left ) cur->face_left = LWT_HOLES_FACE_PLACEHOLDER;
378 else cur->face_right = LWT_HOLES_FACE_PLACEHOLDER;
379
380 LWT_EDGERING_PUSH(ring, elem);
381 next = elem->left ? cur->next_left : cur->next_right;
382
383 LWDEBUGF(3, " next edge is %lld", next);
384
385 if ( next > 0 ) curside = 1;
386 else { curside = -1; next = -next; }
387 cur = _lwt_getIsoEdgeById(edges, next);
388 if ( ! cur )
389 {
390 lwerror("Could not find edge with id %" LWTFMT_ELEMID, next);
391 break;
392 }
393 } while (cur != edge || curside != side);
394
395 LWDEBUGF(1, "Ring for edge %lld has %d elems", edge->edge_id*side, ring->size);
396
397 return ring;
398}
void * lwalloc(size_t size)
Definition lwutil.c:227
LWT_INT64 LWT_ELEMID
Identifier of topology element.
#define LWTFMT_ELEMID
#define LWDEBUGF(level, msg,...)
Definition lwgeom_log.h:106
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
#define LWT_EDGERING_INIT(a)
#define LWT_HOLES_FACE_PLACEHOLDER
static LWT_ISO_EDGE * _lwt_getIsoEdgeById(LWT_ISO_EDGE_TABLE *tab, LWT_ELEMID id)
#define LWT_EDGERING_PUSH(a, r)
LWT_ELEMID edge_id

References _lwt_getIsoEdgeById(), LWT_EDGERING_ELEM_T::edge, LWT_ISO_EDGE::edge_id, LWT_EDGERING_ELEM_T::left, lwalloc(), LWDEBUGF, lwerror(), LWT_EDGERING_INIT, LWT_EDGERING_PUSH, LWT_HOLES_FACE_PLACEHOLDER, LWTFMT_ELEMID, and LWT_EDGERING_T::size.

Referenced by _lwt_RegisterFaceOnEdgeSide().

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