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

◆ test_point_density()

static void test_point_density ( void  )
static

Definition at line 1592 of file cu_algorithm.c.

1593{
1594 LWGEOM *geom;
1595 LWMPOINT *mpt;
1596 LWMPOINT *mpt2;
1597 LWPOINT *pt;
1598 LWPOINT *pt2;
1599 int eq, i;
1600 // char *ewkt;
1601
1602 /* POLYGON */
1603 geom = lwgeom_from_wkt("POLYGON((0 0,1 0,1 1,0 1,0 0))", LW_PARSER_CHECK_NONE);
1604 mpt = lwgeom_to_points(geom, 100, 0); /* Set a zero seed to base it on Unix time and process ID */
1605 CU_ASSERT_EQUAL(mpt->ngeoms,100);
1606
1607 /* Run a second time with a zero seed to get a different multipoint sequence */
1608 mpt2 = lwgeom_to_points(geom, 100, 0);
1609 eq = 0;
1610 for (i = 0; i < 100; i++)
1611 {
1612 pt = (LWPOINT*)mpt->geoms[i];
1613 pt2 = (LWPOINT*)mpt2->geoms[i];
1614 if (lwpoint_get_x(pt) == lwpoint_get_x(pt2) && lwpoint_get_y(pt) == lwpoint_get_y(pt2))
1615 eq++;
1616 }
1617 CU_ASSERT_EQUAL(eq, 0);
1618 lwmpoint_free(mpt);
1619 lwmpoint_free(mpt2);
1620 pt = NULL;
1621 pt2 = NULL;
1622
1623 /* Set seed to get a deterministic sequence */
1624 mpt = lwgeom_to_points(geom, 1000, 12345);
1625
1626 /* Check to find a different multipoint sequence with different seed */
1627 mpt2 = lwgeom_to_points(geom, 1000, 54321);
1628 eq = 0;
1629 for (i = 0; i < 1000; i++)
1630 {
1631 pt = (LWPOINT*)mpt->geoms[i];
1632 pt2 = (LWPOINT*)mpt2->geoms[i];
1633 if (lwpoint_get_x(pt) == lwpoint_get_x(pt2) && lwpoint_get_y(pt) == lwpoint_get_y(pt2))
1634 eq++;
1635 }
1636 CU_ASSERT_EQUAL(eq, 0);
1637 lwmpoint_free(mpt2);
1638 pt = NULL;
1639 pt2 = NULL;
1640
1641 /* Check to find an identical multipoint sequence with same seed */
1642 mpt2 = lwgeom_to_points(geom, 1000, 12345);
1643 eq = 0;
1644 for (i = 0; i < 1000; i++)
1645 {
1646 pt = (LWPOINT*)mpt->geoms[i];
1647 pt2 = (LWPOINT*)mpt2->geoms[i];
1648 if (lwpoint_get_x(pt) == lwpoint_get_x(pt2) && lwpoint_get_y(pt) == lwpoint_get_y(pt2))
1649 eq++;
1650 }
1651 CU_ASSERT_EQUAL(eq, 1000);
1652 lwmpoint_free(mpt2);
1653 pt = NULL;
1654 pt2 = NULL;
1655
1656
1657 /* Check if the 1000th point is the expected value.
1658 * Note that if the RNG is not portable, this test may fail. */
1659 pt = (LWPOINT*)mpt->geoms[999];
1660 // char* ewkt = lwgeom_to_ewkt((LWGEOM*)pt);
1661 // printf("%s\n", ewkt);
1662 // lwfree(ewkt);
1663 CU_ASSERT_DOUBLE_EQUAL(lwpoint_get_x(pt), 0.363667838758, 1e-11);
1664 CU_ASSERT_DOUBLE_EQUAL(lwpoint_get_y(pt), 0.782781131175, 1e-11);
1665 lwmpoint_free(mpt);
1666 pt = NULL;
1667
1668 mpt = lwgeom_to_points(geom, 0, 0);
1669 CU_ASSERT_EQUAL(mpt, NULL);
1670 lwmpoint_free(mpt);
1671
1672 lwgeom_free(geom);
1673
1674 /* MULTIPOLYGON */
1675 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);
1676
1677 mpt = lwgeom_to_points(geom, 1000, 0);
1678 CU_ASSERT_EQUAL(mpt->ngeoms,1000);
1679 lwmpoint_free(mpt);
1680
1681 mpt = lwgeom_to_points(geom, 1, 0);
1682 CU_ASSERT_EQUAL(mpt->ngeoms,1);
1683 lwmpoint_free(mpt);
1684
1685 lwgeom_free(geom);
1686}
void lwmpoint_free(LWMPOINT *mpt)
Definition lwmpoint.c:72
void lwgeom_free(LWGEOM *geom)
Definition lwgeom.c:1246
#define LW_PARSER_CHECK_NONE
Definition liblwgeom.h:2149
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:940
double lwpoint_get_y(const LWPOINT *point)
Definition lwpoint.c:76
uint32_t ngeoms
Definition liblwgeom.h:538
LWPOINT ** geoms
Definition liblwgeom.h:533

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: