diff --git a/src/Triangle.Examples/Examples/Example1.cs b/src/Triangle.Examples/Examples/Example1.cs
index 2dbaa63..202dd7a 100644
--- a/src/Triangle.Examples/Examples/Example1.cs
+++ b/src/Triangle.Examples/Examples/Example1.cs
@@ -25,7 +25,7 @@ namespace TriangleNet.Examples
// Generate mesh.
var mesh = mesher.Triangulate(points);
- if (print) SvgImage.Save(mesh, "example-1.png", 500);
+ 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
new file mode 100644
index 0000000..9f6dc16
--- /dev/null
+++ b/src/Triangle.Examples/Examples/Example10.cs
@@ -0,0 +1,96 @@
+
+namespace TriangleNet.Examples
+{
+ using System;
+ using System.Collections.Concurrent;
+ using System.IO;
+ using System.Linq;
+ using System.Threading.Tasks;
+ using TriangleNet;
+ using TriangleNet.IO;
+ using TriangleNet.Meshing;
+
+ ///
+ /// Processing meshes in parallel.
+ ///
+ public class Example10
+ {
+ ///
+ /// Reads all .poly files from given directory and processes them in parallel.
+ ///
+ public static void Run(string dir)
+ {
+ var files = Directory.EnumerateFiles(dir, "*.poly", SearchOption.AllDirectories);
+
+ var queue = new ConcurrentQueue(files);
+
+ int concurrencyLevel = Environment.ProcessorCount / 2;
+
+ var tasks = new Task[concurrencyLevel];
+
+ for (int i = 0; i < concurrencyLevel; i++)
+ {
+ tasks[i] = Task.Run(() =>
+ {
+ // Each task has it's own triangle pool and predicates instance.
+ var pool = new TrianglePool();
+ var predicates = new RobustPredicates();
+
+ // The factory methods return the above instances.
+ var config = new Configuration()
+ {
+ Predicates = () => predicates,
+ TrianglePool = () => pool.Restart()
+ };
+
+ var mesher = new GenericMesher(config);
+ var result = new MeshResult();
+
+ while (queue.Count > 0)
+ {
+ if (queue.TryDequeue(out var file))
+ {
+ var poly = FileProcessor.Read(file);
+
+ var mesh = mesher.Triangulate(poly);
+
+ ProcessMesh(mesh, result);
+ }
+ }
+
+ pool.Clear();
+
+ return result;
+ });
+ }
+
+ Task.WaitAll(tasks);
+
+ int numberOfTriangles = tasks.Sum(t => t.Result.NumberOfTriangles);
+ int invalid = tasks.Sum(t => t.Result.Invalid);
+
+ Console.WriteLine("Total number of triangles processed: {0}", numberOfTriangles);
+
+ if (invalid > 0)
+ {
+ Console.WriteLine(" Number of invalid triangulations: {0}", invalid);
+ }
+ }
+
+ private static void ProcessMesh(IMesh mesh, MeshResult result)
+ {
+ result.NumberOfTriangles += mesh.Triangles.Count;
+
+ if (!MeshValidator.IsConsistent((Mesh)mesh))
+ {
+ result.Invalid += 1;
+ }
+ }
+
+ class MeshResult
+ {
+ public int NumberOfTriangles;
+ public int Invalid;
+ }
+ }
+}
diff --git a/src/Triangle.Examples/Examples/Example2.cs b/src/Triangle.Examples/Examples/Example2.cs
index 351d360..b973c03 100644
--- a/src/Triangle.Examples/Examples/Example2.cs
+++ b/src/Triangle.Examples/Examples/Example2.cs
@@ -20,7 +20,7 @@
// Generate mesh using the polygons Triangulate extension method.
var mesh = poly.Triangulate(quality);
- if (print) SvgImage.Save(mesh, "example-2.png", 500);
+ if (print) SvgImage.Save(mesh, "example-2.svg", 500);
}
public static IPolygon CreatePolygon(double h = 0.2)
diff --git a/src/Triangle.Examples/Examples/Example3.cs b/src/Triangle.Examples/Examples/Example3.cs
index fbf3750..f8520b2 100644
--- a/src/Triangle.Examples/Examples/Example3.cs
+++ b/src/Triangle.Examples/Examples/Example3.cs
@@ -17,7 +17,7 @@ namespace TriangleNet.Examples
// Generate mesh.
var mesh = CreateMesh();
- if (print) SvgImage.Save(mesh, "example-3.png", 500);
+ if (print) SvgImage.Save(mesh, "example-3.svg", 500);
}
public static IMesh CreateMesh()
diff --git a/src/Triangle.Examples/Examples/Example4.cs b/src/Triangle.Examples/Examples/Example4.cs
index 449eb4b..c69f09c 100644
--- a/src/Triangle.Examples/Examples/Example4.cs
+++ b/src/Triangle.Examples/Examples/Example4.cs
@@ -41,7 +41,7 @@ namespace TriangleNet.Examples
smoother.Smooth(mesh, 5);
- if (print) SvgImage.Save(mesh, "example-4.png", 500);
+ if (print) SvgImage.Save(mesh, "example-4.svg", 500);
}
public static IPolygon CreatePolygon()
diff --git a/src/Triangle.Examples/Examples/Example5.cs b/src/Triangle.Examples/Examples/Example5.cs
index a38529c..acd8fc1 100644
--- a/src/Triangle.Examples/Examples/Example5.cs
+++ b/src/Triangle.Examples/Examples/Example5.cs
@@ -19,11 +19,11 @@ namespace TriangleNet.Examples
FindBoundary1(mesh);
- if (print) SvgImage.Save(mesh, "example-5-1.png", 500, true, false);
+ if (print) SvgImage.Save(mesh, "example-5-1.svg", 500, true, false);
FindBoundary2(mesh);
- if (print) SvgImage.Save(mesh, "example-5-2.png", 500, true, false);
+ if (print) SvgImage.Save(mesh, "example-5-2.svg", 500, true, false);
}
///
diff --git a/src/Triangle.Examples/Examples/Example6.cs b/src/Triangle.Examples/Examples/Example6.cs
index d114eca..2d18c47 100644
--- a/src/Triangle.Examples/Examples/Example6.cs
+++ b/src/Triangle.Examples/Examples/Example6.cs
@@ -8,11 +8,11 @@
using TriangleNet.Topology;
///
- /// Boolean operation on mesh regions (intersection, difference, xor).
+ /// Boolean operations on mesh regions (intersection, difference, xor).
///
public static class Example6
{
- public static void Run() //FindRegions()
+ public static void Run()
{
// Generate the input geometry.
var polygon = new Polygon(8, true);
diff --git a/src/Triangle.Examples/Examples/Example9.cs b/src/Triangle.Examples/Examples/Example9.cs
index 93d4a53..9b24aa7 100644
--- a/src/Triangle.Examples/Examples/Example9.cs
+++ b/src/Triangle.Examples/Examples/Example9.cs
@@ -72,8 +72,11 @@ namespace TriangleNet.Examples
double x = p.X;
double y = p.Y;
- double xr = Math.Cos(radians) * x - Math.Sin(radians) * y;
- double yr = Math.Sin(radians) * x + Math.Cos(radians) * y;
+ double s = Math.Sin(radians);
+ double c = Math.Cos(radians);
+
+ double xr = c * x - s * y;
+ double yr = s * x + c * y;
poly.Points.Add(new Vertex(xr, yr) { ID = id++ });
}