PostGIS  3.0.6dev-r@@SVN_REVISION@@

◆ 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
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: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: