PostGIS  3.3.9dev-r@@SVN_REVISION@@

◆ test_point_density()

static void test_point_density ( void  )
static

Definition at line 1585 of file cu_algorithm.c.

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

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: