diff --git a/src/Triangle.Tests/Geomerty/ContourTest.cs b/src/Triangle.Tests/Geomerty/ContourTest.cs new file mode 100644 index 0000000..97b429e --- /dev/null +++ b/src/Triangle.Tests/Geomerty/ContourTest.cs @@ -0,0 +1,27 @@ +using NUnit.Framework; +using TriangleNet.Geometry; + +namespace TriangleNet.Tests.Geometry +{ + public class ContourTest + { + [Test] + public void TestFindInteriorPoint() + { + // The vertices that define the contour (have to be in order, obviously). + var vertices = new Vertex[] + { + new Vertex(0d, 0d), + new Vertex(1d ,0d), + new Vertex(1d, 1d), + new Vertex(0d, 1d), + }; + + var contour = new Contour(vertices); + + var p = contour.FindInteriorPoint(); + + Assert.IsTrue(p.X > 0d && p.X < 1d && p.Y > 0d && p.Y < 1d); + } + } +} diff --git a/src/Triangle.Tests/Helper.cs b/src/Triangle.Tests/Helper.cs new file mode 100644 index 0000000..23c675f --- /dev/null +++ b/src/Triangle.Tests/Helper.cs @@ -0,0 +1,35 @@ + +namespace TriangleNet.Tests +{ + using System.Collections.Generic; + using TriangleNet.Geometry; + using TriangleNet.Topology; + + static class Helper + { + public static Contour Rectangle(double left, double top, + double right, double bottom, int mark = 0) + { + var points = new List(4); + + points.Add(new Vertex(left, top, mark)); + points.Add(new Vertex(right, top, mark)); + points.Add(new Vertex(right, bottom, mark)); + points.Add(new Vertex(left, bottom, mark)); + + return new Contour(points, mark, true); + } + + public static Triangle CreateTriangle(int id, Vertex org, Vertex dest, Vertex apex) + { + var t = new Triangle() { id = id, hash = id }; + + // Node ordering 'plus 1 mod 3'. + t.vertices[0] = apex; + t.vertices[1] = org; + t.vertices[2] = dest; + + return t; + } + } +} diff --git a/src/Triangle.Tests/Meshing/Iterators/RegionIteratorTest.cs b/src/Triangle.Tests/Meshing/Iterators/RegionIteratorTest.cs new file mode 100644 index 0000000..1d799e8 --- /dev/null +++ b/src/Triangle.Tests/Meshing/Iterators/RegionIteratorTest.cs @@ -0,0 +1,35 @@ +using NUnit.Framework; +using TriangleNet.Geometry; +using TriangleNet.Meshing.Iterators; +using TriangleNet.Tools; +using TriangleNet.Topology; + +namespace TriangleNet.Tests.Meshing.Iterators +{ + public class RegionIteratorTest + { + public void TestProcessRegionProtected() + { + var poly = new Polygon(); + + // Outer region. + poly.Add(Helper.Rectangle(-2d, 2d, 2d, -2d, 2)); + + // Inner region. + poly.Add(Helper.Rectangle(-1d, 1d, 1d, -1d, 1)); + + poly.Regions.Add(new RegionPointer(0d, 0d, 1)); + + var mesh = (Mesh)poly.Triangulate(); + + var iterator = new RegionIterator(mesh); + + var qtree = new TriangleQuadTree(mesh); + + // Find a seeding triangle in region 1. + var seed = (Triangle)qtree.Query(0.0, 0.0); + + iterator.Process(seed, t => Assert.AreEqual(1, t.Label)); + } + } +} diff --git a/src/Triangle.Tests/RobustPredicatesTest.cs b/src/Triangle.Tests/RobustPredicatesTest.cs new file mode 100644 index 0000000..8f0b0c4 --- /dev/null +++ b/src/Triangle.Tests/RobustPredicatesTest.cs @@ -0,0 +1,55 @@ +using NUnit.Framework; +using TriangleNet.Geometry; + +namespace TriangleNet.Tests +{ + public class RobustPredicatesTest + { + [Test] + public void TestCounterClockwise() + { + var robust = RobustPredicates.Default; + + var a = new Point(-1d, 0d); + var b = new Point( 0d, 1d); + + Assert.IsTrue(robust.CounterClockwise(a, b, new Point(1d, 0d)) < 0d); + Assert.IsTrue(robust.CounterClockwise(a, b, new Point(0d, 2d)) > 0d); + Assert.IsTrue(robust.CounterClockwise(a, b, new Point(1d, 2d)) == 0d); + } + + [Test] + public void TestInCircle() + { + var robust = RobustPredicates.Default; + + var a = new Point(-1d, 0d); + var b = new Point(0d, 1d); + var c = new Point(1d, 0d); + + Assert.IsTrue(robust.InCircle(a, b, c, new Point(0d, 0.5)) < 0d); + Assert.IsTrue(robust.InCircle(a, b, c, new Point(0d, 1.5)) > 0d); + Assert.IsTrue(robust.InCircle(a, b, c, new Point(0d, 1d)) == 0d); + } + + [Test] + public void TestFindCircumcenter() + { + var robust = RobustPredicates.Default; + + var a = new Point(-1d, 0d); + var b = new Point(0d, 1d); + var c = new Point(1d, 0d); + + double xi = 0d, eta = 0d; + + var actual = robust.FindCircumcenter(a, b, c, ref xi, ref eta); + var expected = new Point(0d, 0d); + + Assert.AreEqual(expected.X, actual.X); + Assert.AreEqual(expected.Y, actual.Y); + Assert.AreEqual(0.0, xi); + Assert.AreEqual(0.5, eta); + } + } +} diff --git a/src/Triangle.Tests/Topology/OtriTest.cs b/src/Triangle.Tests/Topology/OtriTest.cs index a17eaeb..6719bfa 100644 --- a/src/Triangle.Tests/Topology/OtriTest.cs +++ b/src/Triangle.Tests/Topology/OtriTest.cs @@ -47,10 +47,10 @@ namespace TriangleNet.Tests // // This is because, for example, and oriented triange will return as its // origin (Org() method) the element at index [(orientation + 1) % 3]. - var t0 = triangles[0] = CreateTriangle(0, vertices[0], vertices[1], vertices[3]); - var t1 = triangles[1] = CreateTriangle(1, vertices[1], vertices[4], vertices[3]); - var t2 = triangles[2] = CreateTriangle(2, vertices[1], vertices[2], vertices[4]); - var t3 = triangles[3] = CreateTriangle(3, vertices[3], vertices[4], vertices[5]); + var t0 = triangles[0] = Helper.CreateTriangle(0, vertices[0], vertices[1], vertices[3]); + var t1 = triangles[1] = Helper.CreateTriangle(1, vertices[1], vertices[4], vertices[3]); + var t2 = triangles[2] = Helper.CreateTriangle(2, vertices[1], vertices[2], vertices[4]); + var t3 = triangles[3] = Helper.CreateTriangle(3, vertices[3], vertices[4], vertices[5]); // Setup connectivity of triangle 0. t0.neighbors[0].tri = dummy; @@ -81,18 +81,6 @@ namespace TriangleNet.Tests return triangles; } - private Triangle CreateTriangle(int id, Vertex org, Vertex dest, Vertex apex) - { - var t = new Triangle() { id = id, hash = id }; - - // Node ordering 'plus 1 mod 3'. - t.vertices[0] = apex; - t.vertices[1] = org; - t.vertices[2] = dest; - - return t; - } - [SetUp] public void Initialize() { @@ -111,7 +99,7 @@ namespace TriangleNet.Tests { Otri t = default; - t.tri = CreateTriangle(0, vertices[1], vertices[4], vertices[3]); + t.tri = Helper.CreateTriangle(0, vertices[1], vertices[4], vertices[3]); t.orient = 0; Assert.AreEqual(1, t.Org().ID); @@ -128,7 +116,7 @@ namespace TriangleNet.Tests { Otri t = default; - t.tri = CreateTriangle(0, vertices[1], vertices[4], vertices[3]); + t.tri = Helper.CreateTriangle(0, vertices[1], vertices[4], vertices[3]); t.orient = 0; Assert.AreEqual(4, t.Dest().ID); @@ -145,7 +133,7 @@ namespace TriangleNet.Tests { Otri t = default; - t.tri = CreateTriangle(0, vertices[1], vertices[4], vertices[3]); + t.tri = Helper.CreateTriangle(0, vertices[1], vertices[4], vertices[3]); t.orient = 0; Assert.AreEqual(3, t.Apex().ID); @@ -423,8 +411,8 @@ namespace TriangleNet.Tests Otri tmp = default; - s.tri = CreateTriangle(0, vertices[0], vertices[1], vertices[3]); - t.tri = CreateTriangle(1, vertices[1], vertices[4], vertices[3]); + s.tri = Helper.CreateTriangle(0, vertices[0], vertices[1], vertices[3]); + t.tri = Helper.CreateTriangle(1, vertices[1], vertices[4], vertices[3]); s.orient = 1; // Edge 1 -> 3. t.orient = 2; // Edge 3 -> 1.