diff --git a/src/Triangle.Examples/Examples/ExamplePar.cs b/src/Triangle.Examples/Examples/ExamplePar.cs index ef97b43..a98a08e 100644 --- a/src/Triangle.Examples/Examples/ExamplePar.cs +++ b/src/Triangle.Examples/Examples/ExamplePar.cs @@ -7,14 +7,92 @@ namespace TriangleNet.Examples using System.Linq; using System.Threading.Tasks; using TriangleNet; + using TriangleNet.Geometry; using TriangleNet.IO; using TriangleNet.Meshing; + using TriangleNet.Meshing.Algorithm; /// /// Processing meshes in parallel. /// public class ExamplePar { + #region Point set triangulation + + /// + /// Triangulate a given number of random point sets in parallel. + /// + public static bool Run(int n = 1000) + { + // Use thread-safe random source. + var random = Random.Shared; + + // Generate a random set of sizes. + var sizes = Enumerable.Range(0, n).Select(_ => random.Next(500, 5000)); + + var queue = new ConcurrentQueue(sizes); + + 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 triangulator = new Dwyer(); + var result = new MeshResult(); + + var bounds = new Rectangle(0d, 0d, 1000d, 1000d); + + while (queue.Count > 0) + { + if (queue.TryDequeue(out int size)) + { + var points = Generate.RandomPoints(size, bounds); + + var mesh = triangulator.Triangulate(points, config); + + 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); + } + + return invalid == 0; + } + + #endregion + + #region Polygon triangulation + /// /// Reads all .poly files from given directory and processes them in parallel. /// @@ -94,5 +172,7 @@ namespace TriangleNet.Examples public int NumberOfTriangles; public int Invalid; } + + #endregion } }