PostGIS  3.7.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 751 of file lwlinearreferencing.c.

752 {
753  assert(tri);
754  char hasz = FLAGS_GET_Z(tri->flags), hasm = FLAGS_GET_M(tri->flags);
755  LWCOLLECTION *lwgeom_out = lwcollection_construct_empty(TINTYPE, tri->srid, hasz, hasm);
756  POINTARRAY *pa = ptarray_clamp_to_ordinate_range(tri->points, ordinate, from, to, LW_TRUE);
757 
758  if (!pa)
759  return NULL;
760 
761  if (pa->npoints >= 4)
762  {
763  POINT4D first = getPoint4d(pa, 0);
764  for (uint32_t i = 1; i < pa->npoints - 2; i++)
765  {
766  POINT4D p;
767  POINTARRAY *tpa = ptarray_construct_empty(hasz, hasm, 4);
768  ptarray_append_point(tpa, &first, LW_TRUE);
769  getPoint4d_p(pa, i, &p);
770  ptarray_append_point(tpa, &p, LW_TRUE);
771  getPoint4d_p(pa, i + 1, &p);
772  ptarray_append_point(tpa, &p, LW_TRUE);
773  ptarray_append_point(tpa, &first, LW_TRUE);
774  LWTRIANGLE *otri = lwtriangle_construct(tri->srid, NULL, tpa);
775  lwgeom_out = lwcollection_add_lwgeom(lwgeom_out, (LWGEOM *)otri);
776  }
777  }
778  ptarray_free(pa);
779  return lwgeom_out;
780 }
POINT4D getPoint4d(const POINTARRAY *pa, uint32_t n)
Definition: lwgeom_api.c:107
#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:327
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:189
#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: