---
title: "TriangleTriangulate"
language: "en"
type: "Symbol"
summary: "TriangleTriangulate[expr, settings] triangulates a Triangle expression using settings and returns the result in a new Triangle expression."
keywords: 
- triangle
- triangle mesh
- mesh
- triangulate
- delaunay
- delaunay mesh
- refinement
- mesh refinement
- boundary mesh
- area mesh
- grid
canonical_url: "https://reference.wolfram.com/language/TriangleLink/ref/TriangleTriangulate.html"
source: "Wolfram Language Documentation"
related_guides: 
  - 
    title: "TriangleLink"
    link: "https://reference.wolfram.com/language/TriangleLink/guide/TriangleLink.en.md"
related_functions: 
  - 
    title: "TriangleCreate"
    link: "https://reference.wolfram.com/language/TriangleLink/ref/TriangleCreate.en.md"
  - 
    title: "TriangleSetPoints"
    link: "https://reference.wolfram.com/language/TriangleLink/ref/TriangleSetPoints.en.md"
  - 
    title: "TriangleGetPoints"
    link: "https://reference.wolfram.com/language/TriangleLink/ref/TriangleGetPoints.en.md"
  - 
    title: "TriangleSetSegments"
    link: "https://reference.wolfram.com/language/TriangleLink/ref/TriangleSetSegments.en.md"
  - 
    title: "TriangleGetSegments"
    link: "https://reference.wolfram.com/language/TriangleLink/ref/TriangleGetSegments.en.md"
related_tutorials: 
  - 
    title: "TriangleLink User Guide"
    link: "https://reference.wolfram.com/language/TriangleLink/tutorial/Overview.en.md"
---
## TriangleLink\`

# TriangleTriangulate

TriangleTriangulate[expr, settings] triangulates a Triangle expression using settings and returns the result in a new Triangle expression.

## Details and Options

* To use ``TriangleTriangulate``, you first need to load it using ``Needs["TriangleLink`"]``.

* The settings given to ``TriangleTriangulate`` are a string of different commands:

|     |     |
| --- | --- |
| "p" | triangulate a planar straight line graph (PLC) |
| "q" | quality mesh generation with no angles smaller than 20 degrees; an alternate minimum angle may be specified after the "q" |
| "a" | impose a maximum triangle area constraint; a fixed area constraint (that applies to every triangle) may be specified after the "a" |
| "A" | assign a regional attribute to each triangle that identifies what segment-bounded region it belongs to |
| "c" | enclose the convex hull with segments |
| "D" | conforming Delaunay: if all triangles in the mesh are to be Delaunay, not just constrained Delaunay, or if you want to ensure that all Voronoi vertices lie within the triangulation |
| "r" | refine a previously generated mesh |
| "Y" | prohibit the insertion of Steiner points on the mesh boundary; if specified twice ("YY"), it prohibits the insertion of Steiner points on any segment, including internal segments |
| "S" | specify the maximum number of added Steiner points |
| "o2" | generate second-order subparametric elements with six nodes each |
| "C" | check the consistency of the final mesh |
| "Q" | quiet: no terminal output except error |

* ``TriangleTriangulate`` has the following options:

