Changeset: 436ef21e1da3 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=436ef21e1da3 Modified Files: geom/monetdb5/geom_x3d.c Branch: sfcgal Log Message:
Do not use the name patch. Be aware of the rings in a Polygon. Use the right type when counting the number of points in a RingString. Make sure Z exists before getting it. diffs (128 lines): diff --git a/geom/monetdb5/geom_x3d.c b/geom/monetdb5/geom_x3d.c --- a/geom/monetdb5/geom_x3d.c +++ b/geom/monetdb5/geom_x3d.c @@ -47,7 +47,7 @@ geom_to_x3d_3(GEOSGeom geom, int precisi geoms[0] = geom; tmp = GEOSGeom_createCollection(GEOS_MULTIPOLYGON, geoms, 1); ret = x3d_3_multi(tmp, precision, opts, defid); - GEOSGeom_destroy(tmp); + //GEOSGeom_destroy(tmp); return ret; } @@ -66,7 +66,8 @@ geom_to_x3d_3(GEOSGeom geom, int precisi return x3d_3_tin(geom, precision, opts, defid); case wkbGeometryCollection_mdb: - return x3d_3_collection(geom, precision, opts, defid); + return x3d_3_psurface(geom, precision, opts, defid); + //return x3d_3_collection(geom, precision, opts, defid); default: assert(0); @@ -196,22 +197,27 @@ static size_t x3d_3_mpoly_coordindex(GEOSGeom psur, char *output) { char *ptr=output; - GEOSGeom patch; + GEOSGeom geom; int i, j, l; int ngeoms = GEOSGetNumGeometries(psur); j = 0; for (i=0; i<ngeoms; i++) { int nrings; - patch = (GEOSGeom ) GEOSGetGeometryN(psur, i); - nrings = GEOSGetNumInteriorRings(patch); + geom = (GEOSGeom ) GEOSGetGeometryN(psur, i); + nrings = GEOSGetNumInteriorRings(geom) + 1; for (l=0; l < nrings; l++) { - GEOSGeom ring = *(GEOSGeom*)GEOSGetInteriorRingN(patch, l); uint32_t k, npoints = 0; + const GEOSGeometry* ring; + if (!l) + ring = GEOSGetExteriorRing(geom); + else + ring = GEOSGetInteriorRingN(geom, l-1); + numPointsGeometry(&npoints, ring); - for (k=0; k < npoints ; k++) + for (k=0; k < npoints-1 ; k++) { if (k) { @@ -250,12 +256,13 @@ x3d_3_poly_size(GEOSGeom poly, int prec { size_t size; size_t defidlen = strlen(defid); - int i, nrings = GEOSGetNumInteriorRings(poly); + int i, nrings = GEOSGetNumInteriorRings(poly)+1; size = ( sizeof("<IndexedFaceSet></IndexedFaceSet>") + (defidlen*3) ) * 2 + 6 * (nrings - 1); - for (i=0; i<nrings; i++) - size += geom_X3Dsize(*(GEOSGeom*)GEOSGetInteriorRingN(poly, i), precision); + size += geom_X3Dsize((GEOSGeom)GEOSGetExteriorRing(poly), precision); + for (i=0; i<nrings-1; i++) + size += geom_X3Dsize((GEOSGeom)GEOSGetInteriorRingN(poly, i), precision); return size; } @@ -263,13 +270,13 @@ x3d_3_poly_size(GEOSGeom poly, int prec static size_t x3d_3_poly_buf(GEOSGeom poly, char *output, int precision, int opts) { - int i, nrings = GEOSGetNumInteriorRings(poly); + int i, nIntRings = GEOSGetNumInteriorRings(poly); char *ptr=output; const GEOSGeometry* exteriorRing; exteriorRing = GEOSGetExteriorRing(poly); ptr += geom_toX3D3((GEOSGeom) exteriorRing, ptr, precision, opts, 1); - for (i=0; i<nrings; i++) + for (i=0; i<nIntRings; i++) { ptr += sprintf(ptr, " "); ptr += geom_toX3D3(*(GEOSGeom*)GEOSGetInteriorRingN(poly, i), ptr, precision, opts,1); @@ -464,7 +471,7 @@ x3d_3_psurface_buf(GEOSGeom psur, char * char *ptr; int i, ngeoms = GEOSGetNumGeometries(psur); int j; - GEOSGeom patch; + GEOSGeom geom; ptr = output; ptr += sprintf(ptr, "<IndexedFaceSet convex='false' %s coordIndex='",defid); @@ -472,12 +479,12 @@ x3d_3_psurface_buf(GEOSGeom psur, char * for (i=0; i<ngeoms; i++) { uint32_t k, npoints = 0; - GEOSGeom ring; - patch = (GEOSGeom ) GEOSGetGeometryN(psur, i); - ring =*(GEOSGeom*)GEOSGetInteriorRingN(patch, 0); + const GEOSGeometry* ring; + geom = (GEOSGeom ) GEOSGetGeometryN(psur, i); + ring = GEOSGetExteriorRing(geom); numPointsGeometry(&npoints, ring); - for (k=0; k < npoints ; k++) + for (k=0; k < npoints-1 ; k++) { if (k) { @@ -745,10 +752,11 @@ geom_toX3D3(GEOSGeom geom, char *output, if ( !is_closed || i < (npoints - 1) ) { GEOSGeom point = (GEOSGeom) GEOSGeomGetPointN(geom, i); - double pt_x, pt_y, pt_z; + double pt_x, pt_y, pt_z = 0.0; GEOSGeomGetX(point, &pt_x); GEOSGeomGetY(point, &pt_y); - GEOSGeomGetZ(point, &pt_z); + if (GEOSHasZ(point) != 1) + GEOSGeomGetZ(point, &pt_z); if (fabs(pt_x) < OUT_MAX_DOUBLE) sprintf(x, "%.*f", precision, pt_x); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list