From 3c20831c10b9aa77e036debd1b6319a1e79cfe06 Mon Sep 17 00:00:00 2001 From: "SND\\wo80_cp" Date: Wed, 24 Feb 2016 23:47:55 +0000 Subject: [PATCH] Fix structured mesh generation (GenericMesher); Code cleanup; git-svn-id: https://triangle.svn.codeplex.com/svn@78535 0e2699bc-83d4-4a8f-98e7-55e24ab8c7a5 --- Triangle.NET/Triangle/IO/TriangleReader.cs | 9 ++-- .../Triangle/Meshing/ConstraintMesher.cs | 1 - .../Triangle/Meshing/GenericMesher.cs | 8 +-- .../Meshing/Iterators/RegionIterator.cs | 4 -- .../Meshing/Iterators/VertexCirculator.cs | 4 -- Triangle.NET/Triangle/NewLocation.cs | 53 +++---------------- Triangle.NET/Triangle/Topology/DCEL/Face.cs | 2 +- 7 files changed, 17 insertions(+), 64 deletions(-) diff --git a/Triangle.NET/Triangle/IO/TriangleReader.cs b/Triangle.NET/Triangle/IO/TriangleReader.cs index d769196..fb3a90f 100644 --- a/Triangle.NET/Triangle/IO/TriangleReader.cs +++ b/Triangle.NET/Triangle/IO/TriangleReader.cs @@ -19,6 +19,7 @@ namespace TriangleNet.IO public class TriangleReader { static NumberFormatInfo nfi = NumberFormatInfo.InvariantInfo; + int startIndex = 0; #region Helper methods @@ -98,20 +99,20 @@ namespace TriangleNet.IO /// /// Reads geometry information from .node or .poly files. /// - public void Read(string filename, out Polygon geometry) + public void Read(string filename, out Polygon polygon) { - geometry = null; + polygon = null; string path = Path.ChangeExtension(filename, ".poly"); if (File.Exists(path)) { - geometry = ReadPolyFile(path); + polygon = ReadPolyFile(path); } else { path = Path.ChangeExtension(filename, ".node"); - geometry = ReadNodeFile(path); + polygon = ReadNodeFile(path); } } diff --git a/Triangle.NET/Triangle/Meshing/ConstraintMesher.cs b/Triangle.NET/Triangle/Meshing/ConstraintMesher.cs index 548b4be..0bf5afe 100644 --- a/Triangle.NET/Triangle/Meshing/ConstraintMesher.cs +++ b/Triangle.NET/Triangle/Meshing/ConstraintMesher.cs @@ -296,7 +296,6 @@ namespace TriangleNet.Meshing Vertex horg, hdest; var dummytri = mesh.dummytri; - var dummysub = mesh.dummysub; // Find a triangle handle on the hull. hulltri.tri = dummytri; diff --git a/Triangle.NET/Triangle/Meshing/GenericMesher.cs b/Triangle.NET/Triangle/Meshing/GenericMesher.cs index 74f1019..75c6dfc 100644 --- a/Triangle.NET/Triangle/Meshing/GenericMesher.cs +++ b/Triangle.NET/Triangle/Meshing/GenericMesher.cs @@ -182,16 +182,16 @@ namespace TriangleNet.Meshing for (i = 0; i < nx; i++) { // Bottom - a = points[i * (ny + 1)]; - b = points[(i + 1) * (ny + 1)]; + a = points[(ny + 1) * i]; + b = points[(ny + 1) * (i + 1)]; segments.Add(new Segment(a, b, 1)); a.Label = b.Label = 1; // Top - a = points[i * (ny + 1) + nx]; - b = points[(i + 1) * (ny + 1) + nx]; + a = points[ny + (ny + 1) * i]; + b = points[ny + (ny + 1) * (i + 1)]; segments.Add(new Segment(a, b, 1)); diff --git a/Triangle.NET/Triangle/Meshing/Iterators/RegionIterator.cs b/Triangle.NET/Triangle/Meshing/Iterators/RegionIterator.cs index ab264ed..2a249a9 100644 --- a/Triangle.NET/Triangle/Meshing/Iterators/RegionIterator.cs +++ b/Triangle.NET/Triangle/Meshing/Iterators/RegionIterator.cs @@ -18,12 +18,10 @@ namespace TriangleNet.Meshing.Iterators /// public class RegionIterator { - Mesh mesh; List viri; public RegionIterator(Mesh mesh) { - this.mesh = mesh; this.viri = new List(); } @@ -37,8 +35,6 @@ namespace TriangleNet.Meshing.Iterators Otri neighbor = default(Otri); Osub neighborsubseg = default(Osub); - Behavior behavior = mesh.behavior; - // Loop through all the infected triangles, spreading the attribute // and/or area constraint to their neighbors, then to their neighbors' // neighbors. diff --git a/Triangle.NET/Triangle/Meshing/Iterators/VertexCirculator.cs b/Triangle.NET/Triangle/Meshing/Iterators/VertexCirculator.cs index 189e1d3..44821a6 100644 --- a/Triangle.NET/Triangle/Meshing/Iterators/VertexCirculator.cs +++ b/Triangle.NET/Triangle/Meshing/Iterators/VertexCirculator.cs @@ -9,12 +9,8 @@ namespace TriangleNet.Meshing.Iterators { List cache = new List(); - Mesh mesh; - public VertexCirculator(Mesh mesh) { - this.mesh = mesh; - mesh.MakeVertexMap(); } diff --git a/Triangle.NET/Triangle/NewLocation.cs b/Triangle.NET/Triangle/NewLocation.cs index e45264d..4755b21 100644 --- a/Triangle.NET/Triangle/NewLocation.cs +++ b/Triangle.NET/Triangle/NewLocation.cs @@ -69,6 +69,7 @@ namespace TriangleNet // Based on using -U switch, call the corresponding function if (behavior.MaxAngle == 0.0) { + // Disable the "no max angle" code. It may return weired vertex locations. return FindNewLocationWithoutMaxAngle(org, dest, apex, ref xi, ref eta, true, badotri); } @@ -101,7 +102,7 @@ namespace TriangleNet ////////////////////////////// HALE'S VARIABLES ////////////////////////////// // keeps the difference of coordinates edge - double xShortestEdge = 0, yShortestEdge = 0, xMiddleEdge, yMiddleEdge, xLongestEdge, yLongestEdge; + double xShortestEdge = 0, yShortestEdge = 0; // keeps the square of edge lengths double shortestEdgeDist = 0, middleEdgeDist = 0, longestEdgeDist = 0; @@ -218,8 +219,6 @@ namespace TriangleNet /// smallest angle corner: dest /// largest angle corner: apex xShortestEdge = xao; yShortestEdge = yao; - xMiddleEdge = xda; yMiddleEdge = yda; - xLongestEdge = xdo; yLongestEdge = ydo; shortestEdgeDist = aodist; middleEdgeDist = dadist; @@ -234,8 +233,6 @@ namespace TriangleNet /// smallest angle corner: dest /// largest angle corner: org xShortestEdge = xao; yShortestEdge = yao; - xMiddleEdge = xdo; yMiddleEdge = ydo; - xLongestEdge = xda; yLongestEdge = yda; shortestEdgeDist = aodist; middleEdgeDist = dodist; @@ -250,8 +247,6 @@ namespace TriangleNet /// smallest angle corner: org /// largest angle corner: apex xShortestEdge = xda; yShortestEdge = yda; - xMiddleEdge = xao; yMiddleEdge = yao; - xLongestEdge = xdo; yLongestEdge = ydo; shortestEdgeDist = dadist; middleEdgeDist = aodist; @@ -265,8 +260,6 @@ namespace TriangleNet /// smallest angle corner: org /// largest angle corner: dest xShortestEdge = xda; yShortestEdge = yda; - xMiddleEdge = xdo; yMiddleEdge = ydo; - xLongestEdge = xao; yLongestEdge = yao; shortestEdgeDist = dadist; middleEdgeDist = dodist; @@ -280,8 +273,6 @@ namespace TriangleNet /// smallest angle corner: apex /// largest angle corner: org xShortestEdge = xdo; yShortestEdge = ydo; - xMiddleEdge = xao; yMiddleEdge = yao; - xLongestEdge = xda; yLongestEdge = yda; shortestEdgeDist = dodist; middleEdgeDist = aodist; @@ -296,8 +287,6 @@ namespace TriangleNet /// smallest angle corner: apex /// largest angle corner: dest xShortestEdge = xdo; yShortestEdge = ydo; - xMiddleEdge = xda; yMiddleEdge = yda; - xLongestEdge = xao; yLongestEdge = yao; shortestEdgeDist = dodist; middleEdgeDist = dadist; @@ -801,7 +790,7 @@ namespace TriangleNet ////////////////////////////// HALE'S VARIABLES ////////////////////////////// // keeps the difference of coordinates edge - double xShortestEdge = 0, yShortestEdge = 0, xMiddleEdge, yMiddleEdge, xLongestEdge, yLongestEdge; + double xShortestEdge = 0, yShortestEdge = 0; // keeps the square of edge lengths double shortestEdgeDist = 0, middleEdgeDist = 0, longestEdgeDist = 0; @@ -931,8 +920,6 @@ namespace TriangleNet /// smallest angle corner: dest /// largest angle corner: apex xShortestEdge = xao; yShortestEdge = yao; - xMiddleEdge = xda; yMiddleEdge = yda; - xLongestEdge = xdo; yLongestEdge = ydo; shortestEdgeDist = aodist; middleEdgeDist = dadist; @@ -947,8 +934,6 @@ namespace TriangleNet /// smallest angle corner: dest /// largest angle corner: org xShortestEdge = xao; yShortestEdge = yao; - xMiddleEdge = xdo; yMiddleEdge = ydo; - xLongestEdge = xda; yLongestEdge = yda; shortestEdgeDist = aodist; middleEdgeDist = dodist; @@ -963,8 +948,6 @@ namespace TriangleNet /// smallest angle corner: org /// largest angle corner: apex xShortestEdge = xda; yShortestEdge = yda; - xMiddleEdge = xao; yMiddleEdge = yao; - xLongestEdge = xdo; yLongestEdge = ydo; shortestEdgeDist = dadist; middleEdgeDist = aodist; @@ -978,8 +961,6 @@ namespace TriangleNet /// smallest angle corner: org /// largest angle corner: dest xShortestEdge = xda; yShortestEdge = yda; - xMiddleEdge = xdo; yMiddleEdge = ydo; - xLongestEdge = xao; yLongestEdge = yao; shortestEdgeDist = dadist; middleEdgeDist = dodist; @@ -993,8 +974,6 @@ namespace TriangleNet /// smallest angle corner: apex /// largest angle corner: org xShortestEdge = xdo; yShortestEdge = ydo; - xMiddleEdge = xao; yMiddleEdge = yao; - xLongestEdge = xda; yLongestEdge = yda; shortestEdgeDist = dodist; middleEdgeDist = aodist; @@ -1009,8 +988,6 @@ namespace TriangleNet /// smallest angle corner: apex /// largest angle corner: dest xShortestEdge = xdo; yShortestEdge = ydo; - xMiddleEdge = xda; yMiddleEdge = yda; - xLongestEdge = xao; yLongestEdge = yao; shortestEdgeDist = dodist; middleEdgeDist = dadist; @@ -3959,10 +3936,10 @@ namespace TriangleNet double dxod, dyod, dxda, dyda, dxao, dyao; double dxod2, dyod2, dxda2, dyda2, dxao2, dyao2; - double apexlen, orglen, destlen, minedge; + double apexlen, orglen, destlen; double angle; // in order to check minimum angle condition - double maxangle, maxedge; // in order to check minimum angle condition + double maxangle; // in order to check minimum angle condition // calculate the side lengths dxod = x1 - x2; @@ -3987,64 +3964,48 @@ namespace TriangleNet // try to find the minimum edge and accordingly the pqr orientation if ((apexlen < orglen) && (apexlen < destlen)) { - // The edge opposite the apex is shortest. - minedge = apexlen; // Find the square of the cosine of the angle at the apex. angle = dxda * dxao + dyda * dyao; angle = angle * angle / (orglen * destlen); - - } else if (orglen < destlen) { - // The edge opposite the origin is shortest. - minedge = orglen; // Find the square of the cosine of the angle at the origin. angle = dxod * dxao + dyod * dyao; angle = angle * angle / (apexlen * destlen); - - } else { - // The edge opposite the destination is shortest. - minedge = destlen; // Find the square of the cosine of the angle at the destination. angle = dxod * dxda + dyod * dyda; angle = angle * angle / (apexlen * orglen); } + // try to find the maximum edge and accordingly the pqr orientation if ((apexlen > orglen) && (apexlen > destlen)) { - // The edge opposite the apex is longest. - maxedge = apexlen; // Find the cosine of the angle at the apex. maxangle = (orglen + destlen - apexlen) / (2 * Math.Sqrt(orglen * destlen)); } else if (orglen > destlen) { - // The edge opposite the origin is longest. - maxedge = orglen; // Find the cosine of the angle at the origin. maxangle = (apexlen + destlen - orglen) / (2 * Math.Sqrt(apexlen * destlen)); } else { - // The edge opposite the destination is longest. - maxedge = destlen; // Find the cosine of the angle at the destination. maxangle = (apexlen + orglen - destlen) / (2 * Math.Sqrt(apexlen * orglen)); } - // Check whether the angle is smaller than permitted. if ((angle > behavior.goodAngle) || (behavior.MaxAngle != 0.00 && maxangle < behavior.maxGoodAngle)) { return true;// it is a bad triangle } - return false;// it is a good triangle + return false;// it is a good triangle } /// diff --git a/Triangle.NET/Triangle/Topology/DCEL/Face.cs b/Triangle.NET/Triangle/Topology/DCEL/Face.cs index ade0bdc..7073920 100644 --- a/Triangle.NET/Triangle/Topology/DCEL/Face.cs +++ b/Triangle.NET/Triangle/Topology/DCEL/Face.cs @@ -8,7 +8,7 @@ namespace TriangleNet.Topology.DCEL { using System.Collections.Generic; using TriangleNet.Geometry; - + /// /// A face of DCEL mesh. ///