diff --git a/src/Triangle.Examples/Examples/Example1.cs b/src/Triangle.Examples/Examples/Example1.cs
index 82d09d5..09ea8e7 100644
--- a/src/Triangle.Examples/Examples/Example1.cs
+++ b/src/Triangle.Examples/Examples/Example1.cs
@@ -2,7 +2,6 @@
namespace TriangleNet.Examples
{
using TriangleNet.Geometry;
- using TriangleNet.Meshing;
using TriangleNet.Meshing.Algorithm;
using TriangleNet.Rendering.Text;
@@ -19,11 +18,8 @@ namespace TriangleNet.Examples
// Choose triangulator: Incremental, SweepLine or Dwyer.
var triangulator = new Dwyer();
- // Generate a default mesher.
- var mesher = new GenericMesher(triangulator);
-
// Generate mesh.
- var mesh = mesher.Triangulate(points);
+ var mesh = triangulator.Triangulate(points, new Configuration());
if (print) SvgImage.Save(mesh, "example-1.svg", 500);
diff --git a/src/Triangle.Examples/Examples/Example10.cs b/src/Triangle.Examples/Examples/Example10.cs
index a02664b..ac8fe1d 100644
--- a/src/Triangle.Examples/Examples/Example10.cs
+++ b/src/Triangle.Examples/Examples/Example10.cs
@@ -9,7 +9,7 @@ namespace TriangleNet.Examples
///
/// Troubleshooting: finding degenerate boundary triangles.
///
- public class Example9
+ public class Example10
{
public static bool Run(bool print = false)
{
diff --git a/src/Triangle.Examples/Examples/Example11.cs b/src/Triangle.Examples/Examples/Example11.cs
index 1bd276e..516abfb 100644
--- a/src/Triangle.Examples/Examples/Example11.cs
+++ b/src/Triangle.Examples/Examples/Example11.cs
@@ -12,7 +12,7 @@ namespace TriangleNet.Examples
///
/// Scattered data interpolation without USE_Z or USE_ATTRIBS.
///
- internal class Example10
+ internal class Example11
{
// The function we are sampling.
private static readonly Func F = p => Math.Sin(p.X) * Math.Cos(p.Y);
@@ -28,7 +28,7 @@ namespace TriangleNet.Examples
var mesh = GetScatteredDataMesh(r, out double[] data);
//var mesh = GetStructuredDataMesh(r, out double[] data);
- if (print) SvgImage.Save(mesh, "example-10.svg", 500);
+ if (print) SvgImage.Save(mesh, "example-11.svg", 500);
// The points to interpolate.
var xy = Generate.RandomPoints(50, r);
@@ -69,8 +69,8 @@ namespace TriangleNet.Examples
double h = domain.Width / SIZE;
- // Generate a rectangle boundary point set (20 points on each side).
- var input = Generate.Rectangle(r, 0.5);
+ // Generate a rectangle boundary point set (SIZE points on each side).
+ var input = Generate.Rectangle(r, h);
// Making sure we add some margin to the boundary.
h = -h / 2;
diff --git a/src/Triangle.Examples/Examples/Example2.cs b/src/Triangle.Examples/Examples/Example2.cs
new file mode 100644
index 0000000..f819a5d
--- /dev/null
+++ b/src/Triangle.Examples/Examples/Example2.cs
@@ -0,0 +1,83 @@
+
+namespace TriangleNet.Examples
+{
+ using System.Collections.Generic;
+ using TriangleNet.Geometry;
+ using TriangleNet.Meshing;
+ using TriangleNet.Rendering.Text;
+
+ ///
+ /// Simple point set triangulation with convex hull.
+ ///
+ public class Example2
+ {
+ public static bool Run(bool print = false)
+ {
+ const int N = 50;
+
+ // Generate point set.
+ var points = Generate.RandomPoints(N, new Rectangle(0, 0, 100, 100));
+
+ // We use a polygon as input to enable segment insertion on the convex hull.
+ var poly = new Polygon(N);
+
+ poly.Points.AddRange(points);
+
+ // Set the 'convex' option to enclose the convex hull with segments.
+ var options = new ConstraintOptions() { Convex = true };
+
+ // Generate mesh.
+ var mesh = poly.Triangulate(options);
+
+ if (print) SvgImage.Save(mesh, "example-2.svg", 500);
+
+ return CheckConvexHull(mesh.Segments);
+ }
+
+ private static bool CheckConvexHull(IEnumerable segments)
+ {
+ int first = -1, prev = -1;
+
+ Point a = null, b, c;
+
+ var p = RobustPredicates.Default;
+
+ foreach (var s in segments)
+ {
+ // If first loop ...
+ if (first < 0)
+ {
+ // initialize vertex ids of first segment and ...
+ first = s.P1;
+ prev = s.P0;
+
+ // initialize first segment endpoint.
+ a = s.GetVertex(1);
+
+ continue;
+ }
+
+ // Check whether segments are returned in consecutive order.
+ if (prev != s.P1)
+ {
+ return false;
+ }
+
+ b = s.GetVertex(1);
+ c = s.GetVertex(0);
+
+ // Check whether the convex hull is traversed in counterclockwise.
+ if (p.CounterClockwise(a, b, c) < 0)
+ {
+ return false;
+ }
+
+ prev = s.P0;
+ a = b;
+ }
+
+ // Check whether the last segment connects to the first.
+ return prev == first;
+ }
+ }
+}
diff --git a/src/Triangle.Examples/Examples/Example3.cs b/src/Triangle.Examples/Examples/Example3.cs
index c497ccf..d253715 100644
--- a/src/Triangle.Examples/Examples/Example3.cs
+++ b/src/Triangle.Examples/Examples/Example3.cs
@@ -7,7 +7,7 @@
///
/// Triangulate a polygon with hole and set minimum angle constraint.
///
- public static class Example2
+ public static class Example3
{
public static bool Run(bool print = false)
{
@@ -20,7 +20,7 @@
// Generate mesh using the polygons Triangulate extension method.
var mesh = poly.Triangulate(quality);
- if (print) SvgImage.Save(mesh, "example-2.svg", 500);
+ if (print) SvgImage.Save(mesh, "example-3.svg", 500);
return mesh.Triangles.Count > 0;
}
diff --git a/src/Triangle.Examples/Examples/Example4.cs b/src/Triangle.Examples/Examples/Example4.cs
index 7e0182d..881c17f 100644
--- a/src/Triangle.Examples/Examples/Example4.cs
+++ b/src/Triangle.Examples/Examples/Example4.cs
@@ -10,14 +10,14 @@ namespace TriangleNet.Examples
///
/// Triangulate a polygon with hole with maximum area constraint, followed by mesh smoothing.
///
- public class Example3
+ public class Example4
{
public static bool Run(bool print = false)
{
// Generate mesh.
var mesh = CreateMesh();
- if (print) SvgImage.Save(mesh, "example-3.svg", 500);
+ if (print) SvgImage.Save(mesh, "example-4.svg", 500);
return mesh.Triangles.Count > 0;
}
@@ -25,7 +25,7 @@ namespace TriangleNet.Examples
public static IMesh CreateMesh()
{
// Generate the input geometry.
- var poly = Example2.CreatePolygon();
+ var poly = Example3.CreatePolygon();
// Since we want to do CVT smoothing, ensure that the mesh
// is conforming Delaunay.
diff --git a/src/Triangle.Examples/Examples/Example5.cs b/src/Triangle.Examples/Examples/Example5.cs
index d3c122a..12ff654 100644
--- a/src/Triangle.Examples/Examples/Example5.cs
+++ b/src/Triangle.Examples/Examples/Example5.cs
@@ -10,7 +10,7 @@ namespace TriangleNet.Examples
///
/// Refine only a part of a polygon mesh by using region pointers and an area constraint.
///
- public class Example4
+ public class Example5
{
public static bool Run(bool print = false)
{
@@ -41,7 +41,7 @@ namespace TriangleNet.Examples
smoother.Smooth(mesh, 5);
- if (print) SvgImage.Save(mesh, "example-4.svg", 500);
+ if (print) SvgImage.Save(mesh, "example-5.svg", 500);
return mesh.Triangles.Count > 0;
}
diff --git a/src/Triangle.Examples/Examples/Example6.cs b/src/Triangle.Examples/Examples/Example6.cs
index 17540af..b800e30 100644
--- a/src/Triangle.Examples/Examples/Example6.cs
+++ b/src/Triangle.Examples/Examples/Example6.cs
@@ -11,19 +11,19 @@ namespace TriangleNet.Examples
///
/// Two ways finding boundary triangles.
///
- public static class Example5
+ public static class Example6
{
public static bool Run(bool print = false)
{
- var mesh = Example3.CreateMesh();
+ var mesh = Example4.CreateMesh();
FindBoundary1(mesh);
- if (print) SvgImage.Save(mesh, "example-5-1.svg", 500, true, false);
+ if (print) SvgImage.Save(mesh, "example-6-1.svg", 500, true, false);
FindBoundary2(mesh);
- if (print) SvgImage.Save(mesh, "example-5-2.svg", 500, true, false);
+ if (print) SvgImage.Save(mesh, "example-6-2.svg", 500, true, false);
return mesh.Triangles.Count > 0;
}
diff --git a/src/Triangle.Examples/Examples/Example7.cs b/src/Triangle.Examples/Examples/Example7.cs
index 3fccd89..646bb57 100644
--- a/src/Triangle.Examples/Examples/Example7.cs
+++ b/src/Triangle.Examples/Examples/Example7.cs
@@ -11,7 +11,7 @@
///
/// Boolean operations on mesh regions (intersection, difference, xor).
///
- public static class Example6
+ public static class Example7
{
public static bool Run(bool print = false)
{
@@ -28,7 +28,7 @@
// Generate mesh.
var mesh = (Mesh)polygon.Triangulate();
- if (print) SvgImage.Save(mesh, "example-6.svg", 500);
+ if (print) SvgImage.Save(mesh, "example-7.svg", 500);
// Find a seeding triangle (in this case, the point (2, 2) lies in
// both rectangles).
diff --git a/src/Triangle.Examples/Examples/Example8.cs b/src/Triangle.Examples/Examples/Example8.cs
index cdc2f8f..32d66ec 100644
--- a/src/Triangle.Examples/Examples/Example8.cs
+++ b/src/Triangle.Examples/Examples/Example8.cs
@@ -10,7 +10,7 @@ namespace TriangleNet.Examples
///
/// Using a user test function to define a maximum edge length constraint.
///
- public static class Example7
+ public static class Example8
{
const double MAX_EDGE_LENGTH = 0.2;
@@ -41,7 +41,7 @@ namespace TriangleNet.Examples
}
}
- if (print) SvgImage.Save(mesh, "example-7.svg", 500);
+ if (print) SvgImage.Save(mesh, "example-8.svg", 500);
return true;
}
diff --git a/src/Triangle.Examples/Examples/Example9.cs b/src/Triangle.Examples/Examples/Example9.cs
index f0a16a5..e2da3de 100644
--- a/src/Triangle.Examples/Examples/Example9.cs
+++ b/src/Triangle.Examples/Examples/Example9.cs
@@ -10,11 +10,11 @@ namespace TriangleNet.Examples
///
/// Compute the adjacency matrix of the mesh vertices.
///
- public class Example8
+ public class Example9
{
public static bool Run()
{
- var mesh = (Mesh)Example3.CreateMesh();
+ var mesh = (Mesh)Example4.CreateMesh();
return FindAdjacencyMatrix(mesh);
}
diff --git a/src/Triangle.Examples/Program.cs b/src/Triangle.Examples/Program.cs
index 05269a1..3854ac4 100644
--- a/src/Triangle.Examples/Program.cs
+++ b/src/Triangle.Examples/Program.cs
@@ -18,6 +18,7 @@ namespace TriangleNet
Check("Example 8", Example8.Run());
Check("Example 9", Example9.Run());
Check("Example 10", Example10.Run());
+ Check("Example 11", Example10.Run());
}
static void Check(string item, bool success)