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:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace TriangleNet.Topology.DCEL
|
||||
{
|
||||
using System.Collections.Generic;
|
||||
using TriangleNet.Geometry;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A face of DCEL mesh.
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user