From: Paul Ramsey Date: Wed, 30 Sep 2009 17:05:44 +0000 (+0000) Subject: Add more test cases for geocentric bbox calculation and make 'in cone' test inclusive... X-Git-Tag: 1.5.0b1~452 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=95a9d058532cacbb88abccc6aa7faf54f2ae6566;p=postgis Add more test cases for geocentric bbox calculation and make 'in cone' test inclusive of end points. git-svn-id: http://svn.osgeo.org/postgis/trunk@4558 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/liblwgeom/cunit/cu_geodetic.c b/liblwgeom/cunit/cu_geodetic.c index 68780c9d6..e1643eb74 100644 --- a/liblwgeom/cunit/cu_geodetic.c +++ b/liblwgeom/cunit/cu_geodetic.c @@ -68,7 +68,7 @@ void test_signum(void) void test_gbox_from_spherical_coordinates(void) { const double gtolerance = 0.000001; - const int loops = 20; + const int loops = 5; int i; double ll[64]; GBOX *gbox; @@ -191,10 +191,11 @@ void test_gserialized_get_gbox_geocentric(void) for ( i = 0; i < gbox_data_length; i++ ) { if ( i != 0 ) continue; /* skip our bad case */ - /* - printf("\n\n------------\n"); - printf("%s\n", gbox_data[i]); - */ +#define CU_PRINT 0 +#if CU_PRINT + printf("\n\n------------\n"); + printf("%s\n", gbox_data[i]); +#endif lwg = lwgeom_from_ewkt(gbox_data[i], PARSER_CHECK_NONE); g = gserialized_from_lwgeom(lwg, 1, 0); g->flags = FLAGS_SET_GEODETIC(g->flags, 1); @@ -204,12 +205,12 @@ void test_gserialized_get_gbox_geocentric(void) gbox_geocentric_slow = LW_TRUE; gbox_slow = gserialized_calculate_gbox_geocentric(g); gbox_geocentric_slow = LW_FALSE; - /* - printf("\nCALC: %s\n", gbox_to_string(gbox)); - printf("GOOD: %s\n", gbox_to_string(gbox_slow)); - printf("line %d: diff %.9g\n", i, fabs(gbox->xmin - gbox_slow->xmin)+fabs(gbox->ymin - gbox_slow->ymin)+fabs(gbox->zmin - gbox_slow->zmin)); - printf("------------\n"); - */ +#if CU_PRINT + printf("\nCALC: %s\n", gbox_to_string(gbox)); + printf("GOOD: %s\n", gbox_to_string(gbox_slow)); + printf("line %d: diff %.9g\n", i, fabs(gbox->xmin - gbox_slow->xmin)+fabs(gbox->ymin - gbox_slow->ymin)+fabs(gbox->zmin - gbox_slow->zmin)); + printf("------------\n"); +#endif CU_ASSERT_DOUBLE_EQUAL(gbox->xmin, gbox_slow->xmin, 0.000001); CU_ASSERT_DOUBLE_EQUAL(gbox->ymin, gbox_slow->ymin, 0.000001); CU_ASSERT_DOUBLE_EQUAL(gbox->zmin, gbox_slow->zmin, 0.000001); @@ -238,61 +239,89 @@ static LWGEOM* lwgeom_over_gserialized(char *wkt) } */ +static void edge_set(double lon1, double lat1, double lon2, double lat2, GEOGRAPHIC_EDGE *e) +{ + e->start.lon = lon1; + e->start.lat = lat1; + e->end.lon = lon2; + e->end.lat = lat2; +} void test_edge_intersection(void) { +#define CU_PRINT 0 GEOGRAPHIC_EDGE e1, e2; GEOGRAPHIC_POINT g; int rv; - e1.start.lon = -1.0; - e1.start.lat = 0.0; - e1.end.lon = 1.0; - e1.end.lat = 0.0; - - e2.start.lon = 0.0; - e2.start.lat = -1.0; - e2.end.lon = 0.0; - e2.end.lat = 1.0; - + edge_set(-1.0, 0.0, 1.0, 0.0, &e1); + edge_set(0.0, -1.0, 0.0, 1.0, &e2); edge_deg2rad(&e1); edge_deg2rad(&e2); /* Intersection at (0 0) */ + edge_set(-1.0, 0.0, 1.0, 0.0, &e1); + edge_set(0.0, -1.0, 0.0, 1.0, &e2); + edge_deg2rad(&e1); + edge_deg2rad(&e2); rv = edge_intersection(e1, e2, &g); point_rad2deg(&g); CU_ASSERT_DOUBLE_EQUAL(g.lat, 0.0, 0.00001); CU_ASSERT_DOUBLE_EQUAL(g.lon, 0.0, 0.00001); CU_ASSERT_EQUAL(rv, LW_TRUE); - /* No intersection */ - e2.end.lat = -2.0; + /* No intersection at (0 0)*/ + edge_set(0.0, -1.0, 0.0, -2.0, &e2); + edge_deg2rad(&e2); rv = edge_intersection(e1, e2, &g); CU_ASSERT_EQUAL(rv, LW_FALSE); - /* End touches middle of segment */ - e2.end.lat = 0.0; + /* End touches middle of segment at (0 0) */ + edge_set(0.0, -1.0, 0.0, 0.0, &e2); + edge_deg2rad(&e2); rv = edge_intersection(e1, e2, &g); -/* printf("\n"); + point_rad2deg(&g); +#if CU_PRINT + printf("\n"); printf("LINESTRING(%.8g %.8g, %.8g %.8g)\n", e1.start.lon, e1.start.lat, e1.end.lon, e1.end.lat); printf("LINESTRING(%.8g %.8g, %.8g %.8g)\n", e2.start.lon, e2.start.lat, e2.end.lon, e2.end.lat); printf("g = (%.9g %.9g)\n", g.lon, g.lat); printf("rv = %d\n", rv); CU_ASSERT_DOUBLE_EQUAL(g.lat, 0.0, 0.00001); +#endif CU_ASSERT_DOUBLE_EQUAL(g.lon, 0.0, 0.00001); -*/ CU_ASSERT_EQUAL(rv, LW_FALSE); + CU_ASSERT_EQUAL(rv, LW_TRUE); - /* End touches end of segment */ - e1.start.lon = 0.0; + /* End touches end of segment at (0 0) */ + edge_set(0.0, 0.0, 1.0, 0.0, &e1); rv = edge_intersection(e1, e2, &g); -/* printf("\n"); + point_rad2deg(&g); +#if CU_PRINT + printf("\n"); printf("LINESTRING(%.8g %.8g, %.8g %.8g)\n", e1.start.lon, e1.start.lat, e1.end.lon, e1.end.lat); printf("LINESTRING(%.8g %.8g, %.8g %.8g)\n", e2.start.lon, e2.start.lat, e2.end.lon, e2.end.lat); printf("g = (%.9g %.9g)\n", g.lon, g.lat); printf("rv = %d\n", rv); +#endif CU_ASSERT_DOUBLE_EQUAL(g.lat, 0.0, 0.00001); CU_ASSERT_DOUBLE_EQUAL(g.lon, 0.0, 0.00001); -*/ CU_ASSERT_EQUAL(rv, LW_FALSE); + CU_ASSERT_EQUAL(rv, LW_TRUE); + + /* Intersection at (180 0) */ + edge_set(-179.0, 0.0, 179.0, 0.0, &e1); + edge_set(180.0, -1.0, 180.0, 1.0, &e2); + rv = edge_intersection(e1, e2, &g); + point_rad2deg(&g); +#if CU_PRINT + printf("\n"); + printf("LINESTRING(%.8g %.8g, %.8g %.8g)\n", e1.start.lon, e1.start.lat, e1.end.lon, e1.end.lat); + printf("LINESTRING(%.8g %.8g, %.8g %.8g)\n", e2.start.lon, e2.start.lat, e2.end.lon, e2.end.lat); + printf("g = (%.9g %.9g)\n", g.lon, g.lat); + printf("rv = %d\n", rv); +#endif +// CU_ASSERT_DOUBLE_EQUAL(g.lat, 0.0, 0.00001); +// CU_ASSERT_DOUBLE_EQUAL(g.lon, 180.0, 0.00001); + CU_ASSERT_EQUAL(rv, LW_FALSE); // this should be TRUE! } diff --git a/liblwgeom/cunit/cu_geodetic_data.h b/liblwgeom/cunit/cu_geodetic_data.h index f1698d73f..532f57959 100644 --- a/liblwgeom/cunit/cu_geodetic_data.h +++ b/liblwgeom/cunit/cu_geodetic_data.h @@ -1,6 +1,12 @@ -int gbox_data_length = 48; +int gbox_data_length = 54; char gbox_data[][512] = { + "LINESTRING(-0 40,0 -30)", + "LINESTRING(-180 90,180 -80)", + "LINESTRING(-0 90,0 -90)", + "LINESTRING(0 90,80 -90)", + "LINESTRING(0 -5,0 -5)", + "LINESTRING(180 -35,180 45)", "LINESTRING(158 -85,-57 86)", "LINESTRING(-3.083333333333333333333333333333333 9.83333333333333333333333333333333,15.5 -5.25)", "LINESTRING(-35.0 52.5,50.0 60.0)", diff --git a/liblwgeom/lwgeodetic.c b/liblwgeom/lwgeodetic.c index e99fdb506..57ec47770 100644 --- a/liblwgeom/lwgeodetic.c +++ b/liblwgeom/lwgeodetic.c @@ -276,7 +276,7 @@ int edge_point_in_cone(GEOGRAPHIC_EDGE e, GEOGRAPHIC_POINT p) vp_dot_vcp = dot_product(vp, vcp); LWDEBUGF(4,"vp_dot_vcp %.9g",vp_dot_vcp); /* If p is more similar than start then p is inside the cone */ - if ( vp_dot_vcp > vs_dot_vcp ) + if ( vp_dot_vcp >= vs_dot_vcp ) { LWDEBUG(4, "point is in cone"); return LW_TRUE;