PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ lwtriangle_clip_to_ordinate_range()

static LWCOLLECTION* lwtriangle_clip_to_ordinate_range ( const LWTRIANGLE tri,
char  ordinate,
double  from,
double  to 
)
inlinestatic

Clip an input LWTRIANGLE between two values, on any ordinate input.

Definition at line 763 of file lwlinearreferencing.c.

764 {
765  assert(tri);
766  char hasz = FLAGS_GET_Z(tri->flags), hasm = FLAGS_GET_M(tri->flags);
767  LWCOLLECTION *lwgeom_out = lwcollection_construct_empty(TINTYPE, tri->srid, hasz, hasm);
768  POINTARRAY *pa = ptarray_clamp_to_ordinate_range(tri->points, ordinate, from, to, LW_TRUE);
769 
770  if (!pa)
771  return NULL;
772 
773  if (pa->npoints >= 4)
774  {
775  POINT4D first = getPoint4d(pa, 0);
776  for (uint32_t i = 1; i < pa->npoints - 2; i++)
777  {
778  POINT4D p;
779  POINTARRAY *tpa = ptarray_construct_empty(hasz, hasm, 4);
780  ptarray_append_point(tpa, &first, LW_TRUE);
781  getPoint4d_p(pa, i, &p);
782  ptarray_append_point(tpa, &p, LW_TRUE);
783  getPoint4d_p(pa, i + 1, &p);
784  ptarray_append_point(tpa, &p, LW_TRUE);
785  ptarray_append_point(tpa, &first, LW_TRUE);
786  LWTRIANGLE *otri = lwtriangle_construct(tri->srid, NULL, tpa);
787  lwgeom_out = lwcollection_add_lwgeom(lwgeom_out, (LWGEOM *)otri);
788  }
789  }
790  ptarray_free(pa);
791  return lwgeom_out;
792 }
POINT4D getPoint4d(const POINTARRAY *pa, uint32_t n)
Definition: lwgeom_api.c:108
#define FLAGS_GET_Z(flags)
Definition: liblwgeom.h:165
#define TINTYPE
Definition: liblwgeom.h:116
POINTARRAY * ptarray_construct_empty(char hasz, char hasm, uint32_t maxpoints)
Create a new POINTARRAY with no points.
Definition: ptarray.c:59
LWCOLLECTION * lwcollection_construct_empty(uint8_t type, int32_t srid, char hasz, char hasm)
Definition: lwcollection.c:92
#define FLAGS_GET_M(flags)
Definition: liblwgeom.h:166
int getPoint4d_p(const POINTARRAY *pa, uint32_t n, POINT4D *point)
Definition: lwgeom_api.c:125
void ptarray_free(POINTARRAY *pa)
Definition: ptarray.c:319
int ptarray_append_point(POINTARRAY *pa, const POINT4D *pt, int allow_duplicates)
Append a point to the end of an existing POINTARRAY If allow_duplicate is LW_FALSE,...
Definition: ptarray.c:147
LWCOLLECTION * lwcollection_add_lwgeom(LWCOLLECTION *col, const LWGEOM *geom)
Appends geom to the collection managed by col.
Definition: lwcollection.c:188
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:93
LWTRIANGLE * lwtriangle_construct(int32_t srid, GBOX *bbox, POINTARRAY *points)
Definition: lwtriangle.c:40
static POINTARRAY * ptarray_clamp_to_ordinate_range(const POINTARRAY *ipa, char ordinate, double from, double to, uint8_t is_closed)
int32_t srid
Definition: liblwgeom.h:496
lwflags_t flags
Definition: liblwgeom.h:497
POINTARRAY * points
Definition: liblwgeom.h:495
uint32_t npoints
Definition: liblwgeom.h:427

References LWTRIANGLE::flags, FLAGS_GET_M, FLAGS_GET_Z, getPoint4d(), getPoint4d_p(), LW_TRUE, lwcollection_add_lwgeom(), lwcollection_construct_empty(), lwtriangle_construct(), POINTARRAY::npoints, LWTRIANGLE::points, ptarray_append_point(), ptarray_clamp_to_ordinate_range(), ptarray_construct_empty(), ptarray_free(), LWTRIANGLE::srid, and TINTYPE.

Referenced by lwgeom_clip_to_ordinate_range().

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