From e1c523299fbc8a1bd1a9361a97ed3229665e18a8 Mon Sep 17 00:00:00 2001 From: "SND\\wo80_cp" Date: Tue, 23 Aug 2016 20:29:52 +0000 Subject: [PATCH] Rename Sampler to TriangleSampler; Make TriangleLocator public; git-svn-id: https://triangle.svn.codeplex.com/svn@79449 0e2699bc-83d4-4a8f-98e7-55e24ab8c7a5 --- Triangle.NET/Triangle/Enums.cs | 2 +- Triangle.NET/Triangle/Triangle.csproj | 2 +- Triangle.NET/Triangle/TriangleLocator.cs | 27 +++++++++++++---- .../{Sampler.cs => TriangleSampler.cs} | 29 +++++++++++-------- 4 files changed, 41 insertions(+), 19 deletions(-) rename Triangle.NET/Triangle/{Sampler.cs => TriangleSampler.cs} (72%) diff --git a/Triangle.NET/Triangle/Enums.cs b/Triangle.NET/Triangle/Enums.cs index f77f0e0..3213cda 100644 --- a/Triangle.NET/Triangle/Enums.cs +++ b/Triangle.NET/Triangle/Enums.cs @@ -23,7 +23,7 @@ namespace TriangleNet /// The result of a search indicates that the point falls in the /// interior of a triangle, on an edge, on a vertex, or outside the mesh. /// - enum LocateResult { InTriangle, OnEdge, OnVertex, Outside }; + public enum LocateResult { InTriangle, OnEdge, OnVertex, Outside }; /// /// Labels that signify the result of vertex insertion. diff --git a/Triangle.NET/Triangle/Triangle.csproj b/Triangle.NET/Triangle/Triangle.csproj index 73ce7cf..79bdc0b 100644 --- a/Triangle.NET/Triangle/Triangle.csproj +++ b/Triangle.NET/Triangle/Triangle.csproj @@ -123,7 +123,7 @@ - + diff --git a/Triangle.NET/Triangle/TriangleLocator.cs b/Triangle.NET/Triangle/TriangleLocator.cs index cc9f2f7..e0f3e5e 100644 --- a/Triangle.NET/Triangle/TriangleLocator.cs +++ b/Triangle.NET/Triangle/TriangleLocator.cs @@ -7,8 +7,8 @@ namespace TriangleNet { - using TriangleNet.Topology; using TriangleNet.Geometry; + using TriangleNet.Topology; /// /// Locate triangles in a mesh. @@ -16,10 +16,15 @@ namespace TriangleNet /// /// WARNING: This routine is designed for convex triangulations, and will /// not generally work after the holes and concavities have been carved. + /// + /// Based on a paper by Ernst P. Mucke, Isaac Saias, and Binhai Zhu, "Fast + /// Randomized Point Location Without Preprocessing in Two- and Three-Dimensional + /// Delaunay Triangulations," Proceedings of the Twelfth Annual Symposium on + /// Computational Geometry, ACM, May 1996. /// - class TriangleLocator + public class TriangleLocator { - Sampler sampler; + TriangleSampler sampler; Mesh mesh; IPredicates predicates; @@ -28,14 +33,23 @@ namespace TriangleNet // proximate vertices are inserted sequentially. internal Otri recenttri; + public TriangleLocator(Mesh mesh) + : this(mesh, RobustPredicates.Default) + { + } + public TriangleLocator(Mesh mesh, IPredicates predicates) { this.mesh = mesh; this.predicates = predicates; - sampler = new Sampler(mesh); + sampler = new TriangleSampler(mesh); } + /// + /// Suggest the given triangle as a starting triangle for point location. + /// + /// public void Update(ref Otri otri) { otri.Copy(ref recenttri); @@ -114,7 +128,7 @@ namespace TriangleNet /// However, it can still be used to find the circumcenter of a triangle, as /// long as the search is begun from the triangle in question. public LocateResult PreciseLocate(Point searchpoint, ref Otri searchtri, - bool stopatsubsegment) + bool stopatsubsegment) { Otri backtracktri = default(Otri); Osub checkedge = default(Osub); @@ -313,6 +327,7 @@ namespace TriangleNet // Where are we? torg = searchtri.Org(); tdest = searchtri.Dest(); + // Check the starting triangle's vertices. if ((torg.x == searchpoint.x) && (torg.y == searchpoint.y)) { @@ -323,6 +338,7 @@ namespace TriangleNet searchtri.Lnext(); return LocateResult.OnVertex; } + // Orient 'searchtri' to fit the preconditions of calling preciselocate(). ahead = predicates.CounterClockwise(torg, tdest, searchpoint); if (ahead < 0.0) @@ -340,6 +356,7 @@ namespace TriangleNet return LocateResult.OnEdge; } } + return PreciseLocate(searchpoint, ref searchtri, false); } } diff --git a/Triangle.NET/Triangle/Sampler.cs b/Triangle.NET/Triangle/TriangleSampler.cs similarity index 72% rename from Triangle.NET/Triangle/Sampler.cs rename to Triangle.NET/Triangle/TriangleSampler.cs index b590224..8ff42c4 100644 --- a/Triangle.NET/Triangle/Sampler.cs +++ b/Triangle.NET/Triangle/TriangleSampler.cs @@ -1,5 +1,5 @@ // ----------------------------------------------------------------------- -// +// // Original Triangle code by Jonathan Richard Shewchuk, http://www.cs.cmu.edu/~quake/triangle.html // Triangle.NET code by Christian Woltering, http://triangle.codeplex.com/ // @@ -14,12 +14,14 @@ namespace TriangleNet /// /// Used for triangle sampling in the class. /// - class Sampler : IEnumerable + class TriangleSampler : IEnumerable { + private const int RANDOM_SEED = 110503; + // Empirically chosen factor. private const int samplefactor = 11; - private Random rand; + private Random random; private Mesh mesh; // Number of random samples for point location (at least 1). @@ -28,10 +30,15 @@ namespace TriangleNet // Number of triangles in mesh. private int triangleCount = 0; - public Sampler(Mesh mesh) + public TriangleSampler(Mesh mesh) + : this(mesh, new Random(RANDOM_SEED)) + { + } + + public TriangleSampler(Mesh mesh, Random random) { this.mesh = mesh; - this.rand = new Random(110503); + this.random = random; } /// @@ -46,18 +53,16 @@ namespace TriangleNet /// /// Update sampling parameters if mesh changed. /// - /// Current mesh. - public void Update(bool forceUpdate = false) + public void Update() { int count = mesh.triangles.Count; - // TODO: Is checking the triangle count a good way to monitor mesh changes? - if (triangleCount != count || forceUpdate) + if (triangleCount != count) { triangleCount = count; - // The number of random samples taken is proportional to the cube root of - // the number of triangles in the mesh. The next bit of code assumes + // The number of random samples taken is proportional to the cube root + // of the number of triangles in the mesh. The next bit of code assumes // that the number of triangles increases monotonically (or at least // doesn't decrease enough to matter). while (samplefactor * samples * samples * samples < count) @@ -69,7 +74,7 @@ namespace TriangleNet public IEnumerator GetEnumerator() { - return mesh.triangles.Sample(samples, rand).GetEnumerator(); + return mesh.triangles.Sample(samples, random).GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()