1
0
Fork 0

Added a test program for the triangulator.

This commit is contained in:
curt 2000-11-20 16:56:03 +00:00
parent 71ec8159a5
commit e189a03b47
2 changed files with 193 additions and 0 deletions

View file

@ -24,3 +24,8 @@ showme_SOURCES = showme.c
showme_LDADD = -lX11
endif
noinst_PROGRAMS = test_triangle
test_triangle_SOURCES = test_triangle.c
test_triangle_LDADD = libTriangleJRS.a

View file

@ -0,0 +1,188 @@
/* a test of the Shewchuk triangulator (lib form) */
#include <stdio.h>
#include <stdlib.h>
#define REAL double
#include "triangle.h"
#include "tri_support.h"
int main( int argc, char **argv ) {
struct triangulateio in, out, vorout;
char basename[256], nodefile[256], polyfile[256];
FILE *fp;
int count, dim, attr, bndmrkrs, end1, end2, boundmark;
int i, counter;
double x, y, z;
char tri_options[256];
int n1, n2, n3;
/* make sure all elements of these structs point to "NULL" */
zero_triangulateio( &in );
zero_triangulateio( &out );
zero_triangulateio( &vorout );
/* get base name */
if ( argc == 2 ) {
strcpy( basename, argv[1] );
} else {
printf( "usage: %s base_name\n", argv[0] );
return -1;
}
/*
* generate file names
*/
sprintf( nodefile, "%s.node", basename );
sprintf( polyfile, "%s.poly", basename );
/*
* load node file
*/
if ( (fp = fopen( nodefile, "r" )) == NULL ) {
printf( "cannot locate file: %s\n", nodefile );
return -1;
}
/* read in points */
fscanf( fp, "%d %d %d %d\n", &count, &dim, &attr, &bndmrkrs );
printf( "loading %d points\n", count );
in.numberofpoints = count;
in.numberofpointattributes = 1;
in.pointlist = (REAL *) malloc(in.numberofpoints * 2 * sizeof(REAL));
in.pointattributelist = (REAL *) malloc(in.numberofpoints *
in.numberofpointattributes *
sizeof(REAL));
in.pointmarkerlist = NULL;
for ( i = 0; i < count; ++i ) {
fscanf( fp, "%d %lf %lf %lf\n", &counter, &x, &y, &z );
printf( " read = %d %.2f %.2f %.2f\n", counter, x, y, z );
in.pointlist[2*counter] = x;
in.pointlist[2*counter + 1] = y;
in.pointattributelist[counter] = z;
}
fclose( fp );
/*
* load poly file
*/
if ( (fp = fopen( polyfile, "r" )) == NULL ) {
printf( "cannot locate file: %s\n", polyfile );
return -1;
}
/* first line is ignored, points are specified in .node file */
fscanf( fp, "%d %d %d %d\n", &count, &dim, &attr, &bndmrkrs );
/* read in segments */
fscanf( fp, "%d %d\n", &count, &bndmrkrs );
printf( "loading %d segments\n", count );
in.numberofsegments = count;
in.segmentlist = (int *) malloc(in.numberofsegments * 2 * sizeof(int));
in.segmentmarkerlist = (int *) malloc(in.numberofsegments * sizeof(int));
for ( i = 0; i < count; ++i ) {
fscanf( fp, "%d %d %d %d\n", &counter, &end1, &end2, &boundmark );
printf( " read = %d %d %d %d\n", counter, end1, end2, boundmark );
in.segmentlist[2*counter] = end1;
in.segmentlist[2*counter + 1] = end2;
in.segmentmarkerlist[counter] = boundmark;
}
/* read in holes */
fscanf( fp, "%d\n", &count );
printf( "loading %d holes\n", count );
in.numberofholes = count;
in.holelist = (REAL *) malloc(in.numberofholes * 2 * sizeof(REAL));
for ( i = 0; i < count; ++i ) {
fscanf( fp, "%d %lf %lf %lf\n", &counter, &x, &y, &z );
printf( " read = %d %.2f %.2f %.2f\n", counter, x, y, z );
in.holelist[2*counter] = x;
in.holelist[2*counter + 1] = y;
}
/* read in regions */
/* number of regions is always zero for this example */
fscanf( fp, "%d\n", &count );
in.numberofregions = 0;
in.regionlist = NULL;
fclose( fp );
/* no triangle list */
in.numberoftriangles = 0;
in.numberofcorners = 0;
in.numberoftriangleattributes = 0;
in.trianglelist = NULL;
in.triangleattributelist = NULL;
in.trianglearealist = NULL;
in.neighborlist = NULL;
/* no edge list */
in.numberofedges = 0;
in.edgelist = NULL;
in.edgemarkerlist = NULL;
in.normlist = NULL;
/* dump the results */
print_tri_data( &in );
/* Triangulate the points. Switches are chosen to read and write
* a PSLG (p), number everything from zero (z), and produce an
* edge list (e), and a triangle neighbor list (n). no new points
* on boundary (Y), no internal segment splitting (YY), no quality
* refinement (q) and Quite (Q)
*/
strcpy( tri_options, "VVVpzYYenQ" );
printf( "Triangulation with options = %s\n", tri_options );
triangulate( tri_options, &in, &out, &vorout );
zero_triangulateio( &out );
zero_triangulateio( &vorout );
triangulate( tri_options, &in, &out, &vorout );
/* print resulting triangles */
for ( i = 0; i < out.numberoftriangles; ++i ) {
n1 = out.trianglelist[i * 3];
n2 = out.trianglelist[i * 3 + 1];
n3 = out.trianglelist[i * 3 + 2];
if ( out.numberoftriangleattributes > 0 ) {
z = out.triangleattributelist[i];
} else {
z = 0.0;
}
printf( "triangle %d = %d %d %d (%.2f)\n", i, n1, n2, n3, z );
}
/* free mem allocated Floating point roundoff is of magnitude 1.1102230246251565e-16
to the "Triangle" structures */
free(in.pointlist);
free(in.pointattributelist);
free(in.pointmarkerlist);
free(in.regionlist);
free(out.pointlist);
free(out.pointattributelist);
free(out.pointmarkerlist);
free(out.trianglelist);
free(out.triangleattributelist);
/* free(out.trianglearealist); */
free(out.neighborlist);
free(out.segmentlist);
free(out.segmentmarkerlist);
free(out.edgelist);
free(out.edgemarkerlist);
free(vorout.pointlist);
free(vorout.pointattributelist);
free(vorout.edgelist);
free(vorout.normlist);
return 0;
}