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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list