"TriangleRefinement" 	[`None`](https://reference.wolfram.com/language/ref/None.en.md)	function to refine a triangle

---

## Examples (3)

### Basic Examples (1)

First, load the package:

```wl
In[1]:= Needs["TriangleLink`"]
```

This creates an instance of a Triangle expression:

```wl
In[2]:= inst = TriangleCreate[]

Out[2]= TriangleExpression[1]
```

This sets up points and segments to use:

```wl
In[3]:=
pts = {{0., 0.}, {2., 0.}, {2., 2.}, {0., 1.}};
segments = {{1, 2}, {2, 3}, {3, 4}, {4, 1}};
```

This sets the points and facets in the Triangle instance:

```wl
In[4]:=
TriangleSetPoints[inst, pts];
TriangleSetSegments[inst, segments];
```

This carries out the triangulation, returning a new Triangle instance:

```wl
In[5]:= outInst = TriangleTriangulate[ inst, "pqa0.025"]

Out[5]= TriangleExpression[2]
```

This extracts the points and elements from the triangulation:

```wl
In[6]:=
coords = TriangleGetPoints[outInst];
meshElements = TriangleGetElements[outInst];
```

With the following support function, you can visualize the triangles:

```wl
In[7]:= TriangleWireframe[i_]  := Line[ Flatten[ i[[All, #]]& /@ {{1, 2}, {2, 3}, {3, 1}}, 1]]

In[8]:= Graphics[GraphicsComplex[coords, TriangleWireframe[meshElements]]]

Out[8]= [image]
```

### Options (1)

#### "TriangleRefinement" (1)

First, load the package:

```wl
In[1]:= Needs["TriangleLink`"]
```

This creates an instance of a Triangle expression:

```wl
In[2]:= inst = TriangleCreate[]

Out[2]= TriangleExpression[3]
```

This sets up points and segments to use:

```wl
In[3]:=
pts = {{0., 0.}, {2., 0.}, {2., 2.}, {0., 1.}};
segments = {{1, 2}, {2, 3}, {3, 4}, {4, 1}};
```

This sets the points and facets in the Triangle instance:

```wl
In[4]:=
TriangleSetPoints[inst, pts];
TriangleSetSegments[inst, segments];
```

This carries out the triangulation, returning a new Triangle instance:

```wl
In[5]:= outInst = TriangleTriangulate[ inst, "pq"]

Out[5]= TriangleExpression[4]
```

This extracts the points and elements from the triangulation:

```wl
In[6]:=
coords = TriangleGetPoints[outInst];
meshElements = TriangleGetElements[outInst];
```

With the following support function, you can visualize the triangles:

```wl
In[7]:= TriangleWireframe[i_]  := Line[ Flatten[ i[[All, #]]& /@ {{1, 2}, {2, 3}, {3, 1}}, 1]]

In[8]:= Graphics[GraphicsComplex[coords, TriangleWireframe[meshElements]]]

Out[8]= [image]
```

This sets up a compiled function that returns ``True`` if a triangle should be refined and ``False`` otherwise:

```wl
In[9]:=
cf = Compile[{{coordinates, _Real, 2}, {area, _Real, 0}}, 
	Block[{c = coordinates, res, dxoa, dyoa, dxda, dyda, dxod, dyod, oalen, dalen, odlen, maxlen}, 
	dxoa = c[[1, 1]] - c[[3, 1]];
	dyoa = c[[1, 2]] - c[[3, 2]];
	dxda = c[[2, 1]] - c[[3, 1]];
	dyda = c[[2, 2]] - c[[3, 2]];
	dxod = c[[1, 1]] - c[[2, 1]];
	dyod = c[[1, 2]] - c[[2, 2]];
	oalen = dxoa ^ 2 + dyoa ^ 2;
	dalen = dxda ^ 2 + dyda ^ 2;
	odlen = dxod ^ 2 + dyod ^ 2;
	maxlen = If[dalen > oalen, dalen, oalen];
	maxlen = If[oalen > maxlen, oalen, maxlen];
	res = If[maxlen > 0.025 * (c[[1, 1]] ^ 2 + c[[1, 2]] ^ 2) + 0.02, True, False];
	res]
	];
```

This carries out the triangulation with the refinement function, returning a new Triangle instance:

```wl
In[10]:= outInst2 = TriangleTriangulate[inst, "pq", "TriangleRefinement" -> cf]

Out[10]= TriangleExpression[5]
```

This extracts the points and elements from the triangulation:

```wl
In[11]:=
coords = TriangleGetPoints[outInst2];
meshElements = TriangleGetElements[outInst2];
```

Visualize the triangles:

```wl
In[12]:= Graphics[GraphicsComplex[coords, TriangleWireframe[meshElements]]]

Out[12]= [image]
```

### Neat Examples (1)

Use a black-and-white image as a refinement driver. Set an image, create a distance function, and visualize the distance function:

```wl
In[1]:= shape = [image];

In[2]:= dist = DistanceTransform[Image[1 - ImageData[EdgeDetect[shape]]]];

In[3]:= ImageAdjust@dist

Out[3]= [image]
```

Create an ``InterpolatingFunction`` from the distance function:

```wl
In[4]:=
data = Transpose[Reverse[-ImageData[dist] * (2 * ImageData[shape] - 1)]];
range = Transpose[{{1, 1}, Dimensions[data]}];
ifun = ListInterpolation[data, range, InterpolationOrder -> 1]

Out[4]= InterpolatingFunction[{{1., 240.}, {1., 231.}}, <>]
```

Create and populate a Triangle instance:

```wl
In[5]:=
inst = TriangleCreate[];
TriangleSetPoints[inst, Flatten[Outer[List, Sequence@@range], 1]];
TriangleSetSegments[inst, {{1, 3}, {3, 4}, {4, 2}, {2, 1}}];
```

Set up a compiled function that calls the ``InterpolatingFunction`` :

```wl
In[6]:=
cf = Compile[{{c, _Real, 2}, {area, _Real, 0}}, 
	Block[{com}, 
	com = Total[c] / 3;
	If[area > Max[Abs[ifun[com[[1]], com[[2]]]], 2.5], True, False]
	]
	];
```

This carries out the triangulation with the refinement function, returning a new Triangle instance:

```wl
In[7]:= outInst = TriangleTriangulate[inst, "pq", "TriangleRefinement" -> cf]

Out[7]= TriangleExpression[7]
```

This extracts the points and elements from the triangulation:

```wl
In[8]:=
coords = TriangleGetPoints[outInst];
meshElements = TriangleGetElements[outInst];
```

Visualize the triangles:

```wl
In[9]:=
TriangleWireframe[i_] := Line[Flatten[ i[[All, #]]& /@ {{1, 2}, {2, 3}, {3, 1}}, 1]]
Graphics[GraphicsComplex[coords, TriangleWireframe[meshElements]], ImageSize -> Medium]

Out[9]= [image]
```

## See Also

* [TriangleCreate](https://reference.wolfram.com/language/TriangleLink/ref/TriangleCreate.en.md)
* [TriangleSetPoints](https://reference.wolfram.com/language/TriangleLink/ref/TriangleSetPoints.en.md)
* [TriangleGetPoints](https://reference.wolfram.com/language/TriangleLink/ref/TriangleGetPoints.en.md)
* [TriangleSetSegments](https://reference.wolfram.com/language/TriangleLink/ref/TriangleSetSegments.en.md)
* [TriangleGetSegments](https://reference.wolfram.com/language/TriangleLink/ref/TriangleGetSegments.en.md)

## Tech Notes

* [*TriangleLink* User Guide](https://reference.wolfram.com/language/TriangleLink/tutorial/Overview.en.md)

## Related Guides

* [TriangleLink](https://reference.wolfram.com/language/TriangleLink/guide/TriangleLink.en.md)