PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ test_point_density()

static void test_point_density ( void  )
static

Definition at line 1593 of file cu_algorithm.c.

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