Skip to content

Commit 613ad53

Browse files
authored
Merge pull request #52 from YasarYY/master
Cancellation option is added to Triangulate, Refine and Smooth methods
2 parents f86e830 + 9de8c08 commit 613ad53

File tree

6 files changed

+36
-19
lines changed

6 files changed

+36
-19
lines changed

src/Triangle/Geometry/ExtensionMethods.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
namespace TriangleNet.Geometry
33
{
4-
using System;
4+
using System.Threading;
55
using TriangleNet.Meshing;
66

77
/// <summary>
@@ -34,9 +34,10 @@ public static IMesh Triangulate(this IPolygon polygon, ConstraintOptions options
3434
/// </summary>
3535
/// <param name="polygon">Polygon instance.</param>
3636
/// <param name="quality">Quality options.</param>
37-
public static IMesh Triangulate(this IPolygon polygon, QualityOptions quality)
37+
/// <param name="cancellationToken">A token that receives a cancellation notification when requested.</param>
38+
public static IMesh Triangulate(this IPolygon polygon, QualityOptions quality, CancellationToken cancellationToken = default)
3839
{
39-
return (new GenericMesher()).Triangulate(polygon, null, quality);
40+
return (new GenericMesher()).Triangulate(polygon, null, quality, cancellationToken);
4041
}
4142

4243
/// <summary>
@@ -45,9 +46,10 @@ public static IMesh Triangulate(this IPolygon polygon, QualityOptions quality)
4546
/// <param name="polygon">Polygon instance.</param>
4647
/// <param name="options">Constraint options.</param>
4748
/// <param name="quality">Quality options.</param>
48-
public static IMesh Triangulate(this IPolygon polygon, ConstraintOptions options, QualityOptions quality)
49+
/// <param name="cancellationToken">A token that receives a cancellation notification when requested.</param>
50+
public static IMesh Triangulate(this IPolygon polygon, ConstraintOptions options, QualityOptions quality, CancellationToken cancellationToken = default)
4951
{
50-
return (new GenericMesher()).Triangulate(polygon, options, quality);
52+
return (new GenericMesher()).Triangulate(polygon, options, quality, cancellationToken);
5153
}
5254

5355
/// <summary>

src/Triangle/Mesh.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace TriangleNet
99
{
1010
using System;
1111
using System.Collections.Generic;
12+
using System.Threading;
1213
using TriangleNet.Geometry;
1314
using TriangleNet.Meshing;
1415
using TriangleNet.Meshing.Data;
@@ -224,7 +225,8 @@ public Mesh(Configuration config, IList<Vertex> points)
224225
/// </summary>
225226
/// <param name="quality">The quality constraints.</param>
226227
/// <param name="delaunay">A value indicating, whether the refined mesh should be Conforming Delaunay.</param>
227-
public void Refine(QualityOptions quality, bool delaunay = false)
228+
/// <param name="cancellationToken">A token that receives a cancellation notification when requested.</param>
229+
public void Refine(QualityOptions quality, bool delaunay = false, CancellationToken cancellationToken = default)
228230
{
229231
invertices = vertices.Count;
230232

@@ -241,7 +243,7 @@ public void Refine(QualityOptions quality, bool delaunay = false)
241243
}
242244

243245
// Enforce angle and area constraints.
244-
qualityMesher.Apply(quality, delaunay);
246+
qualityMesher.Apply(quality, delaunay, cancellationToken);
245247
}
246248

247249
/// <summary>

src/Triangle/Meshing/GenericMesher.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace TriangleNet.Meshing
88
{
99
using System;
1010
using System.Collections.Generic;
11+
using System.Threading;
1112
using TriangleNet.Geometry;
1213
using TriangleNet.IO;
1314
using TriangleNet.Meshing.Algorithm;
@@ -96,10 +97,11 @@ public IMesh Triangulate(IPolygon polygon, ConstraintOptions options)
9697
/// </summary>
9798
/// <param name="polygon">The input polygon.</param>
9899
/// <param name="quality">The <see cref="QualityOptions"/>.</param>
100+
/// <param name="cancellationToken">A token that receives a cancellation notification when requested.</param>
99101
/// <returns>The mesh.</returns>
100-
public IMesh Triangulate(IPolygon polygon, QualityOptions quality)
102+
public IMesh Triangulate(IPolygon polygon, QualityOptions quality, CancellationToken cancellationToken = default)
101103
{
102-
return Triangulate(polygon, null, quality);
104+
return Triangulate(polygon, null, quality, cancellationToken);
103105
}
104106

105107
/// <summary>
@@ -108,8 +110,9 @@ public IMesh Triangulate(IPolygon polygon, QualityOptions quality)
108110
/// <param name="polygon">The input polygon.</param>
109111
/// <param name="options">The <see cref="ConstraintOptions"/>.</param>
110112
/// <param name="quality">The <see cref="QualityOptions"/>.</param>
113+
/// <param name="cancellationToken">A token that receives a cancellation notification when requested.</param>
111114
/// <returns>The mesh.</returns>
112-
public IMesh Triangulate(IPolygon polygon, ConstraintOptions options, QualityOptions quality)
115+
public IMesh Triangulate(IPolygon polygon, ConstraintOptions options, QualityOptions quality, CancellationToken cancellationToken = default)
113116
{
114117
var mesh = (Mesh)triangulator.Triangulate(polygon.Points, config);
115118

@@ -122,7 +125,7 @@ public IMesh Triangulate(IPolygon polygon, ConstraintOptions options, QualityOpt
122125
cmesher.Apply(polygon, options);
123126

124127
// Refine mesh.
125-
qmesher.Apply(quality);
128+
qmesher.Apply(quality, options?.ConformingDelaunay ?? false, cancellationToken);
126129

127130
return mesh;
128131
}

src/Triangle/Meshing/IMesh.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
namespace TriangleNet.Meshing
33
{
44
using System.Collections.Generic;
5+
using System.Threading;
56
using TriangleNet.Topology;
67
using TriangleNet.Geometry;
78

@@ -49,9 +50,8 @@ public interface IMesh
4950
/// Refine the mesh.
5051
/// </summary>
5152
/// <param name="quality">The quality constraints.</param>
52-
/// <param name="delaunay">
53-
/// A value indicating, whether the refined mesh should be Conforming Delaunay.
54-
/// </param>
55-
void Refine(QualityOptions quality, bool delaunay);
53+
/// <param name="delaunay">A value indicating, whether the refined mesh should be Conforming Delaunay.</param>
54+
/// <param name="cancellationToken">A token that receives a cancellation notification when requested.</param>
55+
void Refine(QualityOptions quality, bool delaunay, CancellationToken cancellationToken = default);
5656
}
5757
}

src/Triangle/Meshing/QualityMesher.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace TriangleNet.Meshing
99
{
1010
using System;
1111
using System.Collections.Generic;
12+
using System.Threading;
1213
using TriangleNet.Geometry;
1314
using TriangleNet.Meshing.Data;
1415
using TriangleNet.Topology;
@@ -55,7 +56,8 @@ public QualityMesher(Mesh mesh, Configuration config)
5556
/// </summary>
5657
/// <param name="quality">The quality constraints.</param>
5758
/// <param name="delaunay">A value indicating, whether the refined mesh should be Conforming Delaunay.</param>
58-
public void Apply(QualityOptions quality, bool delaunay = false)
59+
/// <param name="cancellationToken">A token that receives a cancellation notification when requested.</param>
60+
public void Apply(QualityOptions quality, bool delaunay = false, CancellationToken cancellationToken = default)
5961
{
6062
// Copy quality options
6163
if (quality != null)
@@ -98,7 +100,7 @@ public void Apply(QualityOptions quality, bool delaunay = false)
98100
if (behavior.Quality && mesh.triangles.Count > 0)
99101
{
100102
// Enforce angle and area constraints.
101-
EnforceQuality();
103+
EnforceQuality(cancellationToken);
102104
}
103105
}
104106

@@ -841,7 +843,7 @@ private void SplitTriangle(BadTriangle badtri)
841843
/// <summary>
842844
/// Remove all the encroached subsegments and bad triangles from the triangulation.
843845
/// </summary>
844-
private void EnforceQuality()
846+
private void EnforceQuality(CancellationToken cancellationToken)
845847
{
846848
BadTriangle badtri;
847849

@@ -864,6 +866,9 @@ private void EnforceQuality()
864866
mesh.checkquality = true;
865867
while ((queue.Count > 0) && (mesh.steinerleft != 0))
866868
{
869+
// throw an OperationCanceledException if cancellation is requested
870+
cancellationToken.ThrowIfCancellationRequested();
871+
867872
// Fix one bad triangle by inserting a vertex at its circumcenter.
868873
badtri = queue.Dequeue();
869874
SplitTriangle(badtri);

src/Triangle/Smoothing/SimpleSmoother.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// -----------------------------------------------------------------------
66

77
using System;
8+
using System.Threading;
89

910
namespace TriangleNet.Smoothing
1011
{
@@ -77,11 +78,12 @@ public SimpleSmoother(IVoronoiFactory factory, Configuration config)
7778
/// the previous and the current solutions. If their relative difference
7879
/// is not greater than the tolerance, the current solution is
7980
/// considered good enough already.</param>
81+
/// <param name="cancellationToken">A token that receives a cancellation notification when requested.</param>
8082
/// <returns>The number of actual iterations performed. It is 0 if a
8183
/// non-positive limit is passed. Otherwise, it is always a value
8284
/// between 1 and the limit (inclusive).
8385
/// </returns>
84-
public int Smooth(IMesh mesh, int limit = 10, double tol = .01)
86+
public int Smooth(IMesh mesh, int limit = 10, double tol = .01, CancellationToken cancellationToken = default)
8587
{
8688
if (limit <= 0)
8789
return 0;
@@ -106,6 +108,9 @@ public int Smooth(IMesh mesh, int limit = 10, double tol = .01)
106108
int i = 0;
107109
while (i < limit && Math.Abs(currMax - prevMax) > tol * currMax)
108110
{
111+
// throw an OperationCanceledException if cancellation is requested
112+
cancellationToken.ThrowIfCancellationRequested();
113+
109114
prevMax = currMax;
110115
currMax = Step(smoothedMesh, factory, predicates);
111116

0 commit comments

Comments
 (0)