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

◆ test_lwline_interpolate_points()

static void test_lwline_interpolate_points ( void  )
static

Definition at line 468 of file cu_algorithm.c.

469{
470 LWLINE* line = lwgeom_as_lwline(lwgeom_from_wkt("LINESTRING ZM (0 0 3 1, 1 1 2 2, 10 10 4 3)", LW_PARSER_CHECK_NONE));
471 LWLINE* line2d = lwgeom_as_lwline(lwgeom_from_wkt("LINESTRING (1 1, 3 7, 9 12)", LW_PARSER_CHECK_NONE));
472 LWLINE* empty_line = lwgeom_as_lwline(lwgeom_from_wkt("LINESTRING EMPTY", LW_PARSER_CHECK_NONE));
473
474 POINTARRAY* rpa;
475 POINT4D pta;
476 POINT4D ptb;
477 double eps = 1e-10;
478
479 /* Empty line gives empty point */
480 rpa = lwline_interpolate_points(empty_line, 0.5, LW_TRUE);
481 ASSERT_INT_EQUAL(rpa->npoints, 0);
482 ptarray_free(rpa);
483
484 /* Get first endpoint when fraction = 0 */
485 rpa = lwline_interpolate_points(line, 0, LW_TRUE);
486 ASSERT_INT_EQUAL(rpa->npoints, 1);
487 pta = getPoint4d(line->points, 0);
488 ptb = getPoint4d(rpa, 0);
489 ASSERT_POINT4D_EQUAL(pta, ptb, eps);
490 ptarray_free(rpa);
491
492 /* Get last endpoint when fraction = 0 */
493 rpa = lwline_interpolate_points(line, 1, LW_TRUE);
494 ASSERT_INT_EQUAL(rpa->npoints, 1);
495 pta = getPoint4d(line->points, line->points->npoints - 1);
496 ptb = getPoint4d(rpa, 0);
497 ASSERT_POINT4D_EQUAL(pta, ptb, eps);
498 ptarray_free(rpa);
499
500 /* Interpolate a single point */
501 /* First vertex is at 10% */
502 rpa = lwline_interpolate_points(line, 0.1, LW_FALSE);
503 ASSERT_INT_EQUAL(rpa->npoints, 1);
504 pta = getPoint4d(line->points, 1);
505 ptb = getPoint4d(rpa, 0);
506 ASSERT_POINT4D_EQUAL(pta, ptb, eps);
507 ptarray_free(rpa);
508
509 /* 5% is halfway to first vertex */
510 rpa = lwline_interpolate_points(line, 0.05, LW_FALSE);
511 ASSERT_INT_EQUAL(rpa->npoints, 1);
512 pta.x = 0.5;
513 pta.y = 0.5;
514 pta.m = 1.5;
515 pta.z = 2.5;
516 ptb = getPoint4d(rpa, 0);
517 ASSERT_POINT4D_EQUAL(pta, ptb, eps);
518 ptarray_free(rpa);
519
520 /* Now repeat points */
521 rpa = lwline_interpolate_points(line, 0.4, LW_TRUE);
522 ASSERT_INT_EQUAL(rpa->npoints, 2);
523 pta.x = 4;
524 pta.y = 4;
525 ptb = getPoint4d(rpa, 0);
526 ASSERT_POINT2D_EQUAL(pta, ptb, eps);
527
528 pta.x = 8;
529 pta.y = 8;
530 ptb = getPoint4d(rpa, 1);
531 ASSERT_POINT2D_EQUAL(pta, ptb, eps);
532 ptarray_free(rpa);
533
534 /* Make sure it works on 2D lines */
535 rpa = lwline_interpolate_points(line2d, 0.4, LW_TRUE);
536 ASSERT_INT_EQUAL(rpa->npoints, 2);
537 CU_ASSERT_FALSE(ptarray_has_z(rpa));
538 CU_ASSERT_FALSE(ptarray_has_m(rpa));
539 ptarray_free(rpa);
540
543 lwgeom_free(lwline_as_lwgeom(empty_line));
544}
#define ASSERT_POINT4D_EQUAL(o, e, eps)
#define ASSERT_INT_EQUAL(o, e)
#define ASSERT_POINT2D_EQUAL(o, e, eps)
POINT4D getPoint4d(const POINTARRAY *pa, uint32_t n)
Definition lwgeom_api.c:107
#define LW_FALSE
Definition liblwgeom.h:94
POINTARRAY * lwline_interpolate_points(const LWLINE *line, double length_fraction, char repeat)
Interpolate one or more points along a line.
Definition lwline.c:538
void lwgeom_free(LWGEOM *geom)
Definition lwgeom.c:1246
#define LW_PARSER_CHECK_NONE
Definition liblwgeom.h:2149
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition lwgeom.c:367
void ptarray_free(POINTARRAY *pa)
Definition ptarray.c:327
LWLINE * lwgeom_as_lwline(const LWGEOM *lwgeom)
Definition lwgeom.c:207
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:93
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
Definition lwin_wkt.c:940
int ptarray_has_z(const POINTARRAY *pa)
Definition ptarray.c:37
int ptarray_has_m(const POINTARRAY *pa)
Definition ptarray.c:44
POINTARRAY * points
Definition liblwgeom.h:483
double m
Definition liblwgeom.h:414
double x
Definition liblwgeom.h:414
double z
Definition liblwgeom.h:414
double y
Definition liblwgeom.h:414
uint32_t npoints
Definition liblwgeom.h:427

References ASSERT_INT_EQUAL, ASSERT_POINT2D_EQUAL, ASSERT_POINT4D_EQUAL, getPoint4d(), LW_FALSE, LW_PARSER_CHECK_NONE, LW_TRUE, lwgeom_as_lwline(), lwgeom_free(), lwgeom_from_wkt(), lwline_as_lwgeom(), lwline_interpolate_points(), POINT4D::m, POINTARRAY::npoints, LWLINE::points, ptarray_free(), ptarray_has_m(), ptarray_has_z(), POINT4D::x, POINT4D::y, and POINT4D::z.

Referenced by algorithms_suite_setup().

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