TRIANGULATION_MASK
Remove Triangles from a Triangulation
TRIANGULATION_MASK is a C++ program,
using double precision arithmetic,
which reads the nodes and triangles that define a triangulation,
calls a user routine which determines whether each triangle is to
be preserved or discarded ("masked") from the triangulation,
and writes out new node and triangle files that define the
masked triangulation.
The input file nodes.txt contains the node information
for the triangulation. Each data line contains the X and
Y coordinates of a single node.
The input file triangles.txt contains the triangle information
for the triangulation. Each line contains the indices of 3 or 6
nodes that form a triangle.
One motivation for creating this program is as follows. Suppose
we have a set of points that lie on the boundary or inside of
a non-convex region. If we naively call an unconstrained Delaunay
triangulation routine, such as TABLE_DELAUNAY, then because
the region is not convex, it is possible to create triangles which
lie outside the region.
An easy way to correct this problem is to call a user routine
and pass it the indices and coordinates of each triangle. The
user can then decide to drop any triangle whose centroid, say,
lies outside the region.
Other masking criteria might drop triangles that are too small,
or that have too small an angle, or that lie inside some interior
hole. These choices are entirely up to the user.
The user masking subroutine has the form:
bool triangle_mask ( int dim_num, int triangle_order, int nodes[],
double coord[] )
with arguments:
-
dim_num
-
input, the spatial dimension, always equal to 2.
-
triangle_order
-
input, the number of nodes in the triangle, usually 3
or 6;
-
nodes
-
input, an integer array of dimension triangle_order,
containing the indices of each node of the triangle;
-
coord
-
input, a double array of dimension dim_num
by triangle_order, containing the x and y
coordinates of each node of the triangle;
-
triangle_mask
-
output, a boolean value, which is true if the
triangle should be deleted or "masked", and false if
the triangle should be preserved;
Usage:
-
g++ triangulation_mask.o triangle_mask.C
-
compiles the user routine triangle_mask.C and links
it with the partially compiled triangulation_mask.o
to create an executable a.out. We will assume that
a.out is renamed to triangulation_mask.
-
triangulation_mask node_file triangle_file
-
reads the triangulation described by the node file and the
triangle file, calls the user mask
routine for each triangle, and writes out the new node and
triangle files.
Related Data and Programs:
TABLE
is the format used for the input and output files.
TABLE_DELAUNAY
is an executable C++ program which can compute the
Delaunay triangulation of a set of points.
TRIANGLE
is an executable C program which computes a triangulation
of a geometric region.
TRIANGULATION
is a C++ library of routines for carrying
out various operations on order 3 ("linear") or order 6
("quadratic") triangulations.
TRIANGULATION_BOUNDARY_NODES
is an executable C++ program
that reads data defining a triangulation, determines which nodes
lie on the boundary, and writes their coordinates to a file.
TRIANGULATION_DISPLAY_OPEN_GL
is an executable C++ program
which reads files defining a triangulation and displays an image
using Open GL.
TRIANGULATION_L2Q
is an executable C++ program
that reads data defining a 3-node triangulation and generates
midside nodes and writes out the corresponding 6-node triangulation.
TRIANGULATION_MASK is also available in
a FORTRAN90 version and
a MATLAB version.
TRIANGULATION_ORDER3
is a directory which contains a description and
examples of order 3 triangulations.
TRIANGULATION_ORDER6
is a directory which contains a description and
examples of order 6 triangulations.
TRIANGULATION_ORIENT
is an executable C++ program
that reads data defining a triangulation, makes sure that
every triangle has positive orientation, and if not, writes a
corrected triangle file.
TRIANGULATION_PLOT
is an executable C++program
that reads data defining a triangulation and creates a
PostScript image of the nodes and triangles.
TRIANGULATION_Q2L
is an executable C++ program
that reads data defining a 6-node triangulation, and subdivides
each triangle into 4 3-node triangles, writing the resulting
triangulation to a file.
TRIANGULATION_QUALITY
is an executable C++ program
that reads data defining a triangulation and computes a number
of quality measures.
TRIANGULATION_RCM
is an executable C++ program
that reads data defining a triangulation, determines an ordering
of the nodes that will reduce the bandwidth of the adjacency
matrix, and writes the new triangulation information to a file.
TRIANGULATION_REFINE
is an executable C++ program
that reads data defining a triangulation, replaces each triangle
by four congruent smaller ones, and writes the new triangulation
information to a file.
TRIANGULATION_TRIANGLE_NEIGHBORS
is an executable C++ program
that reads data defining a triangulation, determines the neighboring
triangles of each triangle, and writes that information to a file.
Reference:
-
Franz Aurenhammer,
Voronoi diagrams -
a study of a fundamental geometric data structure,
ACM Computing Surveys,
Volume 23, Number 3, September 1991, pages 345-405,
../../pdf/aurenhammer.pdf
-
Marc deBerg, Marc Krevald, Mark Overmars,
Otfried Schwarzkopf,
Computational Geometry,
Springer, 2000,
ISBN: 3-540-65620-0.
-
Barry Joe,
GEOMPACK - a software package for the generation of meshes
using geometric algorithms,
Advances in Engineering Software,
Volume 13, 1991, pages 325-331.
-
Albert Nijenhuis, Herbert Wilf,
Combinatorial Algorithms for Computers and Calculators,
Second Edition,
Academic Press, 1978,
ISBN: 0-12-519260-6,
LC: QA164.N54.
-
Atsuyuki Okabe, Barry Boots, Kokichi Sugihara, Sung Nok Chiu,
Spatial Tesselations:
Concepts and Applications of Voronoi Diagrams,
Second Edition,
Wiley, 2000,
ISBN: 0-471-98635-6,
LC: QA278.2.O36.
-
Joseph ORourke,
Computational Geometry,
Second Edition,
Cambridge, 1998,
ISBN: 0521649765,
LC: QA448.D38.
Source Code:
Examples and Tests:
SMALL is a triangulation of the 25 lattice points on
the [0,4]x[0,4] square. Our masking operation should cut out
a lower left triangular corner and a section from the upper right.
-
small_nodes.txt,
a set of nodes.
-
small_nodes.png,
a PNG image of the nodes.
-
small_triangles.txt,
a set of order 3 triangles.
-
small_triangles.png,
a PNG image of the
original data.
-
small_mask.C,
a routine which masks the triangles by dropping those whose
centroids lie outside the region.
-
small_mask.csh,
commands which compile the user routine with
TRIANGULATION_MASK, and analyze the triangulation.
-
small_mask.out,
the output from a run of the program.
-
small_nodes.mask.txt,
the set of nodes after TRIANGULATION_MASK
has masked the triangles.
-
small_nodes.mask.png,
a PNG image of the
remaining nodes.
-
small_triangles.mask.txt,
the set of triangles after TRIANGULATION_MASK
has masked the triangles.
-
small_triangles.mask.png,
a PNG image of the
remaining triangles.
P15 is a triangulation created by calling
DISTMESH,
then removing duplicate points by calling
TABLE_MERGE,
then creating a Delaunay triangulation by calling
TABLE_DELAUNAY,
Unfortunately, this results in many triangles that lie outside
the region of interest.
-
p15_nodes.txt,
a set of nodes.
-
p15_nodes.png,
a PNG image of the nodes.
-
p15_triangles.txt,
a set of order 3 triangles.
-
p15_triangles.png,
a PNG image of the
original data.
-
p15_mask.C,
a routine which masks the triangles by dropping those whose
centroids lie outside the region.
-
p15_mask.csh,
commands which compile the user routine with
TRIANGULATION_MASK, and analyze the triangulation.
-
p15_mask.out,
the output from a run of the program.
-
p15_nodes.mask.txt,
the set of nodes after TRIANGULATION_MASK
has masked the triangles.
-
p15_triangles.mask.txt,
the set of triangles after TRIANGULATION_MASK
has masked the triangles.
-
p15_triangles.mask.png,
a PNG image of the
remaining triangles.
List of Routines:
-
MAIN is the main program for TRIANGULATION_MASK.
-
CH_CAP capitalizes a single character.
-
CH_EQI is true if two characters are equal, disregarding case.
-
CH_TO_DIGIT returns the integer value of a base 10 digit.
-
DTABLE_CLOSE_WRITE closes a file to which a DTABLE was to be written.
-
DTABLE_DATA_READ reads the data from a real TABLE file.
-
DTABLE_DATA_WRITE writes data to a DTABLE file.
-
DTABLE_HEADER_READ reads the header from a real TABLE file.
-
DTABLE_HEADER_WRITE writes the header of a DTABLE file.
-
DTABLE_WRITE writes information to a DTABLE file.
-
FILE_COLUMN_COUNT counts the number of columns in the first line of a file.
-
FILE_NAME_EXT_GET determines the "extension" of a file name.
-
FILE_NAME_EXT_SWAP replaces the current "extension" of a file name.
-
FILE_ROW_COUNT counts the number of row records in a file.
-
I4_MAX returns the maximum of two I4's.
-
I4_MIN returns the minimum of two I4's.
-
I4MAT_TRANSPOSE_PRINT_SOME prints some of an I4MAT, transposed.
-
ITABLE_DATA_READ reads data from an ITABLE file.
-
ITABLE_DATA_WRITE writes data to an ITABLE file.
-
ITABLE_HEADER_READ reads the header from an ITABLE file.
-
ITABLE_HEADER_WRITE writes the header of an ITABLE file.
-
ITABLE_WRITE writes information to an ITABLE file.
-
R8_EPSILON returns the R8 roundoff unit.
-
R8MAT_TRANSPOSE_PRINT_SOME prints some of an R8MAT, transposed.
-
S_BLANK_DELETE removes blanks from a string, left justifying the remainder.
-
S_INDEX_LAST_C returns a pointer to the last occurrence of a given character.
-
S_LEN_TRIM returns the length of a string to the last nonblank.
-
S_TO_I4 reads an I4 from a string.
-
S_TO_I4VEC reads an I4VEC vector from a string.
-
S_TO_R8 reads an R8 from a string.
-
S_TO_R8VEC reads an R8VEC from a string.
-
S_WORD_COUNT counts the number of "words" in a string.
-
TIMESTAMP prints the current YMDHMS date as a time stamp.
-
TIMESTRING returns the current YMDHMS date as a string.
You can go up one level to
the C++ source codes.
Last revised on 14 January 2007.