diff --git a/Triangle.NET/TestApp/FormMain.cs b/Triangle.NET/TestApp/FormMain.cs index 2586b67..3a3509c 100644 --- a/Triangle.NET/TestApp/FormMain.cs +++ b/Triangle.NET/TestApp/FormMain.cs @@ -617,7 +617,9 @@ namespace MeshExplorer this.voronoi = new StandardVoronoi(mesh); } - renderManager.Set(voronoi.Vertices, voronoi.Edges, false); + // HACK: List -> ICollection ? Nope, no way. + // Vertex[] -> ICollection ? Well, ok. + renderManager.Set(voronoi.Vertices.ToArray(), voronoi.Edges, false); } private void ShowLog() diff --git a/Triangle.NET/TestApp/IO/EpsImage.cs b/Triangle.NET/TestApp/IO/EpsImage.cs index 81bc10d..cf2974a 100644 --- a/Triangle.NET/TestApp/IO/EpsImage.cs +++ b/Triangle.NET/TestApp/IO/EpsImage.cs @@ -11,7 +11,7 @@ namespace MeshExplorer.IO using System.IO; using System.Text; using TriangleNet; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; /// diff --git a/Triangle.NET/TestApp/IO/Formats/JsonFile.cs b/Triangle.NET/TestApp/IO/Formats/JsonFile.cs index e24590a..b75f50e 100644 --- a/Triangle.NET/TestApp/IO/Formats/JsonFile.cs +++ b/Triangle.NET/TestApp/IO/Formats/JsonFile.cs @@ -12,7 +12,7 @@ namespace MeshExplorer.IO.Formats using System.IO; using System.Text; using TriangleNet; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; using TriangleNet.IO; using TriangleNet.Meshing; diff --git a/Triangle.NET/TestApp/Topology/OrientedTriangle.cs b/Triangle.NET/TestApp/Topology/OrientedTriangle.cs index 912da20..22926c4 100644 --- a/Triangle.NET/TestApp/Topology/OrientedTriangle.cs +++ b/Triangle.NET/TestApp/Topology/OrientedTriangle.cs @@ -1,7 +1,7 @@  namespace MeshExplorer.Topology { - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; public class OrientedTriangle diff --git a/Triangle.NET/Triangle.Rendering/IRenderContext.cs b/Triangle.NET/Triangle.Rendering/IRenderContext.cs index fac3ae5..6b1b638 100644 --- a/Triangle.NET/Triangle.Rendering/IRenderContext.cs +++ b/Triangle.NET/Triangle.Rendering/IRenderContext.cs @@ -22,7 +22,7 @@ namespace TriangleNet.Rendering void Add(IPolygon data); void Add(IMesh data, bool reset); - void Add(Point[] points, IEnumerable edges, bool reset); + void Add(ICollection points, IEnumerable edges, bool reset); void Add(float[] values); void Add(int[] partition); diff --git a/Triangle.NET/Triangle.Rendering/IRenderLayer.cs b/Triangle.NET/Triangle.Rendering/IRenderLayer.cs index 01d35c6..09a30fa 100644 --- a/Triangle.NET/Triangle.Rendering/IRenderLayer.cs +++ b/Triangle.NET/Triangle.Rendering/IRenderLayer.cs @@ -26,7 +26,7 @@ namespace TriangleNet.Rendering BoundingBox SetPoints(IBuffer buffer); BoundingBox SetPoints(IPolygon poly); BoundingBox SetPoints(IMesh mesh); - BoundingBox SetPoints(Point[] points); + BoundingBox SetPoints(ICollection points); void SetPolygon(IPolygon poly); void SetPolygon(IMesh mesh); void SetMesh(IMesh mesh, bool elements); diff --git a/Triangle.NET/Triangle.Rendering/RenderContext.cs b/Triangle.NET/Triangle.Rendering/RenderContext.cs index 3c759f5..b16bea4 100644 --- a/Triangle.NET/Triangle.Rendering/RenderContext.cs +++ b/Triangle.NET/Triangle.Rendering/RenderContext.cs @@ -117,7 +117,7 @@ namespace TriangleNet.Rendering RenderLayers[3].IsActive = true; } - public void Add(Point[] points, IEnumerable edges, bool reset) + public void Add(ICollection points, IEnumerable edges, bool reset) { RenderLayers[4].SetPoints(points); RenderLayers[4].SetMesh(edges); diff --git a/Triangle.NET/Triangle.Rendering/RenderLayer.cs b/Triangle.NET/Triangle.Rendering/RenderLayer.cs index 992fc66..7bc7997 100644 --- a/Triangle.NET/Triangle.Rendering/RenderLayer.cs +++ b/Triangle.NET/Triangle.Rendering/RenderLayer.cs @@ -108,7 +108,7 @@ namespace TriangleNet.Rendering return bounds; } - public BoundingBox SetPoints(Point[] vertices) + public BoundingBox SetPoints(ICollection vertices) { BoundingBox bounds = new BoundingBox(); diff --git a/Triangle.NET/Triangle.Rendering/RenderManager.cs b/Triangle.NET/Triangle.Rendering/RenderManager.cs index 38b8213..c0352d5 100644 --- a/Triangle.NET/Triangle.Rendering/RenderManager.cs +++ b/Triangle.NET/Triangle.Rendering/RenderManager.cs @@ -117,7 +117,7 @@ namespace TriangleNet.Rendering /// /// Set data for Voronoi layer. /// - public void Set(Point[] points, IEnumerable edges, bool reset, bool refresh = true) + public void Set(ICollection points, IEnumerable edges, bool reset, bool refresh = true) { context.Add(points, edges, reset); diff --git a/Triangle.NET/Triangle.Rendering/Util/BufferHelper.cs b/Triangle.NET/Triangle.Rendering/Util/BufferHelper.cs index 1b517fd..b6e8b52 100644 --- a/Triangle.NET/Triangle.Rendering/Util/BufferHelper.cs +++ b/Triangle.NET/Triangle.Rendering/Util/BufferHelper.cs @@ -2,7 +2,7 @@ namespace TriangleNet.Rendering.Util { using System.Collections.Generic; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; using TriangleNet.Rendering.Buffer; @@ -36,9 +36,9 @@ namespace TriangleNet.Rendering.Util return buffer as IBuffer; } - public static IBuffer CreateVertexBuffer(Point[] points, ref BoundingBox bounds) + public static IBuffer CreateVertexBuffer(ICollection points, ref BoundingBox bounds) { - var buffer = new VertexBuffer(2 * points.Length); + var buffer = new VertexBuffer(2 * points.Count); bounds.Reset(); diff --git a/Triangle.NET/Triangle/Geometry/Edge.cs b/Triangle.NET/Triangle/Geometry/Edge.cs index d7c28d7..15d7482 100644 --- a/Triangle.NET/Triangle/Geometry/Edge.cs +++ b/Triangle.NET/Triangle/Geometry/Edge.cs @@ -10,7 +10,7 @@ namespace TriangleNet.Geometry using System.Collections.Generic; using System.Linq; using System.Text; - using TriangleNet.Data; + using TriangleNet.Topology; /// /// Represents a straight line segment in 2D space. diff --git a/Triangle.NET/Triangle/Geometry/ExtensionMethods.cs b/Triangle.NET/Triangle/Geometry/ExtensionMethods.cs new file mode 100644 index 0000000..a164891 --- /dev/null +++ b/Triangle.NET/Triangle/Geometry/ExtensionMethods.cs @@ -0,0 +1,145 @@ + +namespace TriangleNet.Geometry +{ + using TriangleNet.Meshing; + + public static class ExtensionMethods + { + #region IPolygon extensions + + /// + /// Triangulates a polygon. + /// + public static IMesh Triangulate(this IPolygon polygon) + { + var mesher = new GenericMesher(); + + return mesher.Triangulate(polygon, null, null); + } + + /// + /// Triangulates a polygon, applying constraint options. + /// + /// Constraint options. + public static IMesh Triangulate(this IPolygon polygon, ConstraintOptions options) + { + var mesher = new GenericMesher(); + + return mesher.Triangulate(polygon, options, null); + } + + /// + /// Triangulates a polygon, applying quality options. + /// + /// Quality options. + public static IMesh Triangulate(this IPolygon polygon, QualityOptions quality) + { + var mesher = new GenericMesher(); + + return mesher.Triangulate(polygon, null, quality); + } + + /// + /// Triangulates a polygon, applying quality and constraint options. + /// + /// Constraint options. + /// Quality options. + public static IMesh Triangulate(this IPolygon polygon, ConstraintOptions options, QualityOptions quality) + { + var mesher = new GenericMesher(); + + var mesh = (Mesh)mesher.Triangulate(polygon.Points); + + mesh.ApplyConstraints(polygon, options, quality); + + return mesh; + } + + /// + /// Triangulates a polygon, applying quality and constraint options. + /// + /// Constraint options. + /// Quality options. + /// The triangulation algorithm. + public static IMesh Triangulate(this IPolygon polygon, ConstraintOptions options, QualityOptions quality, + ITriangulator triangulator) + { + var mesher = new GenericMesher(triangulator); + + var mesh = (Mesh)mesher.Triangulate(polygon.Points); + + mesh.ApplyConstraints(polygon, options, quality); + + return mesh; + } + + #endregion + + #region Rectangle extensions + + /// + /// Find intersection of a rectangle with a segment. + /// + /// The rectangle. + /// Segment start point. + /// Segment end point. + /// Intersection associated to start point. + /// Intersection associated to end point. + /// Returns true, if segment intersects or lies completely in rectangle, otherwise false. + /// + /// Liang-Barsky function by Daniel White, http://www.skytopia.com/project/articles/compsci/clipping.html + /// + public static bool Intersect(this Rectangle rect, Point p0, Point p1, ref Point c0, ref Point c1) + { + // Define the x/y clipping values for the border. + double xmin = rect.Left; + double xmax = rect.Right; + double ymin = rect.Bottom; + double ymax = rect.Top; + + // Define the start and end points of the line. + double x0 = p0.X; + double y0 = p0.Y; + double x1 = p1.X; + double y1 = p1.Y; + + double t0 = 0.0; + double t1 = 1.0; + + double dx = x1 - x0; + double dy = y1 - y0; + + double p = 0.0, q = 0.0, r; + + for (int edge = 0; edge < 4; edge++) + { + // Traverse through left, right, bottom, top edges. + if (edge == 0) { p = -dx; q = -(xmin - x0); } + if (edge == 1) { p = dx; q = (xmax - x0); } + if (edge == 2) { p = -dy; q = -(ymin - y0); } + if (edge == 3) { p = dy; q = (ymax - y0); } + r = q / p; + if (p == 0 && q < 0) return false; // Don't draw line at all. (parallel line outside) + if (p < 0) + { + if (r > t1) return false; // Don't draw line at all. + else if (r > t0) t0 = r; // Line is clipped! + } + else if (p > 0) + { + if (r < t0) return false; // Don't draw line at all. + else if (r < t1) t1 = r; // Line is clipped! + } + } + + c0.x = x0 + t0 * dx; + c0.y = y0 + t0 * dy; + c1.x = x0 + t1 * dx; + c1.y = y0 + t1 * dy; + + return true; // (clipped) line is drawn + } + + #endregion + } +} diff --git a/Triangle.NET/Triangle/Geometry/IPolygon.cs b/Triangle.NET/Triangle/Geometry/IPolygon.cs index dc078fb..a99672c 100644 --- a/Triangle.NET/Triangle/Geometry/IPolygon.cs +++ b/Triangle.NET/Triangle/Geometry/IPolygon.cs @@ -2,7 +2,7 @@ namespace TriangleNet.Geometry { using System.Collections.Generic; - using TriangleNet.Data; + using TriangleNet.Topology; /// /// Polygon interface. diff --git a/Triangle.NET/Triangle/Geometry/IPolygonExtensions.cs b/Triangle.NET/Triangle/Geometry/IPolygonExtensions.cs deleted file mode 100644 index a33ccf6..0000000 --- a/Triangle.NET/Triangle/Geometry/IPolygonExtensions.cs +++ /dev/null @@ -1,74 +0,0 @@ - -namespace TriangleNet.Geometry -{ - using TriangleNet.Meshing; - - public static class IPolygonExtensions - { - /// - /// Triangulates a polygon. - /// - public static IMesh Triangulate(this IPolygon polygon) - { - var mesher = new GenericMesher(); - - return mesher.Triangulate(polygon, null, null); - } - - /// - /// Triangulates a polygon, applying constraint options. - /// - /// Constraint options. - public static IMesh Triangulate(this IPolygon polygon, ConstraintOptions options) - { - var mesher = new GenericMesher(); - - return mesher.Triangulate(polygon, options, null); - } - - /// - /// Triangulates a polygon, applying quality options. - /// - /// Quality options. - public static IMesh Triangulate(this IPolygon polygon, QualityOptions quality) - { - var mesher = new GenericMesher(); - - return mesher.Triangulate(polygon, null, quality); - } - - /// - /// Triangulates a polygon, applying quality and constraint options. - /// - /// Constraint options. - /// Quality options. - public static IMesh Triangulate(this IPolygon polygon, ConstraintOptions options, QualityOptions quality) - { - var mesher = new GenericMesher(); - - var mesh = (Mesh)mesher.Triangulate(polygon.Points); - - mesh.ApplyConstraints(polygon, options, quality); - - return mesh; - } - - /// - /// Triangulates a polygon, applying quality and constraint options. - /// - /// Constraint options. - /// Quality options. - /// The triangulation algorithm. - public static IMesh Triangulate(this IPolygon polygon, ConstraintOptions options, QualityOptions quality, - ITriangulator triangulator) - { - var mesher = new GenericMesher(triangulator); - - var mesh = (Mesh)mesher.Triangulate(polygon.Points); - - mesh.ApplyConstraints(polygon, options, quality); - - return mesh; - } - } -} diff --git a/Triangle.NET/Triangle/Geometry/ITriangle.cs b/Triangle.NET/Triangle/Geometry/ITriangle.cs index a7f78e6..93d78d0 100644 --- a/Triangle.NET/Triangle/Geometry/ITriangle.cs +++ b/Triangle.NET/Triangle/Geometry/ITriangle.cs @@ -6,7 +6,7 @@ namespace TriangleNet.Geometry { - using TriangleNet.Data; + using TriangleNet.Topology; /// /// Triangle interface. diff --git a/Triangle.NET/Triangle/Geometry/Polygon.cs b/Triangle.NET/Triangle/Geometry/Polygon.cs index 733c96c..1b113e7 100644 --- a/Triangle.NET/Triangle/Geometry/Polygon.cs +++ b/Triangle.NET/Triangle/Geometry/Polygon.cs @@ -3,7 +3,7 @@ namespace TriangleNet.Geometry { using System; using System.Collections.Generic; - using TriangleNet.Data; + using TriangleNet.Topology; /// /// A polygon represented as a planar straight line graph. diff --git a/Triangle.NET/Triangle/Geometry/Vertex.cs b/Triangle.NET/Triangle/Geometry/Vertex.cs index ca5dc8d..43325f0 100644 --- a/Triangle.NET/Triangle/Geometry/Vertex.cs +++ b/Triangle.NET/Triangle/Geometry/Vertex.cs @@ -8,7 +8,7 @@ namespace TriangleNet.Geometry { using System; - using TriangleNet.Data; + using TriangleNet.Topology; /// /// The vertex data structure. diff --git a/Triangle.NET/Triangle/IO/DebugWriter.cs b/Triangle.NET/Triangle/IO/DebugWriter.cs index a8f2409..e7c95fb 100644 --- a/Triangle.NET/Triangle/IO/DebugWriter.cs +++ b/Triangle.NET/Triangle/IO/DebugWriter.cs @@ -11,7 +11,7 @@ namespace TriangleNet.IO using System.IO; using System.IO.Compression; using System.Text; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; /// diff --git a/Triangle.NET/Triangle/IO/InputTriangle.cs b/Triangle.NET/Triangle/IO/InputTriangle.cs index cf57fa9..32ca324 100644 --- a/Triangle.NET/Triangle/IO/InputTriangle.cs +++ b/Triangle.NET/Triangle/IO/InputTriangle.cs @@ -6,7 +6,7 @@ namespace TriangleNet.IO { - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; /// diff --git a/Triangle.NET/Triangle/IO/TriangleReader.cs b/Triangle.NET/Triangle/IO/TriangleReader.cs index 1e5dd91..bd10ba6 100644 --- a/Triangle.NET/Triangle/IO/TriangleReader.cs +++ b/Triangle.NET/Triangle/IO/TriangleReader.cs @@ -10,7 +10,7 @@ namespace TriangleNet.IO using System; using System.IO; using System.Globalization; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Logging; using TriangleNet.Geometry; using System.Collections.Generic; diff --git a/Triangle.NET/Triangle/IO/TriangleWriter.cs b/Triangle.NET/Triangle/IO/TriangleWriter.cs index 9dd1a15..2b21f93 100644 --- a/Triangle.NET/Triangle/IO/TriangleWriter.cs +++ b/Triangle.NET/Triangle/IO/TriangleWriter.cs @@ -10,7 +10,7 @@ namespace TriangleNet.IO using System; using System.IO; using System.Globalization; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; using System.Collections.Generic; diff --git a/Triangle.NET/Triangle/Mesh.cs b/Triangle.NET/Triangle/Mesh.cs index fb66d70..1749fe5 100644 --- a/Triangle.NET/Triangle/Mesh.cs +++ b/Triangle.NET/Triangle/Mesh.cs @@ -9,12 +9,13 @@ namespace TriangleNet { using System; using System.Collections.Generic; - using TriangleNet.Data; using TriangleNet.Geometry; using TriangleNet.Logging; using TriangleNet.Meshing; + using TriangleNet.Meshing.Data; using TriangleNet.Meshing.Iterators; using TriangleNet.Tools; + using TriangleNet.Topology; /// /// Mesh data structure. diff --git a/Triangle.NET/Triangle/MeshValidator.cs b/Triangle.NET/Triangle/MeshValidator.cs index b132282..1cb0999 100644 --- a/Triangle.NET/Triangle/MeshValidator.cs +++ b/Triangle.NET/Triangle/MeshValidator.cs @@ -8,7 +8,7 @@ namespace TriangleNet { using System; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; public static class MeshValidator diff --git a/Triangle.NET/Triangle/Meshing/Algorithm/Dwyer.cs b/Triangle.NET/Triangle/Meshing/Algorithm/Dwyer.cs index d9091dc..d34bc21 100644 --- a/Triangle.NET/Triangle/Meshing/Algorithm/Dwyer.cs +++ b/Triangle.NET/Triangle/Meshing/Algorithm/Dwyer.cs @@ -9,7 +9,7 @@ namespace TriangleNet.Meshing.Algorithm { using System; using System.Collections.Generic; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; /// diff --git a/Triangle.NET/Triangle/Meshing/Algorithm/Incremental.cs b/Triangle.NET/Triangle/Meshing/Algorithm/Incremental.cs index 0a3c5e1..26777e4 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 System.Collections.Generic; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; /// diff --git a/Triangle.NET/Triangle/Meshing/Algorithm/SweepLine.cs b/Triangle.NET/Triangle/Meshing/Algorithm/SweepLine.cs index 00fd07d..4440ce8 100644 --- a/Triangle.NET/Triangle/Meshing/Algorithm/SweepLine.cs +++ b/Triangle.NET/Triangle/Meshing/Algorithm/SweepLine.cs @@ -9,7 +9,7 @@ namespace TriangleNet.Meshing.Algorithm { using System; using System.Collections.Generic; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; using TriangleNet.Tools; diff --git a/Triangle.NET/Triangle/Meshing/ConstraintMesher.cs b/Triangle.NET/Triangle/Meshing/ConstraintMesher.cs index 4a738da..f039ae8 100644 --- a/Triangle.NET/Triangle/Meshing/ConstraintMesher.cs +++ b/Triangle.NET/Triangle/Meshing/ConstraintMesher.cs @@ -9,7 +9,7 @@ namespace TriangleNet.Meshing { using System; using System.Collections.Generic; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; using TriangleNet.Logging; using TriangleNet.Meshing.Iterators; diff --git a/Triangle.NET/Triangle/Meshing/Converter.cs b/Triangle.NET/Triangle/Meshing/Converter.cs index 946523c..5d0029b 100644 --- a/Triangle.NET/Triangle/Meshing/Converter.cs +++ b/Triangle.NET/Triangle/Meshing/Converter.cs @@ -10,7 +10,7 @@ namespace TriangleNet.Meshing using System; using System.Collections.Generic; using System.Linq; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; /// diff --git a/Triangle.NET/Triangle/Data/BadSubseg.cs b/Triangle.NET/Triangle/Meshing/Data/BadSubseg.cs similarity index 91% rename from Triangle.NET/Triangle/Data/BadSubseg.cs rename to Triangle.NET/Triangle/Meshing/Data/BadSubseg.cs index 9db815a..85f23a2 100644 --- a/Triangle.NET/Triangle/Data/BadSubseg.cs +++ b/Triangle.NET/Triangle/Meshing/Data/BadSubseg.cs @@ -5,10 +5,11 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet.Data +namespace TriangleNet.Meshing.Data { using System; using TriangleNet.Geometry; + using TriangleNet.Topology; /// /// A queue used to store encroached subsegments. diff --git a/Triangle.NET/Triangle/Data/BadTriQueue.cs b/Triangle.NET/Triangle/Meshing/Data/BadTriQueue.cs similarity index 96% rename from Triangle.NET/Triangle/Data/BadTriQueue.cs rename to Triangle.NET/Triangle/Meshing/Data/BadTriQueue.cs index 2670870..87d5d18 100644 --- a/Triangle.NET/Triangle/Data/BadTriQueue.cs +++ b/Triangle.NET/Triangle/Meshing/Data/BadTriQueue.cs @@ -5,9 +5,10 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet.Data +namespace TriangleNet.Meshing.Data { using TriangleNet.Geometry; + using TriangleNet.Topology; /// /// A (priority) queue for bad triangles. diff --git a/Triangle.NET/Triangle/Data/BadTriangle.cs b/Triangle.NET/Triangle/Meshing/Data/BadTriangle.cs similarity index 92% rename from Triangle.NET/Triangle/Data/BadTriangle.cs rename to Triangle.NET/Triangle/Meshing/Data/BadTriangle.cs index cd48829..544742e 100644 --- a/Triangle.NET/Triangle/Data/BadTriangle.cs +++ b/Triangle.NET/Triangle/Meshing/Data/BadTriangle.cs @@ -5,10 +5,11 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet.Data +namespace TriangleNet.Meshing.Data { using System; using TriangleNet.Geometry; + using TriangleNet.Topology; /// /// A queue used to store bad triangles. diff --git a/Triangle.NET/Triangle/Meshing/IMesh.cs b/Triangle.NET/Triangle/Meshing/IMesh.cs index 4db2e5e..1e6a1be 100644 --- a/Triangle.NET/Triangle/Meshing/IMesh.cs +++ b/Triangle.NET/Triangle/Meshing/IMesh.cs @@ -2,7 +2,7 @@ namespace TriangleNet.Meshing { using System.Collections.Generic; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; /// diff --git a/Triangle.NET/Triangle/Meshing/Iterators/EdgeIterator.cs b/Triangle.NET/Triangle/Meshing/Iterators/EdgeIterator.cs index 3fd4f95..5e05a15 100644 --- a/Triangle.NET/Triangle/Meshing/Iterators/EdgeIterator.cs +++ b/Triangle.NET/Triangle/Meshing/Iterators/EdgeIterator.cs @@ -7,7 +7,7 @@ namespace TriangleNet.Meshing.Iterators { using System.Collections.Generic; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; /// diff --git a/Triangle.NET/Triangle/Meshing/Iterators/RegionIterator.cs b/Triangle.NET/Triangle/Meshing/Iterators/RegionIterator.cs index 2dda7f3..60b07ca 100644 --- a/Triangle.NET/Triangle/Meshing/Iterators/RegionIterator.cs +++ b/Triangle.NET/Triangle/Meshing/Iterators/RegionIterator.cs @@ -9,7 +9,7 @@ namespace TriangleNet.Meshing.Iterators { using System; using System.Collections.Generic; - using TriangleNet.Data; + using TriangleNet.Topology; /// /// Iterates the region a given triangle belongs to and applies an action diff --git a/Triangle.NET/Triangle/Meshing/QualityMesher.cs b/Triangle.NET/Triangle/Meshing/QualityMesher.cs index 4fc0a11..1ce2ecf 100644 --- a/Triangle.NET/Triangle/Meshing/QualityMesher.cs +++ b/Triangle.NET/Triangle/Meshing/QualityMesher.cs @@ -9,9 +9,10 @@ namespace TriangleNet.Meshing { using System; using System.Collections.Generic; - using TriangleNet.Data; using TriangleNet.Geometry; using TriangleNet.Logging; + using TriangleNet.Meshing.Data; + using TriangleNet.Topology; /// /// Provides methods for mesh quality enforcement and testing. diff --git a/Triangle.NET/Triangle/Meshing/QualityOptions.cs b/Triangle.NET/Triangle/Meshing/QualityOptions.cs index a543ee1..bf9f8b8 100644 --- a/Triangle.NET/Triangle/Meshing/QualityOptions.cs +++ b/Triangle.NET/Triangle/Meshing/QualityOptions.cs @@ -35,7 +35,7 @@ namespace TriangleNet.Meshing public Func UserTest { get; set; } /// - /// Gets or sets a area constraint per triangle. + /// Gets or sets an area constraint per triangle. /// /// /// If this flag is set to true, the value will diff --git a/Triangle.NET/Triangle/NewLocation.cs b/Triangle.NET/Triangle/NewLocation.cs index 55686eb..fb71f49 100644 --- a/Triangle.NET/Triangle/NewLocation.cs +++ b/Triangle.NET/Triangle/NewLocation.cs @@ -8,7 +8,7 @@ namespace TriangleNet { using System; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; using TriangleNet.Tools; diff --git a/Triangle.NET/Triangle/RobustPredicates.cs b/Triangle.NET/Triangle/RobustPredicates.cs index 2f36347..7c93801 100644 --- a/Triangle.NET/Triangle/RobustPredicates.cs +++ b/Triangle.NET/Triangle/RobustPredicates.cs @@ -8,7 +8,7 @@ namespace TriangleNet { using System; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; using TriangleNet.Tools; diff --git a/Triangle.NET/Triangle/Tools/Statistic.cs b/Triangle.NET/Triangle/Tools/Statistic.cs index 20c3f65..5ca43ce 100644 --- a/Triangle.NET/Triangle/Tools/Statistic.cs +++ b/Triangle.NET/Triangle/Tools/Statistic.cs @@ -8,7 +8,7 @@ namespace TriangleNet.Tools { using System; - using TriangleNet.Data; + using TriangleNet.Topology; using TriangleNet.Geometry; /// diff --git a/Triangle.NET/Triangle/Topology/DCEL/DcelMesh.cs b/Triangle.NET/Triangle/Topology/DCEL/DcelMesh.cs new file mode 100644 index 0000000..1276766 --- /dev/null +++ b/Triangle.NET/Triangle/Topology/DCEL/DcelMesh.cs @@ -0,0 +1,119 @@ + +namespace TriangleNet.Topology.DCEL +{ + using System.Collections.Generic; + using TriangleNet.Geometry; + + public class DcelMesh + { + protected List vertices; + protected List edges; + protected List faces; + + public DcelMesh() + : this(true) + { + } + + protected DcelMesh(bool initialize) + { + if (initialize) + { + vertices = new List(); + edges = new List(); + faces = new List(); + } + } + + /// + /// Gets the vertices of the Voronoi diagram. + /// + public List Vertices + { + get { return vertices; } + } + + /// + /// Gets the list of half-edges specify the Voronoi diagram topology. + /// + public List HalfEdges + { + get { return edges; } + } + + /// + /// Gets the faces of the Voronoi diagram. + /// + public List Faces + { + get { return faces; } + } + + /// + /// Gets the collection of edges of the Voronoi diagram. + /// + public IEnumerable Edges + { + get { return EnumerateEdges(); } + } + + /// + /// Search for half-edge without twin and add a twin. Connect twins to form connected + /// boundary contours. + /// + /// + /// This method assumes that all faces are closed (i.e. no edge.next pointers are null). + /// + internal void ResolveBoundaryEdges() + { + // Maps vertices to leaving boundary edge. + var map = new Dictionary(); + + // TODO: parallel? + foreach (var edge in this.edges) + { + if (edge.twin == null) + { + var twin = edge.twin = new HalfEdge(edge.next.origin); + twin.twin = edge; + + map.Add(twin.origin.id, twin); + } + } + + int j = edges.Count; + + foreach (var edge in map.Values) + { + edge.id = j++; + edge.next = map[edge.twin.origin.id]; + + this.edges.Add(edge); + } + } + + /// + /// Enumerates all edges of the DCEL. + /// + /// + /// This method assumes that each half-edge has a twin (i.e. NOT null). + /// + protected virtual IEnumerable EnumerateEdges() + { + var edges = new List(this.edges.Count / 2); + + foreach (var edge in this.edges) + { + var twin = edge.twin; + + // Report edge only once. + if (edge.id < twin.id) + { + edges.Add(new Edge(edge.origin.id, twin.origin.id)); + } + } + + return edges; + } + } +} diff --git a/Triangle.NET/Triangle/Voronoi/DCEL/Face.cs b/Triangle.NET/Triangle/Topology/DCEL/Face.cs similarity index 93% rename from Triangle.NET/Triangle/Voronoi/DCEL/Face.cs rename to Triangle.NET/Triangle/Topology/DCEL/Face.cs index 1bb3e39..b2b0102 100644 --- a/Triangle.NET/Triangle/Voronoi/DCEL/Face.cs +++ b/Triangle.NET/Triangle/Topology/DCEL/Face.cs @@ -4,7 +4,7 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet.Voronoi.DCEL +namespace TriangleNet.Topology.DCEL { using TriangleNet.Geometry; @@ -13,6 +13,8 @@ namespace TriangleNet.Voronoi.DCEL /// public class Face { + internal int id; + internal Point generator; internal HalfEdge edge; diff --git a/Triangle.NET/Triangle/Voronoi/DCEL/HalfEdge.cs b/Triangle.NET/Triangle/Topology/DCEL/HalfEdge.cs similarity index 95% rename from Triangle.NET/Triangle/Voronoi/DCEL/HalfEdge.cs rename to Triangle.NET/Triangle/Topology/DCEL/HalfEdge.cs index 8d1e8b0..0d85b77 100644 --- a/Triangle.NET/Triangle/Voronoi/DCEL/HalfEdge.cs +++ b/Triangle.NET/Triangle/Topology/DCEL/HalfEdge.cs @@ -4,7 +4,7 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet.Voronoi.DCEL +namespace TriangleNet.Topology.DCEL { public class HalfEdge { diff --git a/Triangle.NET/Triangle/Voronoi/DCEL/Vertex.cs b/Triangle.NET/Triangle/Topology/DCEL/Vertex.cs similarity index 90% rename from Triangle.NET/Triangle/Voronoi/DCEL/Vertex.cs rename to Triangle.NET/Triangle/Topology/DCEL/Vertex.cs index cb1cdf5..966d916 100644 --- a/Triangle.NET/Triangle/Voronoi/DCEL/Vertex.cs +++ b/Triangle.NET/Triangle/Topology/DCEL/Vertex.cs @@ -4,11 +4,9 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet.Voronoi.DCEL +namespace TriangleNet.Topology.DCEL { - using TriangleNet.Geometry; - - public class Vertex : Point + public class Vertex : TriangleNet.Geometry.Point { internal HalfEdge leaving; diff --git a/Triangle.NET/Triangle/Data/Osub.cs b/Triangle.NET/Triangle/Topology/Osub.cs similarity index 96% rename from Triangle.NET/Triangle/Data/Osub.cs rename to Triangle.NET/Triangle/Topology/Osub.cs index ebef407..c06c681 100644 --- a/Triangle.NET/Triangle/Data/Osub.cs +++ b/Triangle.NET/Triangle/Topology/Osub.cs @@ -5,7 +5,7 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet.Data +namespace TriangleNet.Topology { using System; using TriangleNet.Geometry; diff --git a/Triangle.NET/Triangle/Data/Otri.cs b/Triangle.NET/Triangle/Topology/Otri.cs similarity index 96% rename from Triangle.NET/Triangle/Data/Otri.cs rename to Triangle.NET/Triangle/Topology/Otri.cs index 335c0c5..7e73a36 100644 --- a/Triangle.NET/Triangle/Data/Otri.cs +++ b/Triangle.NET/Triangle/Topology/Otri.cs @@ -5,7 +5,7 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet.Data +namespace TriangleNet.Topology { using System; using TriangleNet.Geometry; diff --git a/Triangle.NET/Triangle/Data/Segment.cs b/Triangle.NET/Triangle/Topology/Segment.cs similarity index 93% rename from Triangle.NET/Triangle/Data/Segment.cs rename to Triangle.NET/Triangle/Topology/Segment.cs index 85f8155..5df1cce 100644 --- a/Triangle.NET/Triangle/Data/Segment.cs +++ b/Triangle.NET/Triangle/Topology/Segment.cs @@ -5,7 +5,7 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet.Data +namespace TriangleNet.Topology { using System; using TriangleNet.Geometry; @@ -21,7 +21,7 @@ namespace TriangleNet.Data // triangle side or subsegment end that isn't attached to a real // subsegment. - internal static Segment Empty; + internal static readonly Segment Empty; static Segment() { @@ -34,8 +34,6 @@ namespace TriangleNet.Data // can legally be dereferenced. Empty.subsegs[0].seg = Empty; Empty.subsegs[1].seg = Empty; - - Triangle.Initialize(); } #endregion diff --git a/Triangle.NET/Triangle/Data/Triangle.cs b/Triangle.NET/Triangle/Topology/Triangle.cs similarity index 91% rename from Triangle.NET/Triangle/Data/Triangle.cs rename to Triangle.NET/Triangle/Topology/Triangle.cs index 7f4d04a..9e42182 100644 --- a/Triangle.NET/Triangle/Data/Triangle.cs +++ b/Triangle.NET/Triangle/Topology/Triangle.cs @@ -5,7 +5,7 @@ // // ----------------------------------------------------------------------- -namespace TriangleNet.Data +namespace TriangleNet.Topology { using System; using TriangleNet.Geometry; @@ -36,18 +36,16 @@ namespace TriangleNet.Data internal const int EmptyID = -1; - internal static Triangle Empty; + internal static readonly Triangle Empty; /// - /// Initializes the dummytri (Triangle.Empty). The method is called by the static Segment - /// constructor (which ensures that dummysub (Segment.Empty) will not be null). + /// Initializes the dummytri (Triangle.Empty). /// - internal static void Initialize() + static Triangle() { // Set up 'dummytri', the 'triangle' that occupies "outer space." Empty = new Triangle(); - Empty.hash = EmptyID; - Empty.id = EmptyID; + Empty.hash = Empty.id = EmptyID; // Initialize the three adjoining triangles to be "outer space." These // will eventually be changed by various bonding operations, but their @@ -57,6 +55,12 @@ namespace TriangleNet.Data Empty.neighbors[1].triangle = Empty; Empty.neighbors[2].triangle = Empty; + if (Segment.Empty == null) + { + // In case the static Segment constructor hasn't been called yet. + Empty.subsegs[0].seg = new Segment(); + } + // Initialize the three adjoining subsegments of 'dummytri' to be // the omnipresent subsegment. Empty.subsegs[0].seg = Segment.Empty; diff --git a/Triangle.NET/Triangle/Triangle.csproj b/Triangle.NET/Triangle/Triangle.csproj index 66f05a3..2e1f77c 100644 --- a/Triangle.NET/Triangle/Triangle.csproj +++ b/Triangle.NET/Triangle/Triangle.csproj @@ -43,7 +43,7 @@ - + @@ -54,15 +54,16 @@ - + - - - - - - + + + + + + + @@ -109,13 +110,16 @@ - - - + + + - + + + +