]> granicus.if.org Git - postgis/commitdiff
lwgeom_scale: recompute bounding box if needed
authorSandro Santilli <strk@keybit.net>
Thu, 11 Jun 2015 19:09:04 +0000 (19:09 +0000)
committerSandro Santilli <strk@keybit.net>
Thu, 11 Jun 2015 19:09:04 +0000 (19:09 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@13653 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/cunit/cu_libgeom.c
liblwgeom/cunit/cu_tester.h
liblwgeom/lwgeom.c

index 9e22f8b7257f9611ca12a3ad34181399b10ed4de..1d8e1fa5e1ee8a23e0bf5d495464ea8ea0991c70 100644 (file)
@@ -970,16 +970,30 @@ static void test_lwgeom_scale(void)
        LWGEOM *geom;
        POINT4D factor;
        char *out_ewkt;
+       GBOX *box;
 
        geom = lwgeom_from_wkt("SRID=4326;GEOMETRYCOLLECTION(POINT(0 1 2 3),POLYGON((-1 -1 0 1,-1 2.5 0 1,2 2 0 1,2 -1 0 1,-1 -1 0 1),(0 0 1 2,0 1 1 2,1 1 1 2,1 0 2 3,0 0 1 2)),LINESTRING(0 0 0 0, 1 2 3 4))", LW_PARSER_CHECK_NONE);
        factor.x = 2; factor.y = 3; factor.z = 4; factor.m = 5;
   lwgeom_scale(geom, &factor);
        out_ewkt = lwgeom_to_ewkt(geom);
   ASSERT_STRING_EQUAL(out_ewkt, "SRID=4326;GEOMETRYCOLLECTION(POINT(0 3 8 15),POLYGON((-2 -3 0 5,-2 7.5 0 5,4 6 0 5,4 -3 0 5,-2 -3 0 5),(0 0 4 10,0 3 4 10,2 3 4 10,2 0 8 15,0 0 4 10)),LINESTRING(0 0 0 0,2 6 12 20))");
-
        lwgeom_free(geom);
        lwfree(out_ewkt);
 
+       geom = lwgeom_from_wkt("POINT(1 1 1 1)", LW_PARSER_CHECK_NONE);
+       lwgeom_add_bbox(geom);
+       factor.x = 2; factor.y = 3; factor.z = 4; factor.m = 5;
+       lwgeom_scale(geom, &factor);
+       box = geom->bbox;
+       ASSERT_DOUBLE_EQUAL(box->xmin, 2);
+       ASSERT_DOUBLE_EQUAL(box->xmax, 2);
+       ASSERT_DOUBLE_EQUAL(box->ymin, 3);
+       ASSERT_DOUBLE_EQUAL(box->ymax, 3);
+       ASSERT_DOUBLE_EQUAL(box->zmin, 4);
+       ASSERT_DOUBLE_EQUAL(box->zmax, 4);
+       ASSERT_DOUBLE_EQUAL(box->mmin, 5);
+       ASSERT_DOUBLE_EQUAL(box->mmax, 5);
+       lwgeom_free(geom);
 }
 
 /*
index b41de40143532362d9f7ce85b17f9b0324749637..918a0d153da9ae204952ac1dcf0b0b06e0836ad2 100644 (file)
@@ -25,8 +25,8 @@ typedef void (*PG_SuiteSetup)(void);
 
 #define ASSERT_DOUBLE_EQUAL(o,e) do { \
   if ( o != e ) \
-    fprintf(stderr, "[%s:%d]\n Expected: %g\n Obtained: %g\n", __FILE__, __LINE__, (e), (o)); \
-  CU_ASSERT_EQUAL(o,e); \
+    fprintf(stderr, "[%s:%d]\n Expected: %g\n Obtained: %g\n", __FILE__, __LINE__, (double)(e), (o)); \
+  CU_ASSERT_EQUAL(o,(double)e); \
 } while (0);
 
 #define ASSERT_INT_EQUAL(o,e) do { \
index c031a4786a97fdcb3bdcff9585df3a2082582080..44ca7798c608fda7dd485a3abb85971752f1bedb 100644 (file)
@@ -1780,6 +1780,20 @@ lwgeom_scale(LWGEOM *geom, const POINT4D *factor)
                        }
                }
        }
+
+  /* Recompute bbox if needed */
+
+  if ( geom->bbox ) {
+    /* TODO: expose a gbox_scale function */
+    geom->bbox->xmin *= factor->x;
+    geom->bbox->xmax *= factor->x;
+    geom->bbox->ymin *= factor->y;
+    geom->bbox->ymax *= factor->y;
+    geom->bbox->zmin *= factor->z;
+    geom->bbox->zmax *= factor->z;
+    geom->bbox->mmin *= factor->m;
+    geom->bbox->mmax *= factor->m;
+  }
 }
 
 LWGEOM*