Fix structured mesh generation (GenericMesher);

Code cleanup;

git-svn-id: https://triangle.svn.codeplex.com/svn@78535 0e2699bc-83d4-4a8f-98e7-55e24ab8c7a5
This commit is contained in:
SND\wo80_cp
2016-02-24 23:47:55 +00:00
parent 128cee6e22
commit 3c20831c10
7 changed files with 17 additions and 64 deletions
+5 -4
View File
@@ -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
/// <summary>
/// Reads geometry information from .node or .poly files.
/// </summary>
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);
}
}
@@ -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;
@@ -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));
@@ -18,12 +18,10 @@ namespace TriangleNet.Meshing.Iterators
/// </summary>
public class RegionIterator
{
Mesh mesh;
List<Triangle> viri;
public RegionIterator(Mesh mesh)
{
this.mesh = mesh;
this.viri = new List<Triangle>();
}
@@ -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.
@@ -9,12 +9,8 @@ namespace TriangleNet.Meshing.Iterators
{
List<Otri> cache = new List<Otri>();
Mesh mesh;
public VertexCirculator(Mesh mesh)
{
this.mesh = mesh;
mesh.MakeVertexMap();
}
+7 -46
View File
@@ -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
}
/// <summary>
+1 -1
View File
@@ -8,7 +8,7 @@ namespace TriangleNet.Topology.DCEL
{
using System.Collections.Generic;
using TriangleNet.Geometry;
/// <summary>
/// A face of DCEL mesh.
/// </summary>