PostGIS  2.4.9dev-r@@SVN_REVISION@@

◆ lwcircstring_linearize()

static LWLINE* lwcircstring_linearize ( const LWCIRCSTRING icurve,
double  tol,
LW_LINEARIZE_TOLERANCE_TYPE  tolerance_type,
int  flags 
)
static

Definition at line 412 of file lwstroke.c.

References POINTARRAY::flags, FLAGS_GET_M, FLAGS_GET_Z, getPoint4d_p(), LW_FALSE, LW_TRUE, lwarc_linearize(), LWDEBUG, LWDEBUGF, lwline_construct(), POINTARRAY::npoints, LWCIRCSTRING::points, ptarray_append_point(), ptarray_construct_empty(), ptarray_free(), and LWCIRCSTRING::srid.

Referenced by lwcollection_linearize(), lwcompound_linearize(), lwcurve_linearize(), lwcurvepoly_linearize(), and lwmcurve_linearize().

415 {
416  LWLINE *oline;
417  POINTARRAY *ptarray;
418  uint32_t i, j;
419  POINT4D p1, p2, p3, p4;
420  int ret;
421 
422  LWDEBUGF(2, "lwcircstring_linearize called., dim = %d", icurve->points->flags);
423 
424  ptarray = ptarray_construct_empty(FLAGS_GET_Z(icurve->points->flags), FLAGS_GET_M(icurve->points->flags), 64);
425 
426  for (i = 2; i < icurve->points->npoints; i+=2)
427  {
428  LWDEBUGF(3, "lwcircstring_linearize: arc ending at point %d", i);
429 
430  getPoint4d_p(icurve->points, i - 2, &p1);
431  getPoint4d_p(icurve->points, i - 1, &p2);
432  getPoint4d_p(icurve->points, i, &p3);
433 
434  ret = lwarc_linearize(ptarray, &p1, &p2, &p3, tol, tolerance_type, flags);
435  if ( ret > 0 )
436  {
437  LWDEBUGF(3, "lwcircstring_linearize: generated %d points", ptarray->npoints);
438  }
439  else if ( ret == 0 )
440  {
441  LWDEBUG(3, "lwcircstring_linearize: points are colinear, returning curve points as line");
442 
443  for (j = i - 2 ; j < i ; j++)
444  {
445  getPoint4d_p(icurve->points, j, &p4);
446  ptarray_append_point(ptarray, &p4, LW_TRUE);
447  }
448  }
449  else
450  {
451  /* An error occurred, lwerror should have been called by now */
452  ptarray_free(ptarray);
453  return NULL;
454  }
455  }
456  getPoint4d_p(icurve->points, icurve->points->npoints-1, &p1);
457  ptarray_append_point(ptarray, &p1, LW_FALSE);
458 
459  oline = lwline_construct(icurve->srid, NULL, ptarray);
460  return oline;
461 }
int npoints
Definition: liblwgeom.h:371
int32_t srid
Definition: liblwgeom.h:443
POINTARRAY * ptarray_construct_empty(char hasz, char hasm, uint32_t maxpoints)
Create a new POINTARRAY with no points.
Definition: ptarray.c:70
void ptarray_free(POINTARRAY *pa)
Definition: ptarray.c:330
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:83
static int lwarc_linearize(POINTARRAY *to, const POINT4D *p1, const POINT4D *p2, const POINT4D *p3, double tol, LW_LINEARIZE_TOLERANCE_TYPE tolerance_type, int flags)
Segmentize an arc.
Definition: lwstroke.c:134
unsigned int uint32_t
Definition: uthash.h:78
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, then a duplicate point will not be added.
Definition: ptarray.c:156
#define LW_FALSE
Definition: liblwgeom.h:77
uint8_t flags
Definition: liblwgeom.h:369
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:76
LWLINE * lwline_construct(int srid, GBOX *bbox, POINTARRAY *points)
Definition: lwline.c:42
#define FLAGS_GET_Z(flags)
Macros for manipulating the &#39;flags&#39; byte.
Definition: liblwgeom.h:140
#define FLAGS_GET_M(flags)
Definition: liblwgeom.h:141
POINTARRAY * points
Definition: liblwgeom.h:444
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:88
int getPoint4d_p(const POINTARRAY *pa, int n, POINT4D *point)
Definition: lwgeom_api.c:122
Here is the call graph for this function:
Here is the caller graph for this function: