Esempio n. 1
0
/*
 *  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;
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
/*
 * 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;
}