]> granicus.if.org Git - postgis/commitdiff
more work on handling 3d polygons with holes
authorRegina Obe <lr@pcorp.us>
Tue, 3 May 2011 13:35:55 +0000 (13:35 +0000)
committerRegina Obe <lr@pcorp.us>
Tue, 3 May 2011 13:35:55 +0000 (13:35 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@7083 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/lwout_x3d.c

index a8b9a46875dbef16df1b15e4fa12fc53fa40cdf7..dd3e685684b91711edfb979dfdd08af15235eeca 100644 (file)
@@ -11,7 +11,6 @@
  * the terms of the GNU General Public Licence. See the COPYING file.\r
  *\r
  **********************************************************************/\r
-\r
 /**\r
 * @file X3D output routines.\r
 *\r
@@ -27,7 +26,6 @@ static char *asx3d3_point(const LWPOINT *point, char *srs, int precision, int op
 static size_t asx3d3_line_size(const LWLINE *line, char *srs, int precision, int opts, const char *defid);\r
 static char *asx3d3_line(const LWLINE *line, char *srs, int precision, int opts, const char *defid);\r
 static size_t asx3d3_poly_size(const LWPOLY *poly, char *srs, int precision, int opts, const char *defid);\r
-static char *asx3d3_poly(const LWPOLY *poly, char *srs, int precision, int opts, int is_patch, const char *defid);\r
 static size_t asx3d3_triangle_size(const LWTRIANGLE *triangle, char *srs, int precision, int opts, const char *defid);\r
 static char *asx3d3_triangle(const LWTRIANGLE *triangle, char *srs, int precision, int opts, const char *defid);\r
 static size_t asx3d3_multi_size(const LWCOLLECTION *col, char *srs, int precision, int opts, const char *defid);\r
@@ -48,7 +46,7 @@ static size_t pointArray_X3Dsize(POINTARRAY *pa, int precision);
 \r
 /* takes a GEOMETRY and returns an X3D representation */\r
 extern char *\r
-lwgeom_to_x3d3(const LWGEOM *geom, char *srs, int precision, int opts, const char *defid)\r
+       lwgeom_to_x3d3(const LWGEOM *geom, char *srs, int precision, int opts, const char *defid)\r
 {\r
        int type = geom->type;\r
 \r
@@ -61,9 +59,9 @@ lwgeom_to_x3d3(const LWGEOM *geom, char *srs, int precision, int opts, const cha
                return asx3d3_line((LWLINE*)geom, srs, precision, opts, defid);\r
 \r
        case POLYGONTYPE:\r
-           /** We might change this later, but putting a polygon in an indexed face set \r
-           * seems like the simplest way to go so treat just like a mulitpolygon \r
-           */\r
+               /** We might change this later, but putting a polygon in an indexed face set\r
+               * seems like the simplest way to go so treat just like a mulitpolygon \r
+               */\r
                return asx3d3_multi((LWCOLLECTION*)lwgeom_as_multi(geom), srs, precision, opts, defid);\r
 \r
        case TRIANGLETYPE:\r
@@ -108,13 +106,13 @@ asx3d3_point_buf(const LWPOINT *point, char *srs, char *output, int precision, i
        //int dimension=2;\r
 \r
        //if (FLAGS_GET_Z(point->flags)) dimension = 3;\r
-/*     if ( srs )\r
-       {\r
-               ptr += sprintf(ptr, "<%sPoint srsName=\"%s\">", defid, srs);\r
-       }\r
-       else*/\r
+       /*      if ( srs )\r
+               {\r
+                       ptr += sprintf(ptr, "<%sPoint srsName=\"%s\">", defid, srs);\r
+               }\r
+               else*/\r
        //ptr += sprintf(ptr, "%s", defid);\r
-       \r
+\r
        //ptr += sprintf(ptr, "<%spos>", defid);\r
        ptr += pointArray_toX3D3(point->point, ptr, precision, opts, 0);\r
        //ptr += sprintf(ptr, "</%spos></%sPoint>", defid, defid);\r
@@ -144,9 +142,9 @@ asx3d3_line_size(const LWLINE *line, char *srs, int precision, int opts, const c
        size = pointArray_X3Dsize(line->points, precision)*2;\r
 \r
        size += (\r
-               sizeof("<LineSet vertexCount=''><Coordinate point='' /></LineSet>")  + defidlen  \r
-       ) * 2;\r
-       \r
+                               sizeof("<LineSet vertexCount=''><Coordinate point='' /></LineSet>")  + defidlen\r
+                       ) * 2;\r
+\r
        //if (srs)     size += strlen(srs) + sizeof(" srsName=..");\r
        return size;\r
 }\r
@@ -178,8 +176,7 @@ static size_t
 asx3d3_line_coords(const LWLINE *line, char *output, int precision, int opts)\r
 {\r
        char *ptr=output;\r
-       \r
-       ptr += sprintf(ptr, "");\r
+       //ptr += sprintf(ptr, "");\r
        ptr += pointArray_toX3D3(line->points, ptr, precision, opts, lwline_is_closed(line));\r
        return (ptr-output);\r
 }\r
@@ -193,7 +190,7 @@ asx3d3_mline_coordindex(const LWMLINE *mgeom, char *output)
        int i, j, k, si;\r
        POINTARRAY *pa;\r
        int np;\r
-       \r
+\r
        ptr += sprintf(ptr, "");\r
        j = 0;\r
        for (i=0; i < mgeom->ngeoms; i++)\r
@@ -202,29 +199,34 @@ asx3d3_mline_coordindex(const LWMLINE *mgeom, char *output)
                pa = geom->points;\r
                np = pa->npoints;\r
                si = j; //start index of first point of linestring\r
-               for(k=0; k < np ; k++){\r
-            if (k) {\r
-                ptr += sprintf(ptr, " ");    \r
-            }\r
-            /** if the linestring is closed, we put the start point index \r
-            *   for the last vertex to denote use first point\r
-            *    and don't increment the index **/\r
-            if (!lwline_is_closed(geom) || k < (np -1) ){\r
-                ptr += sprintf(ptr, "%d", j);\r
-                j += 1;\r
-            }\r
-            else { \r
-                ptr += sprintf(ptr,"%d", si);\r
-            }\r
+               for(k=0; k < np ; k++)\r
+               {\r
+                       if (k)\r
+                       {\r
+                               ptr += sprintf(ptr, " ");\r
+                       }\r
+                       /** if the linestring is closed, we put the start point index\r
+                       *   for the last vertex to denote use first point\r
+                       *    and don't increment the index **/\r
+                       if (!lwline_is_closed(geom) || k < (np -1) )\r
+                       {\r
+                               ptr += sprintf(ptr, "%d", j);\r
+                               j += 1;\r
+                       }\r
+                       else\r
+                       {\r
+                               ptr += sprintf(ptr,"%d", si);\r
+                       }\r
                }\r
-               if (i < (mgeom->ngeoms - 1) ){\r
-                   ptr += sprintf(ptr, " -1 "); //separator for each linestring\r
+               if (i < (mgeom->ngeoms - 1) )\r
+               {\r
+                       ptr += sprintf(ptr, " -1 "); //separator for each linestring\r
                }\r
        }\r
        return (ptr-output);\r
 }\r
 \r
-/* Calculate the coordIndex property of the IndexedLineSet for a multipolygon \r
+/* Calculate the coordIndex property of the IndexedLineSet for a multipolygon\r
     This is not ideal -- would be really nice to just share this function with psurf, \r
     but I'm not smart enough to do that yet*/\r
 static size_t\r
@@ -232,26 +234,32 @@ asx3d3_mpoly_coordindex(const LWMPOLY *psur, char *output)
 {\r
        char *ptr=output;\r
        LWPOLY *patch;\r
-       int i, j, k, si;\r
-       POINTARRAY *pa;\r
+       int i, j, k, l, si;\r
        int np;\r
-       \r
-       ptr += sprintf(ptr, "");\r
        j = 0;\r
        for (i=0; i<psur->ngeoms; i++)\r
        {\r
                patch = (LWPOLY *) psur->geoms[i];\r
-               np = patch->rings[0]->npoints - 1;\r
-           for(k=0; k < np ; k++){\r
-               if (k) {\r
-                   ptr += sprintf(ptr, " ");    \r
-               }\r
-               ptr += sprintf(ptr, "%d", (j + k));\r
-           }\r
-           if (i < (psur->ngeoms - 1) ){\r
-               ptr += sprintf(ptr, " -1 "); //separator for each subgeom\r
-           }\r
-           j += k;\r
+               for (l=0; l < patch->nrings; l++){\r
+                       np = patch->rings[l]->npoints - 1;\r
+                       for(k=0; k < np ; k++)\r
+                       {\r
+                               if (k)\r
+                               {\r
+                                       ptr += sprintf(ptr, " ");\r
+                               }\r
+                               ptr += sprintf(ptr, "%d", (j + k));\r
+                       }\r
+                       j += k;\r
+                       if (l < (patch->nrings - 1) )\r
+                       {\r
+                               ptr += sprintf(ptr, " -1 "); //separator for each inner ring I know its probably wrong - place holder for now\r
+                       }\r
+               }\r
+               if (i < (psur->ngeoms - 1) )\r
+               {\r
+                       ptr += sprintf(ptr, " -1 "); //separator for each subgeom\r
+               }\r
        }\r
        return (ptr-output);\r
 }\r
@@ -293,12 +301,13 @@ asx3d3_poly_buf(const LWPOLY *poly, char *srs, char *output, int precision, int
        char *ptr=output;\r
        int dimension=2;\r
 \r
-       if (FLAGS_GET_Z(poly->flags)) dimension = 3;\r
+       if (FLAGS_GET_Z(poly->flags))\r
+               dimension = 3;\r
        ptr += pointArray_toX3D3(poly->rings[0], ptr, precision, opts, 1);\r
        for (i=1; i<poly->nrings; i++)\r
        {\r
+               ptr += sprintf(ptr, " "); //inner ring points start\r
                ptr += pointArray_toX3D3(poly->rings[i], ptr, precision, opts,1);\r
-               ptr += sprintf(ptr, " ");\r
        }\r
        return (ptr-output);\r
 }\r
@@ -309,8 +318,8 @@ asx3d3_triangle_size(const LWTRIANGLE *triangle, char *srs, int precision, int o
        size_t size;\r
        size_t defidlen = strlen(defid);\r
 \r
-       /** 6 for the 3 sides and space to separate each side **/ \r
-       size = sizeof("<IndexedTriangleSet index=''></IndexedTriangleSet>") + defidlen + 6; \r
+       /** 6 for the 3 sides and space to separate each side **/\r
+       size = sizeof("<IndexedTriangleSet index=''></IndexedTriangleSet>") + defidlen + 6;\r
        size += pointArray_X3Dsize(triangle->points, precision);\r
 \r
        return size;\r
@@ -394,18 +403,21 @@ asx3d3_multi_buf(const LWCOLLECTION *col, char *srs, char *output, int precision
        ptr = output;\r
        x3dtype="";\r
 \r
-                       \r
-       if      (type == MULTIPOINTTYPE) {\r
+\r
+       if      (type == MULTIPOINTTYPE)\r
+       {\r
                x3dtype = "PointSet";\r
                ptr += sprintf(ptr, "<%s %s>", x3dtype, defid);\r
        }\r
-       else if (type == MULTILINETYPE) {\r
+       else if (type == MULTILINETYPE)\r
+       {\r
                x3dtype = "IndexedLineSet";\r
                ptr += sprintf(ptr, "<%s %s coordIndex='", x3dtype, defid);\r
                ptr += asx3d3_mline_coordindex(col, ptr);\r
                ptr += sprintf(ptr, "'>");\r
        }\r
-       else if (type == MULTIPOLYGONTYPE) {\r
+       else if (type == MULTIPOLYGONTYPE)\r
+       {\r
                x3dtype = "IndexedFaceSet";\r
                ptr += sprintf(ptr, "<%s %s coordIndex='", x3dtype, defid);\r
                ptr += asx3d3_mpoly_coordindex(col,ptr);\r
@@ -464,7 +476,7 @@ asx3d3_psurface_size(const LWPSURFACE *psur, char *srs, int precision, int opts,
        size_t defidlen = strlen(defid);\r
 \r
        size = sizeof("<IndexedFaceSet coordIndex=''><Coordinate point='' />") + defidlen;\r
-       \r
+\r
        for (i=0; i<psur->ngeoms; i++)\r
        {\r
                size += asx3d3_poly_size(psur->geoms[i], 0, precision, opts, defid)*5; /** need to make space for coordIndex values too including -1 separating each poly**/\r
@@ -491,32 +503,36 @@ asx3d3_psurface_buf(const LWPSURFACE *psur, char *srs, char *output, int precisi
 \r
        /* Open outmost tag */\r
        ptr += sprintf(ptr, "<IndexedFaceSet %s coordIndex='",defid);\r
-       \r
+\r
        j = 0;\r
        for (i=0; i<psur->ngeoms; i++)\r
        {\r
                patch = (LWPOLY *) psur->geoms[i];\r
                np = patch->rings[0]->npoints - 1;\r
-           for(k=0; k < np ; k++){\r
-               if (k) {\r
-                   ptr += sprintf(ptr, " ");    \r
-               }\r
-               ptr += sprintf(ptr, "%d", (j + k));\r
-           }\r
-           if (i < (psur->ngeoms - 1) ){\r
-               ptr += sprintf(ptr, " -1 "); //separator for each subgeom\r
-           }\r
-           j += k;\r
+               for(k=0; k < np ; k++)\r
+               {\r
+                       if (k)\r
+                       {\r
+                               ptr += sprintf(ptr, " ");\r
+                       }\r
+                       ptr += sprintf(ptr, "%d", (j + k));\r
+               }\r
+               if (i < (psur->ngeoms - 1) )\r
+               {\r
+                       ptr += sprintf(ptr, " -1 "); //separator for each subgeom\r
+               }\r
+               j += k;\r
        }\r
-       \r
+\r
        ptr += sprintf(ptr, "'><Coordinate point='");\r
 \r
        for (i=0; i<psur->ngeoms; i++)\r
        {\r
                ptr += asx3d3_poly_buf(psur->geoms[i], 0, ptr, precision, opts, 1, defid);\r
-               if (i < (psur->ngeoms - 1) ){\r
-               ptr += sprintf(ptr, " "); //only add a trailing space if its not the last polygon in the set\r
-           }\r
+               if (i < (psur->ngeoms - 1) )\r
+               {\r
+                       ptr += sprintf(ptr, " "); //only add a trailing space if its not the last polygon in the set\r
+               }\r
        }\r
 \r
        /* Close outmost tag */\r
@@ -549,7 +565,7 @@ asx3d3_tin_size(const LWTIN *tin, char *srs, int precision, int opts, const char
        size_t defidlen = strlen(defid);\r
        //int dimension=2;\r
 \r
-       /** Need to make space for size of additional attributes, \r
+       /** Need to make space for size of additional attributes,\r
        ** the coordIndex has a value for each edge for each triangle plus a space to separate so we need at least that much extra room ***/\r
        size = sizeof("<IndexedTriangleSet coordIndex=''></IndexedTriangleSet>") + defidlen + tin->ngeoms*12;\r
 \r
@@ -581,26 +597,28 @@ asx3d3_tin_buf(const LWTIN *tin, char *srs, char *output, int precision, int opt
        for (i=0; i<tin->ngeoms; i++)\r
        {\r
                ptr += sprintf(ptr, "%d %d %d", k, (k+1), (k+2));\r
-               if (i < (tin->ngeoms - 1) ){\r
-                   ptr += sprintf(ptr, " ");\r
+               if (i < (tin->ngeoms - 1) )\r
+               {\r
+                       ptr += sprintf(ptr, " ");\r
                }\r
                k += 3;\r
        }\r
-       \r
+\r
        ptr += sprintf(ptr, "'><Coordinate point='");\r
        for (i=0; i<tin->ngeoms; i++)\r
        {\r
                ptr += asx3d3_triangle_buf(tin->geoms[i], 0, ptr, precision,\r
-                                          opts, defid);\r
-               if (i < (tin->ngeoms - 1) ){\r
-                   ptr += sprintf(ptr, " ");\r
+                                                                  opts, defid);\r
+               if (i < (tin->ngeoms - 1) )\r
+               {\r
+                       ptr += sprintf(ptr, " ");\r
                }\r
        }\r
 \r
        /* Close outmost tag */\r
 \r
        ptr += sprintf(ptr, "'/></IndexedTriangleSet>");\r
-       \r
+\r
        return (ptr-output);\r
 }\r
 \r
@@ -629,7 +647,8 @@ asx3d3_collection_size(const LWCOLLECTION *col, char *srs, int precision, int op
 \r
        size = sizeof("<MultiGeometry></MultiGeometry>") + defidlen*2;\r
 \r
-       if ( srs ) size += strlen(srs) + sizeof(" srsName=..");\r
+       if ( srs )\r
+               size += strlen(srs) + sizeof(" srsName=..");\r
 \r
        for (i=0; i<col->ngeoms; i++)\r
        {\r
@@ -700,9 +719,9 @@ asx3d3_collection_buf(const LWCOLLECTION *col, char *srs, char *output, int prec
                        else\r
                                ptr += asx3d3_multi_buf((LWCOLLECTION*)subgeom, 0, ptr, precision, opts, defid);\r
                }\r
-               else \r
+               else\r
                        lwerror("asx3d3_collection_buf: unknown geometry type");\r
-                       \r
+\r
                ptr += sprintf(ptr, "</%sgeometryMember>", defid);\r
        }\r
 \r
@@ -746,23 +765,25 @@ pointArray_toX3D3(POINTARRAY *pa, char *output, int precision, int opts, int is_
                for (i=0; i<pa->npoints; i++)\r
                {\r
                        /** Only output the point if it is not the last point of a closed object or it is a non-closed type **/\r
-                       if ( !is_closed || i < (pa->npoints - 1) ){\r
+                       if ( !is_closed || i < (pa->npoints - 1) )\r
+                       {\r
                                POINT2D pt;\r
                                getPoint2d_p(pa, i, &pt);\r
-       \r
+\r
                                if (fabs(pt.x) < OUT_MAX_DOUBLE)\r
                                        sprintf(x, "%.*f", precision, pt.x);\r
                                else\r
                                        sprintf(x, "%g", pt.x);\r
                                trim_trailing_zeros(x);\r
-       \r
+\r
                                if (fabs(pt.y) < OUT_MAX_DOUBLE)\r
                                        sprintf(y, "%.*f", precision, pt.y);\r
                                else\r
                                        sprintf(y, "%g", pt.y);\r
                                trim_trailing_zeros(y);\r
-       \r
-                               if ( i ) ptr += sprintf(ptr, " ");\r
+\r
+                               if ( i )\r
+                                       ptr += sprintf(ptr, " ");\r
                                ptr += sprintf(ptr, "%s %s", x, y);\r
                        }\r
                }\r
@@ -772,30 +793,32 @@ pointArray_toX3D3(POINTARRAY *pa, char *output, int precision, int opts, int is_
                for (i=0; i<pa->npoints; i++)\r
                {\r
                        /** Only output the point if it is not the last point of a closed object or it is a non-closed type **/\r
-                       if ( !is_closed || i < (pa->npoints - 1) ){\r
+                       if ( !is_closed || i < (pa->npoints - 1) )\r
+                       {\r
                                POINT4D pt;\r
                                getPoint4d_p(pa, i, &pt);\r
-       \r
+\r
                                if (fabs(pt.x) < OUT_MAX_DOUBLE)\r
                                        sprintf(x, "%.*f", precision, pt.x);\r
                                else\r
                                        sprintf(x, "%g", pt.x);\r
                                trim_trailing_zeros(x);\r
-       \r
+\r
                                if (fabs(pt.y) < OUT_MAX_DOUBLE)\r
                                        sprintf(y, "%.*f", precision, pt.y);\r
                                else\r
                                        sprintf(y, "%g", pt.y);\r
                                trim_trailing_zeros(y);\r
-       \r
+\r
                                if (fabs(pt.z) < OUT_MAX_DOUBLE)\r
                                        sprintf(z, "%.*f", precision, pt.z);\r
                                else\r
                                        sprintf(z, "%g", pt.z);\r
                                trim_trailing_zeros(z);\r
-       \r
-                               if ( i ) ptr += sprintf(ptr, " ");\r
-                               \r
+\r
+                               if ( i )\r
+                                       ptr += sprintf(ptr, " ");\r
+\r
                                ptr += sprintf(ptr, "%s %s %s", x, y, z);\r
                        }\r
                }\r
@@ -814,7 +837,7 @@ pointArray_X3Dsize(POINTARRAY *pa, int precision)
 {\r
        if (FLAGS_NDIMS(pa->flags) == 2)\r
                return (OUT_MAX_DIGS_DOUBLE + precision + sizeof(" "))\r
-                      * 2 * pa->npoints;\r
+                          * 2 * pa->npoints;\r
 \r
        return (OUT_MAX_DIGS_DOUBLE + precision + sizeof(" ")) * 3 * pa->npoints;\r
 }
\ No newline at end of file