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++ }); }