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

◆ test_point_density()

static void test_point_density ( void  )
static

Definition at line 1568 of file cu_algorithm.c.

1569{
1570 LWGEOM *geom;
1571 LWMPOINT *mpt;
1572 LWMPOINT *mpt2;
1573 LWPOINT *pt;
1574 LWPOINT *pt2;
1575 int eq, i;
1576 // char *ewkt;
1577
1578 /* POLYGON */
1579 geom = lwgeom_from_wkt("POLYGON((0 0,1 0,1 1,0 1,0 0))", LW_PARSER_CHECK_NONE);
1580 mpt = lwgeom_to_points(geom, 100, 0); /* Set a zero seed to base it on Unix time and process ID */
1581 CU_ASSERT_EQUAL(mpt->ngeoms,100);
1582
1583 /* Run a second time with a zero seed to get a different multipoint sequence */
1584 mpt2 = lwgeom_to_points(geom, 100, 0);
1585 eq = 0;
1586 for (i = 0; i < 100; i++)
1587 {
1588 pt = (LWPOINT*)mpt->geoms[i];
1589 pt2 = (LWPOINT*)mpt2->geoms[i];
1590 if (lwpoint_get_x(pt) == lwpoint_get_x(pt2) && lwpoint_get_y(pt) == lwpoint_get_y(pt2))
1591 eq++;
1592 }
1593 CU_ASSERT_EQUAL(eq, 0);
1594 lwmpoint_free(mpt);
1595 lwmpoint_free(mpt2);
1596 pt = NULL;
1597 pt2 = NULL;
1598
1599 /* Set seed to get a deterministic sequence */
1600 mpt = lwgeom_to_points(geom, 1000, 12345);
1601
1602 /* Check to find a different multipoint sequence with different seed */
1603 mpt2 = lwgeom_to_points(geom, 1000, 54321);
1604 eq = 0;
1605 for (i = 0; i < 1000; i++)
1606 {
1607 pt = (LWPOINT*)mpt->geoms[i];
1608 pt2 = (LWPOINT*)mpt2->geoms[i];
1609 if (lwpoint_get_x(pt) == lwpoint_get_x(pt2) && lwpoint_get_y(pt) == lwpoint_get_y(pt2))
1610 eq++;
1611 }
1612 CU_ASSERT_EQUAL(eq, 0);
1613 lwmpoint_free(mpt2);
1614 pt = NULL;
1615 pt2 = NULL;
1616
1617 /* Check to find an identical multipoint sequence with same seed */
1618 mpt2 = lwgeom_to_points(geom, 1000, 12345);
1619 eq = 0;
1620 for (i = 0; i < 1000; i++)
1621 {
1622 pt = (LWPOINT*)mpt->geoms[i];
1623 pt2 = (LWPOINT*)mpt2->geoms[i];
1624 if (lwpoint_get_x(pt) == lwpoint_get_x(pt2) && lwpoint_get_y(pt) == lwpoint_get_y(pt2))
1625 eq++;
1626 }
1627 CU_ASSERT_EQUAL(eq, 1000);
1628 lwmpoint_free(mpt2);
1629 pt = NULL;
1630 pt2 = NULL;
1631
1632
1633 /* Check if the 1000th point is the expected value.
1634 * Note that if the RNG is not portable, this test may fail. */
1635 pt = (LWPOINT*)mpt->geoms[999];
1636 // ewkt = lwgeom_to_ewkt((LWGEOM*)pt);
1637 // printf("%s\n", ewkt);
1638 // lwfree(ewkt);
1639 CU_ASSERT_DOUBLE_EQUAL(lwpoint_get_x(pt), 0.801167838758, 1e-11);
1640 CU_ASSERT_DOUBLE_EQUAL(lwpoint_get_y(pt), 0.345281131175, 1e-11);
1641 lwmpoint_free(mpt);
1642 pt = NULL;
1643
1644 mpt = lwgeom_to_points(geom, 0, 0);
1645 CU_ASSERT_EQUAL(mpt, NULL);
1646 lwmpoint_free(mpt);
1647
1648 lwgeom_free(geom);
1649
1650 /* MULTIPOLYGON */
1651 geom = lwgeom_from_wkt("MULTIPOLYGON(((10 0,0 10,10 20,20 10,10 0)),((0 0,5 0,5 5,0 5,0 0)))", LW_PARSER_CHECK_NONE);
1652
1653 mpt = lwgeom_to_points(geom, 1000, 0);
1654 CU_ASSERT_EQUAL(mpt->ngeoms,1000);
1655 lwmpoint_free(mpt);
1656
1657 mpt = lwgeom_to_points(geom, 1, 0);
1658 CU_ASSERT_EQUAL(mpt->ngeoms,1);
1659 lwmpoint_free(mpt);
1660
1661 lwgeom_free(geom);
1662}
void lwmpoint_free(LWMPOINT *mpt)
Definition lwmpoint.c:72
void lwgeom_free(LWGEOM *geom)
Definition lwgeom.c:1138
#define LW_PARSER_CHECK_NONE
Definition liblwgeom.h:2060
double lwpoint_get_x(const LWPOINT *point)
Definition lwpoint.c:63
LWMPOINT * lwgeom_to_points(const LWGEOM *lwgeom, uint32_t npoints, int32_t seed)
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
Definition lwin_wkt.c:905
double lwpoint_get_y(const LWPOINT *point)
Definition lwpoint.c:76
uint32_t ngeoms
Definition liblwgeom.h:524
LWPOINT ** geoms
Definition liblwgeom.h:519

References LWMPOINT::geoms, LW_PARSER_CHECK_NONE, lwgeom_free(), lwgeom_from_wkt(), lwgeom_to_points(), lwmpoint_free(), lwpoint_get_x(), lwpoint_get_y(), and LWMPOINT::ngeoms.

Referenced by algorithms_suite_setup().

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