PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ 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:1218
#define LW_PARSER_CHECK_NONE
Definition: liblwgeom.h:2146
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:940
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: