PostGIS  3.1.6dev-r@@SVN_REVISION@@

◆ test_point_density()

static void test_point_density ( void  )
static

Definition at line 1573 of file cu_algorithm.c.

1574 {
1575  LWGEOM *geom;
1576  LWMPOINT *mpt;
1577  LWMPOINT *mpt2;
1578  LWPOINT *pt;
1579  LWPOINT *pt2;
1580  int eq, i;
1581  // char *ewkt;
1582 
1583  /* POLYGON */
1584  geom = lwgeom_from_wkt("POLYGON((0 0,1 0,1 1,0 1,0 0))", LW_PARSER_CHECK_NONE);
1585  mpt = lwgeom_to_points(geom, 100, 0); /* Set a zero seed to base it on Unix time and process ID */
1586  CU_ASSERT_EQUAL(mpt->ngeoms,100);
1587 
1588  /* Run a second time with a zero seed to get a different multipoint sequence */
1589  mpt2 = lwgeom_to_points(geom, 100, 0);
1590  eq = 0;
1591  for (i = 0; i < 100; i++)
1592  {
1593  pt = (LWPOINT*)mpt->geoms[i];
1594  pt2 = (LWPOINT*)mpt2->geoms[i];
1595  if (lwpoint_get_x(pt) == lwpoint_get_x(pt2) && lwpoint_get_y(pt) == lwpoint_get_y(pt2))
1596  eq++;
1597  }
1598  CU_ASSERT_EQUAL(eq, 0);
1599  lwmpoint_free(mpt);
1600  lwmpoint_free(mpt2);
1601  pt = NULL;
1602  pt2 = NULL;
1603 
1604  /* Set seed to get a deterministic sequence */
1605  mpt = lwgeom_to_points(geom, 1000, 12345);
1606 
1607  /* Check to find a different multipoint sequence with different seed */
1608  mpt2 = lwgeom_to_points(geom, 1000, 54321);
1609  eq = 0;
1610  for (i = 0; i < 1000; 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(mpt2);
1619  pt = NULL;
1620  pt2 = NULL;
1621 
1622  /* Check to find an identical multipoint sequence with same seed */
1623  mpt2 = lwgeom_to_points(geom, 1000, 12345);
1624  eq = 0;
1625  for (i = 0; i < 1000; i++)
1626  {
1627  pt = (LWPOINT*)mpt->geoms[i];
1628  pt2 = (LWPOINT*)mpt2->geoms[i];
1629  if (lwpoint_get_x(pt) == lwpoint_get_x(pt2) && lwpoint_get_y(pt) == lwpoint_get_y(pt2))
1630  eq++;
1631  }
1632  CU_ASSERT_EQUAL(eq, 1000);
1633  lwmpoint_free(mpt2);
1634  pt = NULL;
1635  pt2 = NULL;
1636 
1637 
1638  /* Check if the 1000th point is the expected value.
1639  * Note that if the RNG is not portable, this test may fail. */
1640  pt = (LWPOINT*)mpt->geoms[999];
1641  // ewkt = lwgeom_to_ewkt((LWGEOM*)pt);
1642  // printf("%s\n", ewkt);
1643  // lwfree(ewkt);
1644  CU_ASSERT_DOUBLE_EQUAL(lwpoint_get_x(pt), 0.801167838758, 1e-11);
1645  CU_ASSERT_DOUBLE_EQUAL(lwpoint_get_y(pt), 0.345281131175, 1e-11);
1646  lwmpoint_free(mpt);
1647  pt = NULL;
1648 
1649  mpt = lwgeom_to_points(geom, 0, 0);
1650  CU_ASSERT_EQUAL(mpt, NULL);
1651  lwmpoint_free(mpt);
1652 
1653  lwgeom_free(geom);
1654 
1655  /* MULTIPOLYGON */
1656  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);
1657 
1658  mpt = lwgeom_to_points(geom, 1000, 0);
1659  CU_ASSERT_EQUAL(mpt->ngeoms,1000);
1660  lwmpoint_free(mpt);
1661 
1662  mpt = lwgeom_to_points(geom, 1, 0);
1663  CU_ASSERT_EQUAL(mpt->ngeoms,1);
1664  lwmpoint_free(mpt);
1665 
1666  lwgeom_free(geom);
1667 }
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:2085
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:552
LWPOINT ** geoms
Definition: liblwgeom.h:547

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: