From faa7d4df47bdb8847fa052de204580c8d7b4d1c3 Mon Sep 17 00:00:00 2001 From: "SND\\wo80_cp" Date: Thu, 29 May 2014 19:06:09 +0000 Subject: [PATCH] More code reorganization (2) git-svn-id: https://triangle.svn.codeplex.com/svn@75022 0e2699bc-83d4-4a8f-98e7-55e24ab8c7a5 --- Triangle.NET/TestApp/FormLog.cs | 15 +++---- Triangle.NET/TestApp/FormMain.cs | 18 ++++----- Triangle.NET/TestApp/IO/SvgImage.cs | 2 +- Triangle.NET/Triangle/Behavior.cs | 11 ++--- Triangle.NET/Triangle/Data/BadSubseg.cs | 22 +++------- .../Triangle/{ => Data}/BadTriQueue.cs | 19 +++++---- Triangle.NET/Triangle/Data/BadTriangle.cs | 15 ++----- Triangle.NET/Triangle/Data/Osub.cs | 4 +- Triangle.NET/Triangle/Data/Otri.cs | 4 +- Triangle.NET/Triangle/Data/Segment.cs | 3 -- Triangle.NET/Triangle/Geometry/ISegment.cs | 6 --- Triangle.NET/Triangle/Geometry/Rectangle.cs | 16 ++++++-- .../Triangle/{Data => Geometry}/Vertex.cs | 7 +--- Triangle.NET/Triangle/IO/TriangleReader.cs | 22 +++++----- Triangle.NET/Triangle/IO/TriangleWriter.cs | 2 +- .../Triangle/{Log/SimpleLog.cs => Log.cs} | 33 ++++++++------- .../Triangle/{Log => Logging}/ILog.cs | 5 +-- .../Triangle/{Log => Logging}/ILogItem.cs | 5 +-- .../SimpleLogItem.cs => Logging/LogItem.cs} | 11 ++--- Triangle.NET/Triangle/Mesh.cs | 22 +++++----- Triangle.NET/Triangle/MeshValidator.cs | 30 +++++++------- .../Triangle/Meshing/Algorithm/Dwyer.cs | 36 +++++++++-------- .../Triangle/Meshing/Algorithm/Incremental.cs | 6 +-- .../Triangle/Meshing/Algorithm/SweepLine.cs | 18 ++++----- .../Triangle/Meshing/ConstraintMesher.cs | 34 ++++++++-------- .../Triangle/Meshing/ConstraintOptions.cs | 10 +++++ Triangle.NET/Triangle/Meshing/Converter.cs | 6 +-- .../Triangle/Meshing/ITriangulator.cs | 6 +-- .../Triangle/Meshing/QualityMesher.cs | 40 +++++++++---------- Triangle.NET/Triangle/NewLocation.cs | 22 +++++----- .../{Primitives.cs => RobustPredicates.cs} | 2 +- Triangle.NET/Triangle/Sampler.cs | 3 +- Triangle.NET/Triangle/Tools/BoundedVoronoi.cs | 2 +- Triangle.NET/Triangle/Tools/CuthillMcKee.cs | 6 +-- Triangle.NET/Triangle/Tools/Voronoi.cs | 2 +- Triangle.NET/Triangle/Triangle.csproj | 14 +++---- Triangle.NET/Triangle/TriangleLocator.cs | 6 +-- 37 files changed, 227 insertions(+), 258 deletions(-) rename Triangle.NET/Triangle/{ => Data}/BadTriQueue.cs (91%) rename Triangle.NET/Triangle/{Data => Geometry}/Vertex.cs (92%) rename Triangle.NET/Triangle/{Log/SimpleLog.cs => Log.cs} (63%) rename Triangle.NET/Triangle/{Log => Logging}/ILog.cs (86%) rename Triangle.NET/Triangle/{Log => Logging}/ILogItem.cs (80%) rename Triangle.NET/Triangle/{Log/SimpleLogItem.cs => Logging/LogItem.cs} (75%) rename Triangle.NET/Triangle/{Primitives.cs => RobustPredicates.cs} (98%) diff --git a/Triangle.NET/TestApp/FormLog.cs b/Triangle.NET/TestApp/FormLog.cs index 32df43a..70b619b 100644 --- a/Triangle.NET/TestApp/FormLog.cs +++ b/Triangle.NET/TestApp/FormLog.cs @@ -1,12 +1,9 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; using System.Drawing; -using System.Linq; using System.Text; using System.Windows.Forms; -using TriangleNet.Log; +using TriangleNet; +using TriangleNet.Logging; namespace MeshExplorer { @@ -19,7 +16,7 @@ namespace MeshExplorer public void AddItem(string message, bool warning) { - ILog log = SimpleLog.Instance; + ILog log = Log.Instance; if (warning) { @@ -35,7 +32,7 @@ namespace MeshExplorer { listLog.Items.Clear(); - ILog log = SimpleLog.Instance; + ILog log = Log.Instance; foreach (var item in log.Data) { @@ -43,7 +40,7 @@ namespace MeshExplorer } } - private ListViewItem CreateListViewItem(SimpleLogItem item) + private ListViewItem CreateListViewItem(LogItem item) { ListViewItem lvi = new ListViewItem(new string[] { item.Message, item.Info }); @@ -81,7 +78,7 @@ namespace MeshExplorer if (ModifierKeys == Keys.Control) { listLog.Items.Clear(); - SimpleLog.Instance.Clear(); + Log.Instance.Clear(); } } } diff --git a/Triangle.NET/TestApp/FormMain.cs b/Triangle.NET/TestApp/FormMain.cs index 0bb0c18..83d299e 100644 --- a/Triangle.NET/TestApp/FormMain.cs +++ b/Triangle.NET/TestApp/FormMain.cs @@ -8,7 +8,7 @@ using MeshExplorer.IO; using MeshRenderer.Core; using TriangleNet; using TriangleNet.Geometry; -using TriangleNet.Log; +using TriangleNet.Logging; using TriangleNet.Tools; namespace MeshExplorer @@ -552,13 +552,13 @@ namespace MeshExplorer { if (mesh == null || settings.ExceptionThrown) return; - bool tmp = Behavior.Verbose; - Behavior.Verbose = true; + bool tmp = Log.Verbose; + Log.Verbose = true; mesh.Renumber(NodeNumbering.CuthillMcKee); ShowLog(); - Behavior.Verbose = tmp; + Log.Verbose = tmp; } private void Smooth() @@ -736,23 +736,23 @@ namespace MeshExplorer { if (mesh != null) { - bool save = Behavior.Verbose; + bool save = Log.Verbose; - Behavior.Verbose = true; + Log.Verbose = true; bool isConsistent = MeshValidator.IsConsistent(mesh); bool isDelaunay = MeshValidator.IsDelaunay(mesh); - Behavior.Verbose = save; + Log.Verbose = save; if (isConsistent) { - SimpleLog.Instance.Info("Mesh topology appears to be consistent."); + Log.Instance.Info("Mesh topology appears to be consistent."); } if (isDelaunay) { - SimpleLog.Instance.Info("Mesh is (conforming) Delaunay."); + Log.Instance.Info("Mesh is (conforming) Delaunay."); } ShowLog(); diff --git a/Triangle.NET/TestApp/IO/SvgImage.cs b/Triangle.NET/TestApp/IO/SvgImage.cs index 8fc1c02..86353f2 100644 --- a/Triangle.NET/TestApp/IO/SvgImage.cs +++ b/Triangle.NET/TestApp/IO/SvgImage.cs @@ -10,7 +10,7 @@ namespace MeshExplorer.IO using System.IO; using System.Text; using TriangleNet; - using TriangleNet.Data; + using TriangleNet.Geometry; /// /// Writes a mesh to an SVG file. diff --git a/Triangle.NET/Triangle/Behavior.cs b/Triangle.NET/Triangle/Behavior.cs index cae622f..591e347 100644 --- a/Triangle.NET/Triangle/Behavior.cs +++ b/Triangle.NET/Triangle/Behavior.cs @@ -9,7 +9,7 @@ namespace TriangleNet { using System; using TriangleNet.Geometry; - using TriangleNet.Log; + using TriangleNet.Logging; /// /// Controls the behavior of the meshing software. @@ -72,7 +72,7 @@ namespace TriangleNet this.minAngle = 0; this.quality = false; - SimpleLog.Instance.Warning("Invalid quality option (minimum angle).", "Mesh.Behavior"); + Log.Instance.Warning("Invalid quality option (minimum angle).", "Mesh.Behavior"); } if ((this.maxAngle != 0.0) && this.maxAngle < 90 || this.maxAngle > 180) @@ -80,7 +80,7 @@ namespace TriangleNet this.maxAngle = 0; this.quality = false; - SimpleLog.Instance.Warning("Invalid quality option (maximum angle).", "Mesh.Behavior"); + Log.Instance.Warning("Invalid quality option (maximum angle).", "Mesh.Behavior"); } this.useSegments = this.Poly || this.Quality || this.Convex; @@ -106,11 +106,6 @@ namespace TriangleNet /// public static bool NoExact { get; set; } - /// - /// Log detailed information. - /// - public static bool Verbose { get; set; } - #endregion #region Public properties diff --git a/Triangle.NET/Triangle/Data/BadSubseg.cs b/Triangle.NET/Triangle/Data/BadSubseg.cs index bc0341b..9db815a 100644 --- a/Triangle.NET/Triangle/Data/BadSubseg.cs +++ b/Triangle.NET/Triangle/Data/BadSubseg.cs @@ -8,9 +8,7 @@ namespace TriangleNet.Data { using System; - using System.Collections.Generic; - using System.Linq; - using System.Text; + using TriangleNet.Geometry; /// /// A queue used to store encroached subsegments. @@ -21,25 +19,17 @@ namespace TriangleNet.Data /// class BadSubseg { - private static int hashSeed = 0; - internal int Hash; - - public Osub encsubseg; // An encroached subsegment. - public Vertex subsegorg, subsegdest; // Its two vertices. - - public BadSubseg() - { - this.Hash = hashSeed++; - } + public Osub subseg; // An encroached subsegment. + public Vertex org, dest; // Its two vertices. public override int GetHashCode() { - return this.Hash; + return subseg.seg.hash; } public override string ToString() { - return String.Format("B-SID {0}", encsubseg.seg.hash); + return String.Format("B-SID {0}", subseg.seg.hash); } - }; + } } diff --git a/Triangle.NET/Triangle/BadTriQueue.cs b/Triangle.NET/Triangle/Data/BadTriQueue.cs similarity index 91% rename from Triangle.NET/Triangle/BadTriQueue.cs rename to Triangle.NET/Triangle/Data/BadTriQueue.cs index f8c797d..91ce69e 100644 --- a/Triangle.NET/Triangle/BadTriQueue.cs +++ b/Triangle.NET/Triangle/Data/BadTriQueue.cs @@ -5,10 +5,9 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet +namespace TriangleNet.Data { - using System.Collections.Generic; - using TriangleNet.Data; + using TriangleNet.Geometry; /// /// A (priority) queue for bad triangles. @@ -20,7 +19,7 @@ namespace TriangleNet /// class BadTriQueue { - static readonly double SQRT2 = 1.4142135623730950488016887242096980785696718753769480732; + const double SQRT2 = 1.4142135623730950488016887242096980785696718753769480732; public int Count { get { return this.count; } } @@ -135,12 +134,12 @@ namespace TriangleNet else { // Add the bad triangle to the end of an already nonempty queue. - queuetail[queuenumber].nexttriang = badtri; + queuetail[queuenumber].next = badtri; } // Maintain a pointer to the last triangle of the queue. queuetail[queuenumber] = badtri; // Newly enqueued bad triangle has no successor in the queue. - badtri.nexttriang = null; + badtri.next = null; } /// @@ -158,9 +157,9 @@ namespace TriangleNet newbad.poortri = enqtri; newbad.key = minedge; - newbad.triangapex = enqapex; - newbad.triangorg = enqorg; - newbad.triangdest = enqdest; + newbad.apex = enqapex; + newbad.org = enqorg; + newbad.dest = enqdest; Enqueue(newbad); } @@ -182,7 +181,7 @@ namespace TriangleNet // Find the first triangle of the highest-priority queue. BadTriangle result = queuefront[firstnonemptyq]; // Remove the triangle from the queue. - queuefront[firstnonemptyq] = result.nexttriang; + queuefront[firstnonemptyq] = result.next; // If this queue is now empty, note the new highest-priority // nonempty queue. if (result == queuetail[firstnonemptyq]) diff --git a/Triangle.NET/Triangle/Data/BadTriangle.cs b/Triangle.NET/Triangle/Data/BadTriangle.cs index 95982c7..39e0ea8 100644 --- a/Triangle.NET/Triangle/Data/BadTriangle.cs +++ b/Triangle.NET/Triangle/Data/BadTriangle.cs @@ -8,9 +8,7 @@ namespace TriangleNet.Data { using System; - using System.Collections.Generic; - using System.Linq; - using System.Text; + using TriangleNet.Geometry; /// /// A queue used to store bad triangles. @@ -22,18 +20,11 @@ namespace TriangleNet.Data /// class BadTriangle { - public static int OTID = 0; - public int ID = 0; - public Otri poortri; // A skinny or too-large triangle. public double key; // cos^2 of smallest (apical) angle. - public Vertex triangorg, triangdest, triangapex; // Its three vertices. - public BadTriangle nexttriang; // Pointer to next bad triangle. + public Vertex org, dest, apex; // Its three vertices. + public BadTriangle next; // Pointer to next bad triangle. - public BadTriangle() - { - ID = OTID++; - } public override string ToString() { return String.Format("B-TID {0}", poortri.triangle.hash); diff --git a/Triangle.NET/Triangle/Data/Osub.cs b/Triangle.NET/Triangle/Data/Osub.cs index cdfc9ef..84f951f 100644 --- a/Triangle.NET/Triangle/Data/Osub.cs +++ b/Triangle.NET/Triangle/Data/Osub.cs @@ -8,9 +8,7 @@ namespace TriangleNet.Data { using System; - using System.Collections.Generic; - using System.Linq; - using System.Text; + using TriangleNet.Geometry; /// /// An oriented subsegment. diff --git a/Triangle.NET/Triangle/Data/Otri.cs b/Triangle.NET/Triangle/Data/Otri.cs index b42e252..eead6a1 100644 --- a/Triangle.NET/Triangle/Data/Otri.cs +++ b/Triangle.NET/Triangle/Data/Otri.cs @@ -8,9 +8,7 @@ namespace TriangleNet.Data { using System; - using System.Collections.Generic; - using System.Linq; - using System.Text; + using TriangleNet.Geometry; /// /// An oriented triangle. diff --git a/Triangle.NET/Triangle/Data/Segment.cs b/Triangle.NET/Triangle/Data/Segment.cs index 00190bb..67de461 100644 --- a/Triangle.NET/Triangle/Data/Segment.cs +++ b/Triangle.NET/Triangle/Data/Segment.cs @@ -8,9 +8,6 @@ namespace TriangleNet.Data { using System; - using System.Collections.Generic; - using System.Linq; - using System.Text; using TriangleNet.Geometry; /// diff --git a/Triangle.NET/Triangle/Geometry/ISegment.cs b/Triangle.NET/Triangle/Geometry/ISegment.cs index d982e07..1af96be 100644 --- a/Triangle.NET/Triangle/Geometry/ISegment.cs +++ b/Triangle.NET/Triangle/Geometry/ISegment.cs @@ -6,15 +6,11 @@ namespace TriangleNet.Geometry { - using TriangleNet.Data; - /// /// Interface for segment geometry. /// public interface ISegment : IEdge { - #region Public properties - /// /// Gets the segments endpoint. /// @@ -26,7 +22,5 @@ namespace TriangleNet.Geometry /// /// The triangle index (0 or 1). ITriangle GetTriangle(int index); - - #endregion } } diff --git a/Triangle.NET/Triangle/Geometry/Rectangle.cs b/Triangle.NET/Triangle/Geometry/Rectangle.cs index 8947b3b..5b90eea 100644 --- a/Triangle.NET/Triangle/Geometry/Rectangle.cs +++ b/Triangle.NET/Triangle/Geometry/Rectangle.cs @@ -20,8 +20,9 @@ namespace TriangleNet.Geometry /// Initializes a new instance of the class. /// public Rectangle() - : this(double.MaxValue, double.MaxValue, -double.MaxValue, -double.MaxValue) { + this.xmin = this.ymin = double.MaxValue; + this.xmax = this.ymax = -double.MaxValue; } public Rectangle(Rectangle other) @@ -109,8 +110,7 @@ namespace TriangleNet.Geometry /// /// Expand rectangle to include given point. /// - /// X coordinate. - /// Y coordinate. + /// Point. public void Expand(Point p) { xmin = Math.Min(xmin, p.x); @@ -153,12 +153,22 @@ namespace TriangleNet.Geometry return ((pt.x >= xmin) && (pt.x <= xmax) && (pt.y >= ymin) && (pt.y <= ymax)); } + /// + /// Check if given rectangle is inside bounding box. + /// + /// Rectangle to check. + /// Return true, if bounding box contains given rectangle. public bool Contains(Rectangle other) { return (xmin <= other.Left && other.Right <= xmax && ymin <= other.Bottom && other.Top <= ymax); } + /// + /// Check if given rectangle intersects bounding box. + /// + /// Rectangle to check. + /// Return true, if given rectangle intersects bounding box. public bool Intersects(Rectangle other) { return (other.Left < xmax && xmin < other.Right diff --git a/Triangle.NET/Triangle/Data/Vertex.cs b/Triangle.NET/Triangle/Geometry/Vertex.cs similarity index 92% rename from Triangle.NET/Triangle/Data/Vertex.cs rename to Triangle.NET/Triangle/Geometry/Vertex.cs index b09193c..d5b46a4 100644 --- a/Triangle.NET/Triangle/Data/Vertex.cs +++ b/Triangle.NET/Triangle/Geometry/Vertex.cs @@ -5,13 +5,10 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet.Data +namespace TriangleNet.Geometry { using System; - using System.Collections.Generic; - using System.Linq; - using System.Text; - using TriangleNet.Geometry; + using TriangleNet.Data; /// /// The vertex data structure. diff --git a/Triangle.NET/Triangle/IO/TriangleReader.cs b/Triangle.NET/Triangle/IO/TriangleReader.cs index 142dfa3..01e38fd 100644 --- a/Triangle.NET/Triangle/IO/TriangleReader.cs +++ b/Triangle.NET/Triangle/IO/TriangleReader.cs @@ -11,7 +11,7 @@ namespace TriangleNet.IO using System.IO; using System.Globalization; using TriangleNet.Data; - using TriangleNet.Log; + using TriangleNet.Logging; using TriangleNet.Geometry; using System.Collections.Generic; @@ -385,17 +385,17 @@ namespace TriangleNet.IO if ((end1 < 0) || (end1 >= invertices)) { - if (Behavior.Verbose) + if (Log.Verbose) { - SimpleLog.Instance.Warning("Invalid first endpoint of segment.", + Log.Instance.Warning("Invalid first endpoint of segment.", "MeshReader.ReadPolyfile()"); } } else if ((end2 < 0) || (end2 >= invertices)) { - if (Behavior.Verbose) + if (Log.Verbose) { - SimpleLog.Instance.Warning("Invalid second endpoint of segment.", + Log.Instance.Warning("Invalid second endpoint of segment.", "MeshReader.ReadPolyfile()"); } } @@ -521,7 +521,7 @@ namespace TriangleNet.IO if (attributes > 1) { - SimpleLog.Instance.Warning("Triangle attributes not supported.", "FileReader.Read"); + Log.Instance.Warning("Triangle attributes not supported.", "FileReader.Read"); } triangles = new List(intriangles); @@ -593,7 +593,7 @@ namespace TriangleNet.IO if (int.Parse(line[0]) != intriangles) { - SimpleLog.Instance.Warning("Number of area constraints doesn't match number of triangles.", + Log.Instance.Warning("Number of area constraints doesn't match number of triangles.", "ReadAreaFile()"); return null; } @@ -684,17 +684,17 @@ namespace TriangleNet.IO if ((end1 < 0) || (end1 >= invertices)) { - if (Behavior.Verbose) + if (Log.Verbose) { - SimpleLog.Instance.Warning("Invalid first endpoint of segment.", + Log.Instance.Warning("Invalid first endpoint of segment.", "MeshReader.ReadPolyfile()"); } } else if ((end2 < 0) || (end2 >= invertices)) { - if (Behavior.Verbose) + if (Log.Verbose) { - SimpleLog.Instance.Warning("Invalid second endpoint of segment.", + Log.Instance.Warning("Invalid second endpoint of segment.", "MeshReader.ReadPolyfile()"); } } diff --git a/Triangle.NET/Triangle/IO/TriangleWriter.cs b/Triangle.NET/Triangle/IO/TriangleWriter.cs index 29e0a20..473d390 100644 --- a/Triangle.NET/Triangle/IO/TriangleWriter.cs +++ b/Triangle.NET/Triangle/IO/TriangleWriter.cs @@ -485,7 +485,7 @@ namespace TriangleNet.IO torg = tri.Org(); tdest = tri.Dest(); tapex = tri.Apex(); - circumcenter = Primitives.FindCircumcenter(torg, tdest, tapex, ref xi, ref eta); + circumcenter = RobustPredicates.FindCircumcenter(torg, tdest, tapex, ref xi, ref eta); // X and y coordinates. writer.Write("{0} {1} {2}", index, circumcenter.X.ToString(nfi), diff --git a/Triangle.NET/Triangle/Log/SimpleLog.cs b/Triangle.NET/Triangle/Log.cs similarity index 63% rename from Triangle.NET/Triangle/Log/SimpleLog.cs rename to Triangle.NET/Triangle/Log.cs index 8f05bdc..41b2580 100644 --- a/Triangle.NET/Triangle/Log/SimpleLog.cs +++ b/Triangle.NET/Triangle/Log.cs @@ -4,12 +4,10 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet.Log +namespace TriangleNet { - using System; using System.Collections.Generic; - using System.Linq; - using System.Text; + using TriangleNet.Logging; /// /// A simple logger, which logs messages to a List. @@ -17,23 +15,28 @@ namespace TriangleNet.Log /// Using singleton pattern as proposed by Jon Skeet. /// http://csharpindepth.com/Articles/General/Singleton.aspx /// - public sealed class SimpleLog : ILog + public sealed class Log : ILog { - private List log = new List(); + /// + /// Log detailed information. + /// + public static bool Verbose { get; set; } + + private List log = new List(); private LogLevel level = LogLevel.Info; #region Singleton pattern - private static readonly SimpleLog instance = new SimpleLog(); + private static readonly Log instance = new Log(); // Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit - static SimpleLog() { } + static Log() { } - private SimpleLog() { } + private Log() { } - public static ILog Instance + public static ILog Instance { get { @@ -43,7 +46,7 @@ namespace TriangleNet.Log #endregion - public void Add(SimpleLogItem item) + public void Add(LogItem item) { log.Add(item); } @@ -55,20 +58,20 @@ namespace TriangleNet.Log public void Info(string message) { - log.Add(new SimpleLogItem(LogLevel.Info, message)); + log.Add(new LogItem(LogLevel.Info, message)); } public void Warning(string message, string location) { - log.Add(new SimpleLogItem(LogLevel.Warning, message, location)); + log.Add(new LogItem(LogLevel.Warning, message, location)); } public void Error(string message, string location) { - log.Add(new SimpleLogItem(LogLevel.Error, message, location)); + log.Add(new LogItem(LogLevel.Error, message, location)); } - public IList Data + public IList Data { get { return log; } } diff --git a/Triangle.NET/Triangle/Log/ILog.cs b/Triangle.NET/Triangle/Logging/ILog.cs similarity index 86% rename from Triangle.NET/Triangle/Log/ILog.cs rename to Triangle.NET/Triangle/Logging/ILog.cs index 9111b6d..f0184a9 100644 --- a/Triangle.NET/Triangle/Log/ILog.cs +++ b/Triangle.NET/Triangle/Logging/ILog.cs @@ -4,12 +4,9 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet.Log +namespace TriangleNet.Logging { - using System; using System.Collections.Generic; - using System.Linq; - using System.Text; public enum LogLevel { diff --git a/Triangle.NET/Triangle/Log/ILogItem.cs b/Triangle.NET/Triangle/Logging/ILogItem.cs similarity index 80% rename from Triangle.NET/Triangle/Log/ILogItem.cs rename to Triangle.NET/Triangle/Logging/ILogItem.cs index 4581ddd..7ed0761 100644 --- a/Triangle.NET/Triangle/Log/ILogItem.cs +++ b/Triangle.NET/Triangle/Logging/ILogItem.cs @@ -4,12 +4,9 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet.Log +namespace TriangleNet.Logging { using System; - using System.Collections.Generic; - using System.Linq; - using System.Text; /// /// A basic log item interface. diff --git a/Triangle.NET/Triangle/Log/SimpleLogItem.cs b/Triangle.NET/Triangle/Logging/LogItem.cs similarity index 75% rename from Triangle.NET/Triangle/Log/SimpleLogItem.cs rename to Triangle.NET/Triangle/Logging/LogItem.cs index c344b86..1be74bc 100644 --- a/Triangle.NET/Triangle/Log/SimpleLogItem.cs +++ b/Triangle.NET/Triangle/Logging/LogItem.cs @@ -4,17 +4,14 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet.Log +namespace TriangleNet.Logging { using System; - using System.Collections.Generic; - using System.Linq; - using System.Text; /// /// Represents an item stored in the log. /// - public class SimpleLogItem : ILogItem + public class LogItem : ILogItem { DateTime time; LogLevel level; @@ -41,11 +38,11 @@ namespace TriangleNet.Log get { return info; } } - public SimpleLogItem(LogLevel level, string message) + public LogItem(LogLevel level, string message) : this(level, message, "") { } - public SimpleLogItem(LogLevel level, string message, string info) + public LogItem(LogLevel level, string message, string info) { this.time = DateTime.Now; this.level = level; diff --git a/Triangle.NET/Triangle/Mesh.cs b/Triangle.NET/Triangle/Mesh.cs index d784b84..0fd647e 100644 --- a/Triangle.NET/Triangle/Mesh.cs +++ b/Triangle.NET/Triangle/Mesh.cs @@ -11,7 +11,7 @@ namespace TriangleNet using System.Collections.Generic; using System.Linq; using TriangleNet.Data; - using TriangleNet.Log; + using TriangleNet.Logging; using TriangleNet.IO; using TriangleNet.Meshing; using TriangleNet.Meshing.Algorithm; @@ -26,7 +26,7 @@ namespace TriangleNet { #region Variables - ILog logger; + ILog logger; QualityMesher quality; @@ -188,7 +188,7 @@ namespace TriangleNet { this.behavior = behavior; - logger = SimpleLog.Instance; + logger = Log.Instance; behavior = new Behavior(); @@ -205,7 +205,7 @@ namespace TriangleNet locator = new TriangleLocator(this); - Primitives.ExactInit(); + RobustPredicates.ExactInit(); if (dummytri == null) { @@ -858,9 +858,9 @@ namespace TriangleNet { // Add the subsegment to the list of encroached subsegments. encroached = new BadSubseg(); - encroached.encsubseg = brokensubseg; - encroached.subsegorg = brokensubseg.Org(); - encroached.subsegdest = brokensubseg.Dest(); + encroached.subseg = brokensubseg; + encroached.org = brokensubseg.Org(); + encroached.dest = brokensubseg.Dest(); quality.AddBadSubseg(encroached); } @@ -1133,7 +1133,7 @@ namespace TriangleNet // the boundary of the triangulation. 'farvertex' might be // infinite as well, but trust me, this same condition should // be applied. - doflip = Primitives.CounterClockwise(newvertex, rightvertex, farvertex) > 0.0; + doflip = RobustPredicates.CounterClockwise(newvertex, rightvertex, farvertex) > 0.0; } else if ((rightvertex == infvertex1) || (rightvertex == infvertex2) || @@ -1143,7 +1143,7 @@ namespace TriangleNet // the boundary of the triangulation. 'farvertex' might be // infinite as well, but trust me, this same condition should // be applied. - doflip = Primitives.CounterClockwise(farvertex, leftvertex, newvertex) > 0.0; + doflip = RobustPredicates.CounterClockwise(farvertex, leftvertex, newvertex) > 0.0; } else if ((farvertex == infvertex1) || (farvertex == infvertex2) || @@ -1156,7 +1156,7 @@ namespace TriangleNet else { // Test whether the edge is locally Delaunay. - doflip = Primitives.InCircle(leftvertex, newvertex, rightvertex, farvertex) > 0.0; + doflip = RobustPredicates.InCircle(leftvertex, newvertex, rightvertex, farvertex) > 0.0; } if (doflip) { @@ -1686,7 +1686,7 @@ namespace TriangleNet testtri.OnextSelf(); testvertex = testtri.Dest(); // Is this a better vertex? - if (Primitives.InCircle(leftbasevertex, rightbasevertex, bestvertex, testvertex) > 0.0) + if (RobustPredicates.InCircle(leftbasevertex, rightbasevertex, bestvertex, testvertex) > 0.0) { testtri.Copy(ref besttri); bestvertex = testvertex; diff --git a/Triangle.NET/Triangle/MeshValidator.cs b/Triangle.NET/Triangle/MeshValidator.cs index ebf8408..e1a7903 100644 --- a/Triangle.NET/Triangle/MeshValidator.cs +++ b/Triangle.NET/Triangle/MeshValidator.cs @@ -9,7 +9,7 @@ namespace TriangleNet { using System; using TriangleNet.Data; - using TriangleNet.Log; + using TriangleNet.Geometry; public static class MeshValidator { @@ -25,7 +25,7 @@ namespace TriangleNet int horrors; bool saveexact; - var logger = SimpleLog.Instance; + var logger = Log.Instance; // Temporarily turn on exact arithmetic if it's off. saveexact = Behavior.NoExact; @@ -47,11 +47,11 @@ namespace TriangleNet // Only test for inversion once. // Test if the triangle is flat or inverted. triapex = tri.Apex(); - if (Primitives.CounterClockwise(triorg, tridest, triapex) <= 0.0) + if (RobustPredicates.CounterClockwise(triorg, tridest, triapex) <= 0.0) { - if (Behavior.Verbose) + if (Log.Verbose) { - logger.Warning("Triangle is flat or inverted.", "Quality.CheckMesh()"); + logger.Warning("Triangle is flat or inverted.", "MeshValidator.IsConsistent()"); } horrors++; @@ -66,10 +66,10 @@ namespace TriangleNet oppotri.Sym(ref oppooppotri); if ((tri.triangle != oppooppotri.triangle) || (tri.orient != oppooppotri.orient)) { - if (tri.triangle == oppooppotri.triangle && Behavior.Verbose) + if (tri.triangle == oppooppotri.triangle && Log.Verbose) { logger.Warning("Asymmetric triangle-triangle bond: (Right triangle, wrong orientation)", - "Quality.CheckMesh()"); + "MeshValidator.IsConsistent()"); } horrors++; @@ -80,10 +80,10 @@ namespace TriangleNet oppodest = oppotri.Dest(); if ((triorg != oppodest) || (tridest != oppoorg)) { - if (Behavior.Verbose) + if (Log.Verbose) { logger.Warning("Mismatched edge coordinates between two triangles.", - "Quality.CheckMesh()"); + "MeshValidator.IsConsistent()"); } horrors++; @@ -96,10 +96,10 @@ namespace TriangleNet mesh.MakeVertexMap(); foreach (var v in mesh.vertices.Values) { - if (v.tri.triangle == null && Behavior.Verbose) + if (v.tri.triangle == null && Log.Verbose) { logger.Warning("Vertex (ID " + v.id + ") not connected to mesh (duplicate input vertex?)", - "Quality.CheckMesh()"); + "MeshValidator.IsConsistent()"); } } @@ -140,7 +140,7 @@ namespace TriangleNet int horrors; bool saveexact; - var logger = SimpleLog.Instance; + var logger = Log.Instance; // Temporarily turn on exact arithmetic if it's off. saveexact = Behavior.NoExact; @@ -190,12 +190,12 @@ namespace TriangleNet if (shouldbedelaunay) { - if (Primitives.NonRegular(org, dest, apex, oppoapex) > 0.0) + if (RobustPredicates.NonRegular(org, dest, apex, oppoapex) > 0.0) { - if (Behavior.Verbose) + if (Log.Verbose) { logger.Warning(String.Format("Non-regular pair of triangles found (IDs {0}/{1}).", - loop.triangle.id, oppotri.triangle.id), "Quality.CheckDelaunay()"); + loop.triangle.id, oppotri.triangle.id), "MeshValidator.IsDelaunay()"); } horrors++; diff --git a/Triangle.NET/Triangle/Meshing/Algorithm/Dwyer.cs b/Triangle.NET/Triangle/Meshing/Algorithm/Dwyer.cs index 7525772..c481a41 100644 --- a/Triangle.NET/Triangle/Meshing/Algorithm/Dwyer.cs +++ b/Triangle.NET/Triangle/Meshing/Algorithm/Dwyer.cs @@ -9,7 +9,8 @@ namespace TriangleNet.Meshing.Algorithm { using System; using TriangleNet.Data; - using TriangleNet.Log; + using TriangleNet.Geometry; + using TriangleNet.Logging; /// /// Builds a delaunay triangulation using the divide-and-conquer algorithm. @@ -45,7 +46,8 @@ namespace TriangleNet.Meshing.Algorithm class Dwyer { static Random rand = new Random(DateTime.Now.Millisecond); - bool useDwyer = true; + + public bool UseDwyer = true; Vertex[] sortarray; Mesh mesh; @@ -314,7 +316,7 @@ namespace TriangleNet.Meshing.Algorithm innerrightorg = innerright.Org(); innerrightapex = innerright.Apex(); // Special treatment for horizontal cuts. - if (useDwyer && (axis == 1)) + if (UseDwyer && (axis == 1)) { farleftpt = farleft.Org(); farleftapex = farleft.Apex(); @@ -363,7 +365,7 @@ namespace TriangleNet.Meshing.Algorithm { changemade = false; // Make innerleftdest the "bottommost" vertex of the left hull. - if (Primitives.CounterClockwise(innerleftdest, innerleftapex, innerrightorg) > 0.0) + if (RobustPredicates.CounterClockwise(innerleftdest, innerleftapex, innerrightorg) > 0.0) { innerleft.LprevSelf(); innerleft.SymSelf(); @@ -372,7 +374,7 @@ namespace TriangleNet.Meshing.Algorithm changemade = true; } // Make innerrightorg the "bottommost" vertex of the right hull. - if (Primitives.CounterClockwise(innerrightapex, innerrightorg, innerleftdest) > 0.0) + if (RobustPredicates.CounterClockwise(innerrightapex, innerrightorg, innerleftdest) > 0.0) { innerright.LnextSelf(); innerright.SymSelf(); @@ -420,8 +422,8 @@ namespace TriangleNet.Meshing.Algorithm // because even though the left triangulation might seem finished now, // moving up on the right triangulation might reveal a new vertex of // the left triangulation. And vice-versa.) - leftfinished = Primitives.CounterClockwise(upperleft, lowerleft, lowerright) <= 0.0; - rightfinished = Primitives.CounterClockwise(upperright, lowerleft, lowerright) <= 0.0; + leftfinished = RobustPredicates.CounterClockwise(upperleft, lowerleft, lowerright) <= 0.0; + rightfinished = RobustPredicates.CounterClockwise(upperright, lowerleft, lowerright) <= 0.0; if (leftfinished && rightfinished) { // Create the top new bounding triangle. @@ -437,7 +439,7 @@ namespace TriangleNet.Meshing.Algorithm nextedge.Bond(ref leftcand); // Special treatment for horizontal cuts. - if (useDwyer && (axis == 1)) + if (UseDwyer && (axis == 1)) { farleftpt = farleft.Org(); farleftapex = farleft.Apex(); @@ -478,7 +480,7 @@ namespace TriangleNet.Meshing.Algorithm if (nextapex != null) { // Check whether the edge is Delaunay. - badedge = Primitives.InCircle(lowerleft, lowerright, upperleft, nextapex) > 0.0; + badedge = RobustPredicates.InCircle(lowerleft, lowerright, upperleft, nextapex) > 0.0; while (badedge) { // Eliminate the edge with an edge flip. As a result, the @@ -508,7 +510,7 @@ namespace TriangleNet.Meshing.Algorithm if (nextapex != null) { // Check whether the edge is Delaunay. - badedge = Primitives.InCircle(lowerleft, lowerright, upperleft, nextapex) > 0.0; + badedge = RobustPredicates.InCircle(lowerleft, lowerright, upperleft, nextapex) > 0.0; } else { @@ -530,7 +532,7 @@ namespace TriangleNet.Meshing.Algorithm if (nextapex != null) { // Check whether the edge is Delaunay. - badedge = Primitives.InCircle(lowerleft, lowerright, upperright, nextapex) > 0.0; + badedge = RobustPredicates.InCircle(lowerleft, lowerright, upperright, nextapex) > 0.0; while (badedge) { // Eliminate the edge with an edge flip. As a result, the @@ -560,7 +562,7 @@ namespace TriangleNet.Meshing.Algorithm if (nextapex != null) { // Check whether the edge is Delaunay. - badedge = Primitives.InCircle(lowerleft, lowerright, upperright, nextapex) > 0.0; + badedge = RobustPredicates.InCircle(lowerleft, lowerright, upperright, nextapex) > 0.0; } else { @@ -571,7 +573,7 @@ namespace TriangleNet.Meshing.Algorithm } } if (leftfinished || (!rightfinished && - (Primitives.InCircle(upperleft, lowerleft, lowerright, upperright) > 0.0))) + (RobustPredicates.InCircle(upperleft, lowerleft, lowerright, upperright) > 0.0))) { // Knit the triangulations, adding an edge from 'lowerleft' // to 'upperright'. @@ -660,7 +662,7 @@ namespace TriangleNet.Meshing.Algorithm mesh.MakeTriangle(ref tri1); mesh.MakeTriangle(ref tri2); mesh.MakeTriangle(ref tri3); - area = Primitives.CounterClockwise(sortarray[left], sortarray[left + 1], sortarray[left + 2]); + area = RobustPredicates.CounterClockwise(sortarray[left], sortarray[left + 1], sortarray[left + 2]); if (area == 0.0) { // Three collinear vertices; the triangulation is two edges. @@ -858,9 +860,9 @@ namespace TriangleNet.Meshing.Algorithm if ((sortarray[i].x == sortarray[j].x) && (sortarray[i].y == sortarray[j].y)) { - if (Behavior.Verbose) + if (Log.Verbose) { - SimpleLog.Instance.Warning( + Log.Instance.Warning( String.Format("A duplicate vertex appeared and was ignored (ID {0}).", sortarray[j].hash), "DivConquer.DivconqDelaunay()"); } @@ -874,7 +876,7 @@ namespace TriangleNet.Meshing.Algorithm } } i++; - if (useDwyer) + if (UseDwyer) { // Re-sort the array of vertices to accommodate alternating cuts. divider = i >> 1; diff --git a/Triangle.NET/Triangle/Meshing/Algorithm/Incremental.cs b/Triangle.NET/Triangle/Meshing/Algorithm/Incremental.cs index d5056aa..b7e08e2 100644 --- a/Triangle.NET/Triangle/Meshing/Algorithm/Incremental.cs +++ b/Triangle.NET/Triangle/Meshing/Algorithm/Incremental.cs @@ -8,7 +8,7 @@ namespace TriangleNet.Meshing.Algorithm { using TriangleNet.Data; - using TriangleNet.Log; + using TriangleNet.Logging; using TriangleNet.Geometry; /// @@ -165,9 +165,9 @@ namespace TriangleNet.Meshing.Algorithm Osub tmp = default(Osub); if (mesh.InsertVertex(v, ref starttri, ref tmp, false, false) == InsertVertexResult.Duplicate) { - if (Behavior.Verbose) + if (Log.Verbose) { - SimpleLog.Instance.Warning("A duplicate vertex appeared and was ignored.", + Log.Instance.Warning("A duplicate vertex appeared and was ignored.", "Incremental.IncrementalDelaunay()"); } v.type = VertexType.UndeadVertex; diff --git a/Triangle.NET/Triangle/Meshing/Algorithm/SweepLine.cs b/Triangle.NET/Triangle/Meshing/Algorithm/SweepLine.cs index 9bef669..48535c5 100644 --- a/Triangle.NET/Triangle/Meshing/Algorithm/SweepLine.cs +++ b/Triangle.NET/Triangle/Meshing/Algorithm/SweepLine.cs @@ -11,7 +11,7 @@ namespace TriangleNet.Meshing.Algorithm using System.Collections.Generic; using TriangleNet.Data; using TriangleNet.Geometry; - using TriangleNet.Log; + using TriangleNet.Logging; using TriangleNet.Tools; /// @@ -381,7 +381,7 @@ namespace TriangleNet.Meshing.Algorithm Point searchpoint = new Point(); // TODO: mesh.nextras Otri dummytri = default(Otri); - ccwabc = Primitives.CounterClockwise(pa, pb, pc); + ccwabc = RobustPredicates.CounterClockwise(pa, pb, pc); xac = pa.x - pc.x; yac = pa.y - pc.y; xbc = pb.x - pc.x; @@ -571,7 +571,7 @@ namespace TriangleNet.Meshing.Algorithm { if (heapsize == 0) { - SimpleLog.Instance.Error("Input vertices are all identical.", "SweepLine.Triangulate()"); + Log.Instance.Error("Input vertices are all identical.", "SweepLine.Triangulate()"); throw new Exception("Input vertices are all identical."); } secondvertex = eventheap[0].vertexEvent; @@ -580,9 +580,9 @@ namespace TriangleNet.Meshing.Algorithm if ((firstvertex.x == secondvertex.x) && (firstvertex.y == secondvertex.y)) { - if (Behavior.Verbose) + if (Log.Verbose) { - SimpleLog.Instance.Warning("A duplicate vertex appeared and was ignored (ID " + secondvertex.id + ").", + Log.Instance.Warning("A duplicate vertex appeared and was ignored (ID " + secondvertex.id + ").", "SweepLine.Triangulate().1"); } secondvertex.type = VertexType.UndeadVertex; @@ -636,9 +636,9 @@ namespace TriangleNet.Meshing.Algorithm if ((nextvertex.x == lastvertex.x) && (nextvertex.y == lastvertex.y)) { - if (Behavior.Verbose) + if (Log.Verbose) { - SimpleLog.Instance.Warning("A duplicate vertex appeared and was ignored (ID " + nextvertex.id + ").", + Log.Instance.Warning("A duplicate vertex appeared and was ignored (ID " + nextvertex.id + ").", "SweepLine.Triangulate().2"); } nextvertex.type = VertexType.UndeadVertex; @@ -700,7 +700,7 @@ namespace TriangleNet.Meshing.Algorithm leftvertex = farlefttri.Apex(); midvertex = lefttri.Dest(); rightvertex = lefttri.Apex(); - lefttest = Primitives.CounterClockwise(leftvertex, midvertex, rightvertex); + lefttest = RobustPredicates.CounterClockwise(leftvertex, midvertex, rightvertex); if (lefttest > 0.0) { newevent = new SweepEvent(); @@ -715,7 +715,7 @@ namespace TriangleNet.Meshing.Algorithm leftvertex = righttri.Apex(); midvertex = righttri.Org(); rightvertex = farrighttri.Apex(); - righttest = Primitives.CounterClockwise(leftvertex, midvertex, rightvertex); + righttest = RobustPredicates.CounterClockwise(leftvertex, midvertex, rightvertex); if (righttest > 0.0) { newevent = new SweepEvent(); diff --git a/Triangle.NET/Triangle/Meshing/ConstraintMesher.cs b/Triangle.NET/Triangle/Meshing/ConstraintMesher.cs index 82f08f7..c7c15f0 100644 --- a/Triangle.NET/Triangle/Meshing/ConstraintMesher.cs +++ b/Triangle.NET/Triangle/Meshing/ConstraintMesher.cs @@ -11,7 +11,7 @@ namespace TriangleNet.Meshing using System.Collections.Generic; using TriangleNet.Data; using TriangleNet.Geometry; - using TriangleNet.Log; + using TriangleNet.Logging; using TriangleNet.Tools; internal class ConstraintMesher @@ -22,7 +22,7 @@ namespace TriangleNet.Meshing List viri; - ILog logger; + ILog logger; public ConstraintMesher(Mesh mesh) { @@ -32,7 +32,7 @@ namespace TriangleNet.Meshing this.viri = new List(); - logger = SimpleLog.Instance; + logger = Log.Instance; } /// @@ -72,7 +72,7 @@ namespace TriangleNet.Meshing // falls within the starting triangle. searchorg = searchtri.Org(); searchdest = searchtri.Dest(); - if (Primitives.CounterClockwise(searchorg, searchdest, hole) > 0.0) + if (RobustPredicates.CounterClockwise(searchorg, searchdest, hole) > 0.0) { // Find a triangle that contains the hole. intersect = mesh.locator.Locate(hole, ref searchtri); @@ -114,7 +114,7 @@ namespace TriangleNet.Meshing // region point falls within the starting triangle. searchorg = searchtri.Org(); searchdest = searchtri.Dest(); - if (Primitives.CounterClockwise(searchorg, searchdest, region.point) > 0.0) + if (RobustPredicates.CounterClockwise(searchorg, searchdest, region.point) > 0.0) { // Find a triangle that contains the region point. intersect = mesh.locator.Locate(region.point, ref searchtri); @@ -202,14 +202,14 @@ namespace TriangleNet.Meshing if ((end1 < 0) || (end1 >= mesh.invertices)) { - if (Behavior.Verbose) + if (Log.Verbose) { logger.Warning("Invalid first endpoint of segment.", "Mesh.FormSkeleton().1"); } } else if ((end2 < 0) || (end2 >= mesh.invertices)) { - if (Behavior.Verbose) + if (Log.Verbose) { logger.Warning("Invalid second endpoint of segment.", "Mesh.FormSkeleton().2"); } @@ -224,7 +224,7 @@ namespace TriangleNet.Meshing endpoint2 = mesh.vertices[end2]; if ((endpoint1.x == endpoint2.x) && (endpoint1.y == endpoint2.y)) { - if (Behavior.Verbose) + if (Log.Verbose) { logger.Warning("Endpoints of segment (IDs " + end1 + "/" + end2 + ") are coincident.", "Mesh.FormSkeleton()"); @@ -544,10 +544,10 @@ namespace TriangleNet.Meshing rightvertex = searchtri.Dest(); leftvertex = searchtri.Apex(); // Is 'searchpoint' to the left? - leftccw = Primitives.CounterClockwise(searchpoint, startvertex, leftvertex); + leftccw = RobustPredicates.CounterClockwise(searchpoint, startvertex, leftvertex); leftflag = leftccw > 0.0; // Is 'searchpoint' to the right? - rightccw = Primitives.CounterClockwise(startvertex, searchpoint, rightvertex); + rightccw = RobustPredicates.CounterClockwise(startvertex, searchpoint, rightvertex); rightflag = rightccw > 0.0; if (leftflag && rightflag) { @@ -574,7 +574,7 @@ namespace TriangleNet.Meshing } leftvertex = searchtri.Apex(); rightccw = leftccw; - leftccw = Primitives.CounterClockwise(searchpoint, startvertex, leftvertex); + leftccw = RobustPredicates.CounterClockwise(searchpoint, startvertex, leftvertex); leftflag = leftccw > 0.0; } while (rightflag) @@ -588,7 +588,7 @@ namespace TriangleNet.Meshing } rightvertex = searchtri.Dest(); leftccw = rightccw; - rightccw = Primitives.CounterClockwise(startvertex, searchpoint, rightvertex); + rightccw = RobustPredicates.CounterClockwise(startvertex, searchpoint, rightvertex); rightflag = rightccw > 0.0; } if (leftccw == 0.0) @@ -867,7 +867,7 @@ namespace TriangleNet.Meshing // Check whether the previous polygon vertex is a reflex vertex. if (leftside) { - if (Primitives.CounterClockwise(nearvertex, leftvertex, farvertex) <= 0.0) + if (RobustPredicates.CounterClockwise(nearvertex, leftvertex, farvertex) <= 0.0) { // leftvertex is a reflex vertex too. Nothing can // be done until a convex section is found. @@ -876,20 +876,20 @@ namespace TriangleNet.Meshing } else { - if (Primitives.CounterClockwise(farvertex, rightvertex, nearvertex) <= 0.0) + if (RobustPredicates.CounterClockwise(farvertex, rightvertex, nearvertex) <= 0.0) { // rightvertex is a reflex vertex too. Nothing can // be done until a convex section is found. return; } } - if (Primitives.CounterClockwise(rightvertex, leftvertex, farvertex) > 0.0) + if (RobustPredicates.CounterClockwise(rightvertex, leftvertex, farvertex) > 0.0) { // fartri is not an inverted triangle, and farvertex is not a reflex // vertex. As there are no reflex vertices, fixuptri isn't an // inverted triangle, either. Hence, test the edge between the // triangles to ensure it is locally Delaunay. - if (Primitives.InCircle(leftvertex, farvertex, rightvertex, nearvertex) <= 0.0) + if (RobustPredicates.InCircle(leftvertex, farvertex, rightvertex, nearvertex) <= 0.0) { return; } @@ -991,7 +991,7 @@ namespace TriangleNet.Meshing { // Check whether farvertex is to the left or right of the segment being // inserted, to decide which edge of fixuptri to dig through next. - area = Primitives.CounterClockwise(endpoint1, endpoint2, farvertex); + area = RobustPredicates.CounterClockwise(endpoint1, endpoint2, farvertex); if (area == 0.0) { // We've collided with a vertex between endpoint1 and endpoint2. diff --git a/Triangle.NET/Triangle/Meshing/ConstraintOptions.cs b/Triangle.NET/Triangle/Meshing/ConstraintOptions.cs index 7753270..1180409 100644 --- a/Triangle.NET/Triangle/Meshing/ConstraintOptions.cs +++ b/Triangle.NET/Triangle/Meshing/ConstraintOptions.cs @@ -26,6 +26,16 @@ namespace TriangleNet.Meshing /// public bool Convex { get; set; } + /// + /// Suppresses boundary segment splitting. + /// + /// + /// 0 = split segments (default) + /// 1 = no new vertices on the boundary + /// 2 = prevent all segment splitting, including internal boundaries + /// + public int SegmentSplitting { get; set; } + #endregion } } diff --git a/Triangle.NET/Triangle/Meshing/Converter.cs b/Triangle.NET/Triangle/Meshing/Converter.cs index e0a36d6..d9cb0f1 100644 --- a/Triangle.NET/Triangle/Meshing/Converter.cs +++ b/Triangle.NET/Triangle/Meshing/Converter.cs @@ -12,7 +12,7 @@ namespace TriangleNet.Meshing using System.Linq; using TriangleNet.Data; using TriangleNet.Geometry; - using TriangleNet.Log; + using TriangleNet.Logging; /// /// The DataReader class provides methods for mesh reconstruction. @@ -140,7 +140,7 @@ namespace TriangleNet.Meshing { if ((corner[j] < 0) || (corner[j] >= mesh.invertices)) { - SimpleLog.Instance.Error("Triangle has an invalid vertex index.", "MeshReader.Reconstruct()"); + Log.Instance.Error("Triangle has an invalid vertex index.", "MeshReader.Reconstruct()"); throw new Exception("Triangle has an invalid vertex index."); } } @@ -250,7 +250,7 @@ namespace TriangleNet.Meshing { if ((end[j] < 0) || (end[j] >= mesh.invertices)) { - SimpleLog.Instance.Error("Segment has an invalid vertex index.", "MeshReader.Reconstruct()"); + Log.Instance.Error("Segment has an invalid vertex index.", "MeshReader.Reconstruct()"); throw new Exception("Segment has an invalid vertex index."); } } diff --git a/Triangle.NET/Triangle/Meshing/ITriangulator.cs b/Triangle.NET/Triangle/Meshing/ITriangulator.cs index 5f42e61..c66aa35 100644 --- a/Triangle.NET/Triangle/Meshing/ITriangulator.cs +++ b/Triangle.NET/Triangle/Meshing/ITriangulator.cs @@ -6,16 +6,14 @@ namespace TriangleNet.Meshing { - using System; using System.Collections.Generic; - using System.Linq; - using System.Text; + using TriangleNet.Geometry; /// /// TODO: Update summary. /// public interface ITriangulator { - int Triangulate(Mesh mesh); + Mesh Triangulate(ICollection points); } } diff --git a/Triangle.NET/Triangle/Meshing/QualityMesher.cs b/Triangle.NET/Triangle/Meshing/QualityMesher.cs index f4f6ae1..2eca40d 100644 --- a/Triangle.NET/Triangle/Meshing/QualityMesher.cs +++ b/Triangle.NET/Triangle/Meshing/QualityMesher.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/ // @@ -10,8 +10,8 @@ namespace TriangleNet.Meshing using System; using System.Collections.Generic; using TriangleNet.Data; - using TriangleNet.Log; using TriangleNet.Geometry; + using TriangleNet.Logging; /// /// Provides methods for mesh quality enforcement and testing. @@ -25,11 +25,11 @@ namespace TriangleNet.Meshing NewLocation newLocation; - ILog logger; + ILog logger; public QualityMesher(Mesh mesh) { - logger = SimpleLog.Instance; + logger = Log.Instance; badsubsegs = new Queue(); queue = new BadTriQueue(); @@ -150,15 +150,15 @@ namespace TriangleNet.Meshing encroachedseg = new BadSubseg(); if (encroached == 1) { - encroachedseg.encsubseg = testsubseg; - encroachedseg.subsegorg = eorg; - encroachedseg.subsegdest = edest; + encroachedseg.subseg = testsubseg; + encroachedseg.org = eorg; + encroachedseg.dest = edest; } else { - encroachedseg.encsubseg = testsym; - encroachedseg.subsegorg = edest; - encroachedseg.subsegdest = eorg; + encroachedseg.subseg = testsym; + encroachedseg.org = edest; + encroachedseg.dest = eorg; } badsubsegs.Enqueue(encroachedseg); @@ -430,14 +430,14 @@ namespace TriangleNet.Meshing seg = badsubsegs.Dequeue(); - currentenc = seg.encsubseg; + currentenc = seg.subseg; eorg = currentenc.Org(); edest = currentenc.Dest(); // Make sure that this segment is still the same segment it was // when it was determined to be encroached. If the segment was // enqueued multiple times (because several newly inserted // vertices encroached it), it may have already been split. - if (!Osub.IsDead(currentenc.seg) && (eorg == seg.subsegorg) && (edest == seg.subsegdest)) + if (!Osub.IsDead(currentenc.seg) && (eorg == seg.org) && (edest == seg.dest)) { // To decide where to split a segment, we need to know if the // segment shares an endpoint with an adjacent segment. @@ -569,7 +569,7 @@ namespace TriangleNet.Meshing // Roundoff in the above calculation may yield a 'newvertex' // that is not precisely collinear with 'eorg' and 'edest'. // Improve collinearity by one step of iterative refinement. - multiplier = Primitives.CounterClockwise(eorg, edest, newvertex); + multiplier = RobustPredicates.CounterClockwise(eorg, edest, newvertex); divisor = ((eorg.x - edest.x) * (eorg.x - edest.x) + (eorg.y - edest.y) * (eorg.y - edest.y)); if ((multiplier != 0.0) && (divisor != 0.0)) @@ -615,7 +615,7 @@ namespace TriangleNet.Meshing // Set subsegment's origin to NULL. This makes it possible to detect dead // badsubsegs when traversing the list of all badsubsegs. - seg.subsegorg = null; + seg.org = null; } } @@ -658,8 +658,8 @@ namespace TriangleNet.Meshing // Make sure that this triangle is still the same triangle it was // when it was tested and determined to be of bad quality. // Subsequent transformations may have made it a different triangle. - if (!Otri.IsDead(badotri.triangle) && (borg == badtri.triangorg) && - (bdest == badtri.triangdest) && (bapex == badtri.triangapex)) + if (!Otri.IsDead(badotri.triangle) && (borg == badtri.org) && + (bdest == badtri.dest) && (bapex == badtri.apex)) { errorflag = false; // Create a new vertex at the triangle's circumcenter. @@ -670,7 +670,7 @@ namespace TriangleNet.Meshing // reset VertexType? if (behavior.fixedArea || behavior.VarArea) { - newloc = Primitives.FindCircumcenter(borg, bdest, bapex, ref xi, ref eta, behavior.offconstant); + newloc = RobustPredicates.FindCircumcenter(borg, bdest, bapex, ref xi, ref eta, behavior.offconstant); } else { @@ -682,7 +682,7 @@ namespace TriangleNet.Meshing ((newloc.x == bdest.x) && (newloc.y == bdest.y)) || ((newloc.x == bapex.x) && (newloc.y == bapex.y))) { - if (Behavior.Verbose) + if (Log.Verbose) { logger.Warning("New vertex falls on existing vertex.", "Quality.SplitTriangle()"); errorflag = true; @@ -746,7 +746,7 @@ namespace TriangleNet.Meshing else { // success == DUPLICATEVERTEX // Couldn't insert the new vertex because a vertex is already there. - if (Behavior.Verbose) + if (Log.Verbose) { logger.Warning("New vertex falls on existing vertex.", "Quality.SplitTriangle()"); errorflag = true; @@ -811,7 +811,7 @@ namespace TriangleNet.Meshing // and have no low-quality triangles. // Might we have run out of Steiner points too soon? - if (Behavior.Verbose && behavior.ConformingDelaunay && (badsubsegs.Count > 0) && (mesh.steinerleft == 0)) + if (Log.Verbose && behavior.ConformingDelaunay && (badsubsegs.Count > 0) && (mesh.steinerleft == 0)) { logger.Warning("I ran out of Steiner points, but the mesh has encroached subsegments, " diff --git a/Triangle.NET/Triangle/NewLocation.cs b/Triangle.NET/Triangle/NewLocation.cs index 6b8957f..8ee4e68 100644 --- a/Triangle.NET/Triangle/NewLocation.cs +++ b/Triangle.NET/Triangle/NewLocation.cs @@ -178,7 +178,7 @@ namespace TriangleNet // Use the counterclockwise() routine to ensure a positive (and // reasonably accurate) result, avoiding any possibility of // division by zero. - denominator = 0.5 / Primitives.CounterClockwise(tdest, tapex, torg); + denominator = 0.5 / RobustPredicates.CounterClockwise(tdest, tapex, torg); // Don't count the above as an orientation test. Statistic.CounterClockwiseCount--; } @@ -473,7 +473,7 @@ namespace TriangleNet neighborvertex_2 = neighborotri.Dest(); neighborvertex_3 = neighborotri.Apex(); // now calculate neighbor's circumcenter which is the voronoi site - neighborCircumcenter = Primitives.FindCircumcenter(neighborvertex_1, neighborvertex_2, neighborvertex_3, + neighborCircumcenter = RobustPredicates.FindCircumcenter(neighborvertex_1, neighborvertex_2, neighborvertex_3, ref xi_tmp, ref eta_tmp); /// compute petal and Voronoi edge intersection /// @@ -604,7 +604,7 @@ namespace TriangleNet neighborvertex_2 = neighborotri.Dest(); neighborvertex_3 = neighborotri.Apex(); // now calculate neighbor's circumcenter which is the voronoi site - neighborCircumcenter = Primitives.FindCircumcenter(neighborvertex_1, neighborvertex_2, neighborvertex_3, + neighborCircumcenter = RobustPredicates.FindCircumcenter(neighborvertex_1, neighborvertex_2, neighborvertex_3, ref xi_tmp, ref eta_tmp); /// compute petal and Voronoi edge intersection /// @@ -891,7 +891,7 @@ namespace TriangleNet // Use the counterclockwise() routine to ensure a positive (and // reasonably accurate) result, avoiding any possibility of // division by zero. - denominator = 0.5 / Primitives.CounterClockwise(tdest, tapex, torg); + denominator = 0.5 / RobustPredicates.CounterClockwise(tdest, tapex, torg); // Don't count the above as an orientation test. Statistic.CounterClockwiseCount--; } @@ -1234,7 +1234,7 @@ namespace TriangleNet neighborvertex_2 = neighborotri.Dest(); neighborvertex_3 = neighborotri.Apex(); // now calculate neighbor's circumcenter which is the voronoi site - neighborCircumcenter = Primitives.FindCircumcenter(neighborvertex_1, neighborvertex_2, neighborvertex_3, + neighborCircumcenter = RobustPredicates.FindCircumcenter(neighborvertex_1, neighborvertex_2, neighborvertex_3, ref xi_tmp, ref eta_tmp); /// compute petal and Voronoi edge intersection /// @@ -1516,7 +1516,7 @@ namespace TriangleNet neighborvertex_2 = neighborotri.Dest(); neighborvertex_3 = neighborotri.Apex(); // now calculate neighbor's circumcenter which is the voronoi site - neighborCircumcenter = Primitives.FindCircumcenter(neighborvertex_1, neighborvertex_2, neighborvertex_3, + neighborCircumcenter = RobustPredicates.FindCircumcenter(neighborvertex_1, neighborvertex_2, neighborvertex_3, ref xi_tmp, ref eta_tmp); /// compute petal and Voronoi edge intersection /// @@ -2521,9 +2521,9 @@ namespace TriangleNet petalr = new double[2 * numpoints]; wedges = new double[2 * numpoints * 16 + 36]; - if (Behavior.Verbose) + if (Log.Verbose) { - Log.SimpleLog.Instance.Info("NewLocation: resized work arrays (" + 2 * numpoints + ")"); + Log.Instance.Info("NewLocation: resized work arrays (" + 2 * numpoints + ")"); } } @@ -2788,9 +2788,9 @@ namespace TriangleNet petalr = new double[2 * numpoints]; wedges = new double[2 * numpoints * 20 + 40]; - if (Behavior.Verbose) + if (Log.Verbose) { - Log.SimpleLog.Instance.Info("NewLocation: resized work arrays (" + 2 * numpoints + ")"); + Log.Instance.Info("NewLocation: resized work arrays (" + 2 * numpoints + ")"); } } @@ -4099,7 +4099,7 @@ namespace TriangleNet else { // Orient 'searchtri' to fit the preconditions of calling preciselocate(). - ahead = Primitives.CounterClockwise(torg, tdest, newvertex); + ahead = RobustPredicates.CounterClockwise(torg, tdest, newvertex); if (ahead < 0.0) { // Turn around so that 'searchpoint' is to the left of the diff --git a/Triangle.NET/Triangle/Primitives.cs b/Triangle.NET/Triangle/RobustPredicates.cs similarity index 98% rename from Triangle.NET/Triangle/Primitives.cs rename to Triangle.NET/Triangle/RobustPredicates.cs index 793de81..dba3243 100644 --- a/Triangle.NET/Triangle/Primitives.cs +++ b/Triangle.NET/Triangle/RobustPredicates.cs @@ -23,7 +23,7 @@ namespace TriangleNet /// command prompt with the command "CL /P /C EXACT.C", see /// http://msdn.microsoft.com/en-us/library/8z9z0bx6.aspx /// - public static class Primitives + public static class RobustPredicates { private static double epsilon, splitter, resulterrbound; private static double ccwerrboundA, ccwerrboundB, ccwerrboundC; diff --git a/Triangle.NET/Triangle/Sampler.cs b/Triangle.NET/Triangle/Sampler.cs index 7d899d7..b128c78 100644 --- a/Triangle.NET/Triangle/Sampler.cs +++ b/Triangle.NET/Triangle/Sampler.cs @@ -9,7 +9,6 @@ namespace TriangleNet using System; using System.Collections.Generic; using System.Linq; - using System.Text; /// /// Used for triangle sampling in the Mesh.Locate method. @@ -93,7 +92,7 @@ namespace TriangleNet // sure, use a range variable... key = rand.Next(i * range, (i + 1) * range - 1); - if (!mesh.triangles.Keys.Contains(keys[key])) + if (!mesh.triangles.ContainsKey(keys[key])) { // Keys collection isn't up to date anymore! this.Update(mesh, true); diff --git a/Triangle.NET/Triangle/Tools/BoundedVoronoi.cs b/Triangle.NET/Triangle/Tools/BoundedVoronoi.cs index e851801..526a81c 100644 --- a/Triangle.NET/Triangle/Tools/BoundedVoronoi.cs +++ b/Triangle.NET/Triangle/Tools/BoundedVoronoi.cs @@ -128,7 +128,7 @@ namespace TriangleNet.Tools { tri.triangle = item; - pt = Primitives.FindCircumcenter(tri.Org(), tri.Dest(), tri.Apex(), ref xi, ref eta); + pt = RobustPredicates.FindCircumcenter(tri.Org(), tri.Dest(), tri.Apex(), ref xi, ref eta); pt.id = item.id; points[item.id] = pt; diff --git a/Triangle.NET/Triangle/Tools/CuthillMcKee.cs b/Triangle.NET/Triangle/Tools/CuthillMcKee.cs index f238737..cd924c0 100644 --- a/Triangle.NET/Triangle/Tools/CuthillMcKee.cs +++ b/Triangle.NET/Triangle/Tools/CuthillMcKee.cs @@ -11,7 +11,7 @@ namespace TriangleNet.Tools using System.Collections.Generic; using System.Linq; using System.Text; - using TriangleNet.Log; + using TriangleNet.Logging; /// /// Applies the Cuthill and McKee renumbering algorithm to reduce the bandwidth of @@ -51,9 +51,9 @@ namespace TriangleNet.Tools bandwidth2 = PermBandwidth(perm, perm_inv); - if (Behavior.Verbose) + if (Log.Verbose) { - SimpleLog.Instance.Info(String.Format("Reverse Cuthill-McKee (Bandwidth: {0} > {1})", + Log.Instance.Info(String.Format("Reverse Cuthill-McKee (Bandwidth: {0} > {1})", bandwidth1, bandwidth2)); } diff --git a/Triangle.NET/Triangle/Tools/Voronoi.cs b/Triangle.NET/Triangle/Tools/Voronoi.cs index ab51785..d48e4f4 100644 --- a/Triangle.NET/Triangle/Tools/Voronoi.cs +++ b/Triangle.NET/Triangle/Tools/Voronoi.cs @@ -114,7 +114,7 @@ namespace TriangleNet.Tools { tri.triangle = item; - pt = Primitives.FindCircumcenter(tri.Org(), tri.Dest(), tri.Apex(), ref xi, ref eta); + pt = RobustPredicates.FindCircumcenter(tri.Org(), tri.Dest(), tri.Apex(), ref xi, ref eta); pt.id = item.id; points[item.id] = pt; diff --git a/Triangle.NET/Triangle/Triangle.csproj b/Triangle.NET/Triangle/Triangle.csproj index e7cca62..ad925d6 100644 --- a/Triangle.NET/Triangle/Triangle.csproj +++ b/Triangle.NET/Triangle/Triangle.csproj @@ -51,7 +51,7 @@ - + @@ -60,7 +60,7 @@ - + @@ -77,10 +77,10 @@ - - - - + + + + @@ -88,7 +88,7 @@ - + diff --git a/Triangle.NET/Triangle/TriangleLocator.cs b/Triangle.NET/Triangle/TriangleLocator.cs index 1409195..5d578bb 100644 --- a/Triangle.NET/Triangle/TriangleLocator.cs +++ b/Triangle.NET/Triangle/TriangleLocator.cs @@ -128,10 +128,10 @@ namespace TriangleNet } // Does the point lie on the other side of the line defined by the // triangle edge opposite the triangle's destination? - destorient = Primitives.CounterClockwise(forg, fapex, searchpoint); + destorient = RobustPredicates.CounterClockwise(forg, fapex, searchpoint); // Does the point lie on the other side of the line defined by the // triangle edge opposite the triangle's origin? - orgorient = Primitives.CounterClockwise(fapex, fdest, searchpoint); + orgorient = RobustPredicates.CounterClockwise(fapex, fdest, searchpoint); if (destorient > 0.0) { if (orgorient > 0.0) @@ -317,7 +317,7 @@ namespace TriangleNet return LocateResult.OnVertex; } // Orient 'searchtri' to fit the preconditions of calling preciselocate(). - ahead = Primitives.CounterClockwise(torg, tdest, searchpoint); + ahead = RobustPredicates.CounterClockwise(torg, tdest, searchpoint); if (ahead < 0.0) { // Turn around so that 'searchpoint' is to the left of the