triangulate
void triangulate(triswitches, in, out, vorout)
char triswitches;
struct triangulateio in;
struct triangulateio out;
struct triangulateio vorout;
triswitches
triswitches is a string containing the command line switches you wish to invoke. No initial dash is required. Some suggestions:
- You'll probably find it convenient to use the
zswitch so that points (and other items) are numbered from zero. This simplifies indexing, because the first item of any type always starts at index[0]of the corresponding array, whether that item's number is zero or one. - You'll probably want to use the
Qswitch in your final code, but you can take advantage of Triangle's printed output (including theVswitch) while debugging. - If you are not using the
q,a,u,D,j, orsswitches, then the output points will be identical to the input points, except possibly for the boundary markers. If you don't need the boundary markers, you should use theN(no nodes output) switch to save memory. - The
I(no iteration numbers) andg(.off file output) switches have no effect when Triangle is compiled withTRILIBRARYdefined.
If you do need boundary markers, but need to save memory, a good nasty trick is to set iout->pointlist equal to in->pointlist before calling triangulate(), so that Triangle overwrites the input points with identical copies.
in, out, vorout
in,out, andvoroutare descriptions of the input, the output, and the Voronoi output.
If the v (Voronoi output) switch is not used,vorout may be NULL. in and out may never be NULL.
Certain fields of the input and output structures must be initialized, as described below.
Caution regarding memory allocation
-
Any input fields that Triangle will examine must be initialized.
-
Furthermore, for each output array that Triangle will write to, you must either provide space by setting the appropriate pointer to point to the space you want the data written to, or you must initialize the pointer to NULL, which tells Triangle to allocate space for the results.
-
The latter option is preferable, because Triangle always knows exactly how much space to allocate.
-
The former option is provided mainly for people who need to call Triangle from Fortran code, though it also makes possible some nasty space-saving tricks, like writing the output to the same arrays as the input.
-
Triangle will not
free()any input or output arrays, including those it allocates itself; that's up to you. -
You should free arrays allocated by Triangle by calling the
trifree()procedure defined below. -
By default,
trifree()just calls the standard free() library procedure, but applications that calltriangulate()may replacetrimalloc()andtrifree()in triangle.c to use specialized memory allocators.
Here's a guide to help you decide which fields you must initialize before you call triangulate().
In
pointlistmust always point to a list of points;numberofpointsandnumberofpointattributesmust be properly set.pointmarkerlistmust either be set to NULL (in which case all markers default to zero), or must point to a list of markers.
If numberofpointattributes is not zero, pointattributelist must point to a list of point attributes.
- If the
rswitch is used,trianglelistmust point to a list of triangles, andnumberoftriangles,numberofcorners, andnumberoftriangleattributesmust be properly set. Ifnumberoftriangleattributesis not zero,triangleattributelistmust point to a list of triangle attributes. - If the
aswitch is used (with no number following),trianglearealistmust point to a list of triangle area constraints.neighborlistmay be ignored. - If the
pswitch is used,segmentlistmust point to a list of segments,numberofsegmentsmust be properly set, andsegmentmarkerlistmust either be set to NULL (in which case all markers default to zero), or must point to a list of markers. - If the
pswitch is used without therswitch, thennumberofholesandnumberofregionsmust be properly set. Ifnumberofholesis not zero,holelistmust point to a list of holes. Ifnumberofregionsis not zero,regionlistmust point to a list of region constraints. - If the
pswitch is used,holelist,numberofholes,regionlist, andnumberofregionsis copied toout. (You can nonetheless get away with not initializing them if therswitch is used.) edgelist,edgemarkerlist,normlist, andnumberofedgesmay be ignored.
Out
pointlistmust be initialized (NULL or pointing to memory) unless theNswitch is used.pointmarkerlistmust be initialized unless theNorBswitch is used.- If
Nis not used andin->numberofpointattributesis not zero,pointattributelistmust be initialized. trianglelistmust be initialized unless theEswitch is used.neighborlistmust be initialized if thenswitch is used. If theEswitch is not used and (in->numberofelementattributesis not zero or theAswitch is used),elementattributelistmust be initialized.trianglearealistmay be ignored.segmentlistmust be initialized if theporcswitch is used, and thePswitch is not used.segmentmarkerlistmust also be initialized under these circumstances unless theBswitch is used.edgelistmust be initialized if theeswitch is used.edgemarkerlistmust be initialized if theeswitch is used and theBswitch is not.holelist,regionlist,normlist, and all scalars may be ignored.
Vorout
vorout (only needed if v switch is used):
pointlistmust be initialized. Ifin->numberofpointattributesis not zero,pointattributelistmust be initialized.pointmarkerlistmay be ignored.edgelistandnormlistmust both be initialized.edgemarkerlistmay be ignored.- Everything else may be ignored.
Final comments
- After a call to triangulate(), the valid fields of
outandvoroutwill depend, in an obvious way, on the choice of switches used. - Note that when the
pswitch is used, the pointersholelistandregionlistare copied fromintoout, but no new space is allocated; be careful that you don't free() the same array twice. - On the other hand, Triangle will never copy the
pointlistpointer (or any others); new space is allocated forout->pointlist, or if theNswitch is used,out->pointlistremains uninitialized. - All of the meaningful
numberoffields will be properly set; for instance,numberofedgeswill represent the number of edges in the triangulation whether or not the edges were written. If segments are not used,numberofsegmentswill indicate the number of boundary edges.