Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions src/Triangle/Geometry/ExtensionMethods.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

namespace TriangleNet.Geometry
{
using System;
using System.Threading;
using TriangleNet.Meshing;

/// <summary>
Expand Down Expand Up @@ -34,9 +34,10 @@ public static IMesh Triangulate(this IPolygon polygon, ConstraintOptions options
/// </summary>
/// <param name="polygon">Polygon instance.</param>
/// <param name="quality">Quality options.</param>
public static IMesh Triangulate(this IPolygon polygon, QualityOptions quality)
/// <param name="cancellationToken">A token that receives a cancellation notification when requested.</param>
public static IMesh Triangulate(this IPolygon polygon, QualityOptions quality, CancellationToken cancellationToken = default)
{
return (new GenericMesher()).Triangulate(polygon, null, quality);
return (new GenericMesher()).Triangulate(polygon, null, quality, cancellationToken);
}

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

/// <summary>
Expand Down
6 changes: 4 additions & 2 deletions src/Triangle/Mesh.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ namespace TriangleNet
{
using System;
using System.Collections.Generic;
using System.Threading;
using TriangleNet.Geometry;
using TriangleNet.Meshing;
using TriangleNet.Meshing.Data;
Expand Down Expand Up @@ -224,7 +225,8 @@ public Mesh(Configuration config, IList<Vertex> points)
/// </summary>
/// <param name="quality">The quality constraints.</param>
/// <param name="delaunay">A value indicating, whether the refined mesh should be Conforming Delaunay.</param>
public void Refine(QualityOptions quality, bool delaunay = false)
/// <param name="cancellationToken">A token that receives a cancellation notification when requested.</param>
public void Refine(QualityOptions quality, bool delaunay = false, CancellationToken cancellationToken = default)
{
invertices = vertices.Count;

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

// Enforce angle and area constraints.
qualityMesher.Apply(quality, delaunay);
qualityMesher.Apply(quality, delaunay, cancellationToken);
}

/// <summary>
Expand Down
11 changes: 7 additions & 4 deletions src/Triangle/Meshing/GenericMesher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ namespace TriangleNet.Meshing
{
using System;
using System.Collections.Generic;
using System.Threading;
using TriangleNet.Geometry;
using TriangleNet.IO;
using TriangleNet.Meshing.Algorithm;
Expand Down Expand Up @@ -96,10 +97,11 @@ public IMesh Triangulate(IPolygon polygon, ConstraintOptions options)
/// </summary>
/// <param name="polygon">The input polygon.</param>
/// <param name="quality">The <see cref="QualityOptions"/>.</param>
/// <param name="cancellationToken">A token that receives a cancellation notification when requested.</param>
/// <returns>The mesh.</returns>
public IMesh Triangulate(IPolygon polygon, QualityOptions quality)
public IMesh Triangulate(IPolygon polygon, QualityOptions quality, CancellationToken cancellationToken = default)
{
return Triangulate(polygon, null, quality);
return Triangulate(polygon, null, quality, cancellationToken);
}

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

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

// Refine mesh.
qmesher.Apply(quality);
qmesher.Apply(quality, options?.ConformingDelaunay ?? false, cancellationToken);

return mesh;
}
Expand Down
8 changes: 4 additions & 4 deletions src/Triangle/Meshing/IMesh.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
namespace TriangleNet.Meshing
{
using System.Collections.Generic;
using System.Threading;
using TriangleNet.Topology;
using TriangleNet.Geometry;

Expand Down Expand Up @@ -49,9 +50,8 @@ public interface IMesh
/// Refine the mesh.
/// </summary>
/// <param name="quality">The quality constraints.</param>
/// <param name="delaunay">
/// A value indicating, whether the refined mesh should be Conforming Delaunay.
/// </param>
void Refine(QualityOptions quality, bool delaunay);
/// <param name="delaunay">A value indicating, whether the refined mesh should be Conforming Delaunay.</param>
/// <param name="cancellationToken">A token that receives a cancellation notification when requested.</param>
void Refine(QualityOptions quality, bool delaunay, CancellationToken cancellationToken = default);
}
}
11 changes: 8 additions & 3 deletions src/Triangle/Meshing/QualityMesher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ namespace TriangleNet.Meshing
{
using System;
using System.Collections.Generic;
using System.Threading;
using TriangleNet.Geometry;
using TriangleNet.Meshing.Data;
using TriangleNet.Topology;
Expand Down Expand Up @@ -55,7 +56,8 @@ public QualityMesher(Mesh mesh, Configuration config)
/// </summary>
/// <param name="quality">The quality constraints.</param>
/// <param name="delaunay">A value indicating, whether the refined mesh should be Conforming Delaunay.</param>
public void Apply(QualityOptions quality, bool delaunay = false)
/// <param name="cancellationToken">A token that receives a cancellation notification when requested.</param>
public void Apply(QualityOptions quality, bool delaunay = false, CancellationToken cancellationToken = default)
{
// Copy quality options
if (quality != null)
Expand Down Expand Up @@ -98,7 +100,7 @@ public void Apply(QualityOptions quality, bool delaunay = false)
if (behavior.Quality && mesh.triangles.Count > 0)
{
// Enforce angle and area constraints.
EnforceQuality();
EnforceQuality(cancellationToken);
}
}

Expand Down Expand Up @@ -841,7 +843,7 @@ private void SplitTriangle(BadTriangle badtri)
/// <summary>
/// Remove all the encroached subsegments and bad triangles from the triangulation.
/// </summary>
private void EnforceQuality()
private void EnforceQuality(CancellationToken cancellationToken)
{
BadTriangle badtri;

Expand All @@ -864,6 +866,9 @@ private void EnforceQuality()
mesh.checkquality = true;
while ((queue.Count > 0) && (mesh.steinerleft != 0))
{
// throw an OperationCanceledException if cancellation is requested
cancellationToken.ThrowIfCancellationRequested();

// Fix one bad triangle by inserting a vertex at its circumcenter.
badtri = queue.Dequeue();
SplitTriangle(badtri);
Expand Down
7 changes: 6 additions & 1 deletion src/Triangle/Smoothing/SimpleSmoother.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
// -----------------------------------------------------------------------

using System;
using System.Threading;

namespace TriangleNet.Smoothing
{
Expand Down Expand Up @@ -77,11 +78,12 @@ public SimpleSmoother(IVoronoiFactory factory, Configuration config)
/// the previous and the current solutions. If their relative difference
/// is not greater than the tolerance, the current solution is
/// considered good enough already.</param>
/// <param name="cancellationToken">A token that receives a cancellation notification when requested.</param>
/// <returns>The number of actual iterations performed. It is 0 if a
/// non-positive limit is passed. Otherwise, it is always a value
/// between 1 and the limit (inclusive).
/// </returns>
public int Smooth(IMesh mesh, int limit = 10, double tol = .01)
public int Smooth(IMesh mesh, int limit = 10, double tol = .01, CancellationToken cancellationToken = default)
{
if (limit <= 0)
return 0;
Expand All @@ -106,6 +108,9 @@ public int Smooth(IMesh mesh, int limit = 10, double tol = .01)
int i = 0;
while (i < limit && Math.Abs(currMax - prevMax) > tol * currMax)
{
// throw an OperationCanceledException if cancellation is requested
cancellationToken.ThrowIfCancellationRequested();

prevMax = currMax;
currMax = Step(smoothedMesh, factory, predicates);

Expand Down
Loading