/* * Compute 2D/3D perimeter of a TGEOM */ double tgeom_perimeter(TGEOM* tgeom) { int i; double hz, vt, ht, bdy = 0.0; assert(tgeom); if (tgeom->type != POLYHEDRALSURFACETYPE && tgeom->type != TINTYPE) lwerror("tgeom_perimeter called with wrong type: %i - %s", tgeom->type, lwtype_name(tgeom->type)); /* Solid have a 0.0 length perimeter */ if (FLAGS_GET_SOLID(tgeom->flags)) return bdy; /* If no Z use 2d function instead */ if (!FLAGS_GET_Z(tgeom->flags)) return tgeom_perimeter2d(tgeom); for (i=1 ; i <= tgeom->nedges ; i++) { if (tgeom->edges[i]->count == 1) { hz = tgeom->edges[i]->s->x - tgeom->edges[i]->e->x; vt = tgeom->edges[i]->s->y - tgeom->edges[i]->e->y; ht = tgeom->edges[i]->s->z - tgeom->edges[i]->e->z; bdy += sqrt(hz*hz + vt*vt + ht*ht); } } return bdy; }
Datum sfcgal_is_solid(PG_FUNCTION_ARGS) { int result; GSERIALIZED *input = PG_GETARG_GSERIALIZED_P(0); LWGEOM *lwgeom = lwgeom_from_gserialized(input); PG_FREE_IF_COPY(input, 0); if (! lwgeom) { lwerror("sfcgal_is_solid: Unable to deserialize input"); } result = FLAGS_GET_SOLID( lwgeom->flags ); lwgeom_free(lwgeom); PG_RETURN_BOOL(result); }
/* * Indicate if an given LWGEOM is or not a solid */ int lwgeom_is_solid(LWGEOM *lwgeom) { int solid=0; TGEOM *tgeom; assert(lwgeom); /* Obvious case who could'nt be solid */ if (lwgeom->type != POLYHEDRALSURFACETYPE && lwgeom->type != TINTYPE) return 0; if (!FLAGS_GET_Z(lwgeom->flags)) return 0; /* Use TGEOM convert to know */ tgeom = tgeom_from_lwgeom(lwgeom); solid = FLAGS_GET_SOLID(tgeom->flags); tgeom_free(tgeom); return solid; }