/** * gts_triangle_perimeter: * @t: a #GtsTriangle. * * Returns: the perimeter of the triangle @t. */ gdouble gts_triangle_perimeter (GtsTriangle * t) { GtsVertex * v; g_return_val_if_fail (t != NULL, 0.0); v = gts_triangle_vertex (t); return gts_point_distance (GTS_POINT (GTS_SEGMENT (t->e1)->v1), GTS_POINT (GTS_SEGMENT (t->e1)->v2)) + gts_point_distance (GTS_POINT (GTS_SEGMENT (t->e1)->v1), GTS_POINT (v)) + gts_point_distance (GTS_POINT (GTS_SEGMENT (t->e1)->v2), GTS_POINT (v)); }
static void surface_distance_foreach_boundary (GtsEdge * e, gpointer * data) { gdouble * delta = data[1]; GtsRange * range = data[2]; gdouble * total_length = data[3], length; GtsRange range_edge; if (gts_edge_is_boundary (e, NULL)) { GtsSegment * s = GTS_SEGMENT (e); gts_bb_tree_segment_distance (data[0], s, data[4], *delta, &range_edge); if (range_edge.min < range->min) range->min = range_edge.min; if (range_edge.max > range->max) range->max = range_edge.max; range->n += range_edge.n; length = gts_point_distance (GTS_POINT (s->v1), GTS_POINT (s->v2)); *total_length += length; range->sum += length*range_edge.mean; range->sum2 += length*range_edge.mean*range_edge.mean; } }