#include "gts.h"
static GtsVertex * edge_collapse (GtsSurface * s,
GtsEdge * e,
GtsCoarsenFunc coarsen_func,
gpointer coarsen_data)
{
GtsVertex * v1 = GTS_SEGMENT (e)->v1, * v2 = GTS_SEGMENT (e)->v2, * mid;
GtsSplit * vs;
GtsObject * o1, * o2;
/* if the edge is degenerate (i.e. v1 == v2), destroy and return */
if (v1 == v2) {
gts_object_destroy (GTS_OBJECT (e));
return NULL;
}
mid = (*coarsen_func) (e, s->vertex_class, coarsen_data);
o1 = GTS_OBJECT (v1);
o2 = GTS_OBJECT (v2);
vs = gts_split_new (gts_split_class (), mid, o1, o2);
gts_split_collapse (vs, s->edge_class, NULL);
return mid;
}
int main (int argc, char * argv[])
{
GtsSurface * surface = gts_surface_new (gts_surface_class (),
gts_face_class (),
gts_edge_class (),
gts_vertex_class ());
GtsVertex * v1 = gts_vertex_new (gts_vertex_class (),
11640, 15867.5, 1080);
GtsVertex * v2 = gts_vertex_new (gts_vertex_class (),
11700, 15720, 1070);
GtsVertex * v3 = gts_vertex_new (gts_vertex_class (),
11616, 15728.8, 1084);
GtsVertex * v4 = gts_vertex_new (gts_vertex_class (),
11580, 15840, 1090);
GtsVertex * v5 = gts_vertex_new (gts_vertex_class (),
11460, 15840, 1100);
GtsVertex * v6 = gts_vertex_new (gts_vertex_class (),
11520, 15840, 1100);
GtsVertex * v7 = gts_vertex_new (gts_vertex_class (),
11520, 15780, 1100);
GtsVertex * v8 = gts_vertex_new (gts_vertex_class (),
11700, 15660, 1070);
GtsVertex * v9 = gts_vertex_new (gts_vertex_class (),
11672.4, 15600.1, 1074.6);
GtsVertex * v10 = gts_vertex_new (gts_vertex_class (),
11520, 15751.7, 1100);
GtsVertex * v11 = gts_vertex_new (gts_vertex_class (),
11569.5, 15646.1, 1091.75);
GtsVertex * v;
GtsEdge * e1 = gts_edge_new (gts_edge_class (), v1, v2);
GtsEdge * e2 = gts_edge_new (gts_edge_class (), v1, v3);
GtsEdge * e3 = gts_edge_new (gts_edge_class (), v3, v2);
GtsEdge * e4 = gts_edge_new (gts_edge_class (), v4, v1);
GtsEdge * e5 = gts_edge_new (gts_edge_class (), v3, v4);
GtsEdge * e6 = gts_edge_new (gts_edge_class (), v5, v6);
GtsEdge * e7 = gts_edge_new (gts_edge_class (), v5, v7);
GtsEdge * e8 = gts_edge_new (gts_edge_class (), v6, v7);
GtsEdge * e9 = gts_edge_new (gts_edge_class (), v8, v2);
GtsEdge * e10 = gts_edge_new (gts_edge_class (), v8, v3);
GtsEdge * e11 = gts_edge_new (gts_edge_class (), v6, v4);
GtsEdge * e12 = gts_edge_new (gts_edge_class (), v6, v3);
GtsEdge * e13 = gts_edge_new (gts_edge_class (), v8, v9);
GtsEdge * e14 = gts_edge_new (gts_edge_class (), v3, v9);
GtsEdge * e15 = gts_edge_new (gts_edge_class (), v7, v10);
GtsEdge * e16 = gts_edge_new (gts_edge_class (), v10, v5);
GtsEdge * e17 = gts_edge_new (gts_edge_class (), v11, v3);
GtsEdge * e18 = gts_edge_new (gts_edge_class (), v9, v11);
GtsEdge * e19 = gts_edge_new (gts_edge_class (), v10, v11);
GtsEdge * e20 = gts_edge_new (gts_edge_class (), v11, v7);
GtsEdge * e21 = gts_edge_new (gts_edge_class (), v7, v3);
GtsFace * f1 = gts_face_new (gts_face_class (),
e1, e2, e3);
GtsFace * f2 = gts_face_new (gts_face_class (),
e4, e5, e2);
GtsFace * f3 = gts_face_new (gts_face_class (),
e6, e7, e8);
GtsFace * f4 = gts_face_new (gts_face_class (),
e9, e3, e10);
GtsFace * f5 = gts_face_new (gts_face_class (),
e11, e12, e5);
GtsFace * f6 = gts_face_new (gts_face_class (),
e13, e10, e14);
GtsFace * f7 = gts_face_new (gts_face_class (),
e15, e7, e16);
GtsFace * f8 = gts_face_new (gts_face_class (),
e17, e18, e14);
GtsFace * f9 = gts_face_new (gts_face_class (),
e19, e20, e15);
GtsFace * f10 = gts_face_new (gts_face_class (),
e21, e12, e8);
GtsFace * f11 = gts_face_new (gts_face_class (),
e21, e20, e17);
GtsVolumeOptimizedParams params = { 0.5, 0.5, 0. };
gts_surface_add_face (surface, f1);
gts_surface_add_face (surface, f2);
gts_surface_add_face (surface, f3);
gts_surface_add_face (surface, f4);
gts_surface_add_face (surface, f5);
gts_surface_add_face (surface, f6);
gts_surface_add_face (surface, f7);
gts_surface_add_face (surface, f8);
gts_surface_add_face (surface, f9);
gts_surface_add_face (surface, f10);
gts_surface_add_face (surface, f11);
gts_surface_print_stats (surface, stderr);
fprintf (stderr, "volume: %g\n", gts_surface_volume (surface));
#if 0
v = edge_collapse (surface, e21,
(GtsCoarsenFunc) gts_volume_optimized_vertex,
¶ms);
#else
v = gts_volume_optimized_vertex (e21, gts_vertex_class (), ¶ms);
fprintf (stderr, "v: %.10g %.10g %.10g\n",
GTS_POINT (v)->x, GTS_POINT (v)->y, GTS_POINT (v)->z);
fprintf (stderr, "before: check for folds...\n");
gts_edge_collapse_creates_fold (e21, v, 0.999695413509);
v = edge_collapse (surface, e21,
(GtsCoarsenFunc) gts_volume_optimized_vertex,
¶ms);
fprintf (stderr, "after: check for folds...\n");
{
GSList * i = v->segments;
while (i) {
GtsEdge * e = i->data;
gts_triangles_are_folded (e->triangles,
GTS_SEGMENT (e)->v1,
GTS_SEGMENT (e)->v2,
0.999695413509);
i = i->next;
}
}
#endif
gts_surface_print_stats (surface, stderr);
fprintf (stderr, "volume: %g\n", gts_surface_volume (surface));
gts_surface_write (surface, stdout);
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1