diff --git a/src/Triangle.Examples/Examples/ExamplePar.cs b/src/Triangle.Examples/Examples/ExamplePar.cs index a98a08e..f047642 100644 --- a/src/Triangle.Examples/Examples/ExamplePar.cs +++ b/src/Triangle.Examples/Examples/ExamplePar.cs @@ -48,7 +48,8 @@ namespace TriangleNet.Examples var config = new Configuration() { Predicates = () => predicates, - TrianglePool = () => pool.Restart() + TrianglePool = () => pool.Restart(), + RandomSource = () => Random.Shared }; var triangulator = new Dwyer(); @@ -118,7 +119,8 @@ namespace TriangleNet.Examples var config = new Configuration() { Predicates = () => predicates, - TrianglePool = () => pool.Restart() + TrianglePool = () => pool.Restart(), + RandomSource = () => Random.Shared }; var mesher = new GenericMesher(config); diff --git a/src/Triangle/Configuration.cs b/src/Triangle/Configuration.cs index c8add8c..70d7d43 100644 --- a/src/Triangle/Configuration.cs +++ b/src/Triangle/Configuration.cs @@ -34,11 +34,12 @@ namespace TriangleNet /// Initializes a new instance of the class. /// /// Factory method for . - /// Factory method for . + /// Factory method for . public Configuration(Func predicates, Func trianglePool) { Predicates = predicates; TrianglePool = trianglePool; + RandomSource = () => new Random(); } /// @@ -47,8 +48,13 @@ namespace TriangleNet public Func Predicates { get; set; } /// - /// Gets or sets the factory method for the . + /// Gets or sets the factory method for the . /// public Func TrianglePool { get; set; } + + /// + /// Gets or sets the factory method for a source. + /// + public Func RandomSource { get; set; } } } diff --git a/src/Triangle/Mesh.cs b/src/Triangle/Mesh.cs index b17cc89..a052768 100644 --- a/src/Triangle/Mesh.cs +++ b/src/Triangle/Mesh.cs @@ -214,7 +214,7 @@ namespace TriangleNet predicates = config.Predicates(); - locator = new TriangleLocator(this, predicates); + locator = new TriangleLocator(this, predicates, config.RandomSource()); TransferNodes(points); } diff --git a/src/Triangle/TriangleLocator.cs b/src/Triangle/TriangleLocator.cs index ec6f807..05b2295 100644 --- a/src/Triangle/TriangleLocator.cs +++ b/src/Triangle/TriangleLocator.cs @@ -7,6 +7,7 @@ namespace TriangleNet { + using System; using TriangleNet.Geometry; using TriangleNet.Topology; @@ -24,35 +25,26 @@ namespace TriangleNet /// public class TriangleLocator { - TriangleSampler sampler; - Mesh mesh; - - IPredicates predicates; + private readonly TriangleSampler sampler; + private readonly Mesh mesh; + private readonly IPredicates predicates; // Pointer to a recently visited triangle. Improves point location if // proximate vertices are inserted sequentially. internal Otri recenttri; - /// - /// Initializes a new instance of the class. - /// - /// The mesh. - public TriangleLocator(Mesh mesh) - : this(mesh, RobustPredicates.Default) - { - } - /// /// Initializes a new instance of the class. /// /// The mesh. /// The predicates. - public TriangleLocator(Mesh mesh, IPredicates predicates) + /// The random source used in . + public TriangleLocator(Mesh mesh, IPredicates predicates, Random random) { this.mesh = mesh; this.predicates = predicates; - sampler = new TriangleSampler(mesh); + sampler = new TriangleSampler(mesh, random); } /// diff --git a/src/Triangle/TriangleSampler.cs b/src/Triangle/TriangleSampler.cs index 519a37a..cf9ab0d 100644 --- a/src/Triangle/TriangleSampler.cs +++ b/src/Triangle/TriangleSampler.cs @@ -16,13 +16,11 @@ namespace TriangleNet /// class TriangleSampler : IEnumerable { - private const int RANDOM_SEED = 110503; - // Empirically chosen factor. private const int samplefactor = 11; - private Random random; - private Mesh mesh; + private readonly Random random; + private readonly Mesh mesh; // Number of random samples for point location (at least 1). private int samples = 1; @@ -30,11 +28,6 @@ namespace TriangleNet // Number of triangles in mesh. private int triangleCount = 0; - public TriangleSampler(Mesh mesh) - : this(mesh, new Random(RANDOM_SEED)) - { - } - public TriangleSampler(Mesh mesh, Random random) { this.mesh = mesh; @@ -46,8 +39,8 @@ namespace TriangleNet /// public void Reset() { - this.samples = 1; - this.triangleCount = 0; + samples = 1; + triangleCount = 0; } ///