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

◆ _lwt_RegisterFaceOnEdgeSide()

static int _lwt_RegisterFaceOnEdgeSide ( LWT_TOPOLOGY topo,
LWT_ISO_EDGE edge,
int  side,
LWT_ISO_EDGE_TABLE edges,
LWT_EDGERING_ARRAY holes,
LWT_EDGERING_ARRAY shells,
LWT_ELEMID registered 
)
static

Definition at line 564 of file lwgeom_topo_polygonizer.c.

569{
570 const LWT_BE_IFACE *iface = topo->be_iface;
571 /* this is arbitrary, could be taken as parameter */
572 static const LWT_ELEMID placeholder_faceid = LWT_HOLES_FACE_PLACEHOLDER;
573 LWT_EDGERING *ring;
574
575 /* Get edge ring */
576 ring = _lwt_BuildEdgeRing(topo, edges, edge, side);
577
578 LWDEBUG(2, "Ring built, calling EdgeRingIsCCW");
579
580 /* Compute winding (CW or CCW?) */
581 int isccw = _lwt_EdgeRingIsCCW(ring);
582
583 if ( isccw )
584 {
585 /* Create new face */
586 LWT_ISO_FACE newface;
587
588 LWDEBUGF(1, "Ring of edge %lld is a shell (shell %d)", edge->edge_id * side, shells->size);
589
590 newface.mbr = _lwt_EdgeRingGetBbox(ring);
591
592 newface.face_id = -1;
593 /* Insert the new face */
594 int ret = lwt_be_insertFaces( topo, &newface, 1 );
595 newface.mbr = NULL;
596 if ( ret == -1 )
597 {
599 return -1;
600 }
601 if ( ret != 1 )
602 {
603 lwerror("Unexpected error: %d faces inserted when expecting 1", ret);
604 return -1;
605 }
606 /* return new face_id */
607 *registered = newface.face_id;
608 LWT_EDGERING_ARRAY_PUSH(shells, ring);
609
610 /* update ring edges set new face_id on resp. side to *registered */
611 ret = _lwt_UpdateEdgeRingSideFace(topo, ring, *registered);
612 if ( ret )
613 {
614 lwerror("Errors updating edgering side face: %s",
616 return -1;
617 }
618
619 }
620 else /* cw, so is an hole */
621 {
622 LWDEBUGF(1, "Ring of edge %lld is a hole (hole %d)", edge->edge_id * side, holes->size);
623 *registered = placeholder_faceid;
624 LWT_EDGERING_ARRAY_PUSH(holes, ring);
625 }
626
627 return 0;
628}
LWT_INT64 LWT_ELEMID
Identifier of topology element.
const char * lwt_be_lastErrorMessage(const LWT_BE_IFACE *be)
#define PGTOPO_BE_ERROR()
int lwt_be_insertFaces(LWT_TOPOLOGY *topo, LWT_ISO_FACE *face, uint64_t numelems)
#define LWDEBUG(level, msg)
Definition lwgeom_log.h:101
#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.
static GBOX * _lwt_EdgeRingGetBbox(LWT_EDGERING *ring)
static LWT_EDGERING * _lwt_BuildEdgeRing(__attribute__((__unused__)) LWT_TOPOLOGY *topo, LWT_ISO_EDGE_TABLE *edges, LWT_ISO_EDGE *edge, int side)
static int _lwt_UpdateEdgeRingSideFace(LWT_TOPOLOGY *topo, LWT_EDGERING *ring, LWT_ELEMID face)
static int _lwt_EdgeRingIsCCW(LWT_EDGERING *ring)
#define LWT_HOLES_FACE_PLACEHOLDER
#define LWT_EDGERING_ARRAY_PUSH(a, r)
LWT_ELEMID edge_id
LWT_ELEMID face_id
const LWT_BE_IFACE * be_iface

References _lwt_BuildEdgeRing(), _lwt_EdgeRingGetBbox(), _lwt_EdgeRingIsCCW(), _lwt_UpdateEdgeRingSideFace(), LWT_TOPOLOGY_T::be_iface, LWT_ISO_EDGE::edge_id, LWT_ISO_FACE::face_id, LWDEBUG, LWDEBUGF, lwerror(), lwt_be_insertFaces(), lwt_be_lastErrorMessage(), LWT_EDGERING_ARRAY_PUSH, LWT_HOLES_FACE_PLACEHOLDER, LWT_ISO_FACE::mbr, PGTOPO_BE_ERROR, and LWT_EDGERING_ARRAY_T::size.

Referenced by lwt_Polygonize().

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