Index: DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geometry/GeometryDataTests.cs =================================================================== diff -u -r5498 -r5526 --- DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geometry/GeometryDataTests.cs (.../GeometryDataTests.cs) (revision 5498) +++ DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geometry/GeometryDataTests.cs (.../GeometryDataTests.cs) (revision 5526) @@ -96,8 +96,69 @@ Assert.That(line.CalcPoints.OrderBy(p => p.X).First().X, Is.EqualTo(1.0)); Assert.That(line.CalcPoints.OrderByDescending(p => p.X).First().X, Is.EqualTo(10.0)); } + + [Test] + public void GeometryDataTestClear() + { + GeometryData gData = CreateGeometrySurface(); + Assert.Multiple(() => + { + Assert.That(gData.Points.Count, Is.EqualTo(6)); + Assert.That(gData.Curves.Count, Is.EqualTo(7)); + Assert.That(gData.Loops.Count, Is.EqualTo(2)); + Assert.That(gData.Surfaces.Count, Is.EqualTo(2)); + }); + gData.Clear(); + Assert.Multiple(() => + { + Assert.That(gData.Points.Count, Is.EqualTo(0)); + Assert.That(gData.Curves.Count, Is.EqualTo(0)); + Assert.That(gData.Loops.Count, Is.EqualTo(0)); + Assert.That(gData.Surfaces.Count, Is.EqualTo(0)); + Assert.That(gData.NewlyEffectedPoints.Count, Is.EqualTo(0)); + Assert.That(gData.NewlyEffectedCurves.Count, Is.EqualTo(0)); + }); + } [Test] + public void GeometryDataTestGetRightCurves() + { + GeometryData gData = CreateGeometrySurface(); + var rightCurves = gData.GetRightCurves(); + Assert.Multiple(() => + { + Assert.That(rightCurves.Count, Is.EqualTo(5)); + Assert.That(rightCurves[0].HeadPoint.X, Is.EqualTo(1.0)); + Assert.That(rightCurves[0].EndPoint.X, Is.EqualTo(10.0)); + Assert.That(rightCurves[1].HeadPoint.X, Is.EqualTo(10.0)); + Assert.That(rightCurves[1].EndPoint.X, Is.EqualTo(10.0)); + Assert.That(rightCurves[0].HeadPoint.Z, Is.EqualTo(0.0)); + Assert.That(rightCurves[0].EndPoint.Z, Is.EqualTo(0.0)); + Assert.That(rightCurves[1].HeadPoint.Z, Is.EqualTo(0.0)); + Assert.That(rightCurves[1].EndPoint.Z, Is.EqualTo(5.0)); + }); + } + + [Test] + public void GeometryDataTestGetLeftCurves() + { + GeometryData gData = CreateGeometrySurface(); + var leftCurves = gData.GetLeftCurves(); + Assert.Multiple(() => + { + Assert.That(leftCurves.Count, Is.EqualTo(5)); + Assert.That(leftCurves[0].HeadPoint.X, Is.EqualTo(1.0)); + Assert.That(leftCurves[0].EndPoint.X, Is.EqualTo(10.0)); + Assert.That(leftCurves[1].HeadPoint.X, Is.EqualTo(10.0)); + Assert.That(leftCurves[1].EndPoint.X, Is.EqualTo(1.0)); + Assert.That(leftCurves[0].HeadPoint.Z, Is.EqualTo(0.0)); + Assert.That(leftCurves[0].EndPoint.Z, Is.EqualTo(0.0)); + Assert.That(leftCurves[1].HeadPoint.Z, Is.EqualTo(10.0)); + Assert.That(leftCurves[1].EndPoint.Z, Is.EqualTo(10.0)); + }); + } + + [Test] public void TestSimpleGeneration() { var geom = new GeometryData @@ -172,46 +233,6 @@ } } - [Test] - [TestCase(0, 0, 3, 0, 2, 4)] - [TestCase(0, 10, 3, 2, 3, 5)] - [TestCase(10, 10, 3, 1, 2, 4)] - [TestCase(10, 0, 3, 0, 1, 5)] - [TestCase(5, 5, 2, 4, 5, -1)] - [TestCase(1, 1, 1, 4, -1, -1)] - [TestCase(9, 1, 1, 5, -1, -1)] - [TestCase(1, 3, 0, -1, -1, -1)] - public void GivenPointsWhenGetCurvesCoincidingWithPointCalledThenCorrectCurvesAreReturned(double x, double z, int curveCount, int curve1, int curve2, int curve3) - { - var geometryModel = new GeometryData(); - // The following model looks as follows - // _______ - // |\ /| - // | \ / | - // | X | - // | / \ | - // |/___\| - geometryModel.Curves.AddRange(new[] - { - new GeometryCurve(new Point2D(0, 0), new Point2D(10, 0)), // index 0 - new GeometryCurve(new Point2D(10, 0), new Point2D(10, 10)), // index 1 - new GeometryCurve(new Point2D(10, 10), new Point2D(0, 10)), // index 2 - new GeometryCurve(new Point2D(0, 10), new Point2D(0, 0)), // index 3 - new GeometryCurve(new Point2D(0, 0), new Point2D(10, 10)), // index 4 - new GeometryCurve(new Point2D(10, 0), new Point2D(0, 10)) // index 5 - }); - var curveList = new List(); - geometryModel.GetCurvesCoincidingWithPoint(new Point2D(x, z), ref curveList); - Assert.Multiple(() => - { - Assert.That(curveList.Count, Is.EqualTo(curveCount)); - if (curveCount > 0 && curve1 >= 0) - { - Assert.That(curveList[0].Equals(geometryModel.Curves[curve1]), Is.True); - } - }); - } - private GeometryData CreateGeometrySurface() { var geometryModel = new GeometryData(); @@ -260,6 +281,7 @@ geometryModel.NewlyEffectedPoints.AddRange(geometryModel.Points); geometryModel.NewlyEffectedCurves.AddRange(geometryModel.Curves); geometryModel.RegenerateGeometry(); + geometryModel.Rebox(); return geometryModel; } Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs =================================================================== diff -u -r5498 -r5526 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 5498) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 5526) @@ -24,7 +24,6 @@ using System.Linq; using Deltares.DamEngine.Data.Standard; using Deltares.DamEngine.Data.Standard.Language; -using Deltares.DamEngine.Data.Standard.Validation; namespace Deltares.DamEngine.Data.Geometry; @@ -34,7 +33,7 @@ /// public class GeometryData : GeometryObject { - private readonly GeometryPointString surfaceLine = new GeometryPointString(); + private readonly GeometryPointString surfaceLine = new(); private GeometryGenerator geometryGenerator; private bool isRegeneratingGeometry; @@ -104,7 +103,7 @@ /// /// Deletes all the loose curves. /// Returns true when the loose curve is inside publisherEventArgs surface. - /// Calls Regeneration if the funtion returns true. + /// Calls Regeneration if the function returns true. /// public void DeleteLooseCurves() { @@ -207,30 +206,6 @@ } /// - /// Gets the list of curves which contain the given point. - /// - /// The point - /// The curves containg the point - public void GetCurvesCoincidingWithPoint(Point2D point2D, ref List curveList) - { - curveList.Clear(); - - int curveCount = Curves.Count; - - // loop through the list of curves, check if point on line - for (var index = 0; index < curveCount; index++) - { - GeometryCurve curve = Curves[index]; - - // does the input point exist in this line (within aValue1 tolerance) - if (Routines2D.DoesPointExistInLine(curve.HeadPoint, curve.EndPoint, point2D, GeometryConstants.Accuracy)) - { - curveList.Add(curve); // add to list - } - } - } - - /// /// Updates the line at the top of the geometry /// public void UpdateSurfaceLine() @@ -628,7 +603,7 @@ isExistingPoint = false; // try to find the requested point in Points - Point2D newPoint = GetNewPointFromPointsByLocation(requestedPoint); + Point2D newPoint = GetPointAtLocation(requestedPoint); if (newPoint != null) { @@ -679,24 +654,6 @@ } } - /// - /// Tries to find the given points in points and returns a new copy when it does - /// - /// - /// the new copy of the given point if found else null - private Point2D GetNewPointFromPointsByLocation(Point2D point2D) - { - for (var index = 0; index < Points.Count; ++index) - { - if (Routines2D.DetermineIfPointsCoincide(point2D.X, point2D.Z, Points[index].X, Points[index].Z, GeometryConstants.Accuracy)) - { - return new Point2D(Points[index].X, Points[index].Z); - } - } - - return null; - } - private void CheckForCurvesWherePointIsOnBothConnectedCurvesInLineWithEachOther(Point2D aPoint, List source) { var line1Point1 = new Point2D(); @@ -747,44 +704,44 @@ /// /// The points. /// - public List Points { get; } = new List(); + public List Points { get; } = new(); /// /// Gets the newly effected points. /// /// /// The newly effected points. /// - public List NewlyEffectedPoints { get; } = new List(); + public List NewlyEffectedPoints { get; } = []; /// /// gets the Curve data list. /// /// /// The curves. /// - public List Curves { get; } = new List(); + public List Curves { get; } = []; /// /// Gets the newly effected curves. /// /// /// The newly effected curves. /// - public List NewlyEffectedCurves { get; } = new List(); + public List NewlyEffectedCurves { get; } = []; /// /// gets the Loop data list. /// /// /// The loops. /// - public List Loops { get; } = new List(); + public List Loops { get; } = []; /// /// gets the Surface data list. /// - public List Surfaces { get; } = new List(); + public List Surfaces { get; } = []; /// /// (Re-)generates the geometry @@ -917,63 +874,82 @@ /// public void RemoveDoublesFromNewlyEffectedPointsAndCurves() { - var pdel = new List(); - Point2D[] par = NewlyEffectedPoints.ToArray(); - for (var i = 0; i < par.Length; i++) + RemoveDoublesFromNewlyEffectedPoints(); + + RemoveDoublesFromNewlyEffectedCurves(); + } + + private void RemoveDoublesFromNewlyEffectedCurves() + { + RemoveIllegalDoublesFromNewlyEffectedCurves(); + + RemoveRealDoublesFromNewlyEffectedCurves(); + } + + private void RemoveRealDoublesFromNewlyEffectedCurves() + { + GeometryCurve[] curvesAsArray = NewlyEffectedCurves.ToArray(); + var curvesToDelete = new List(); + for (var i = 0; i < curvesAsArray.Length; i++) { - for (int j = i; j < par.Length; j++) + for (int j = i; j < curvesAsArray.Length; j++) { - if (i != j && par[i].LocationEquals(par[j])) + if (i != j && curvesAsArray[i].LocationEquals(curvesAsArray[j])) { - if (!pdel.Contains(par[j])) + if (!curvesToDelete.Contains(curvesAsArray[j])) { - pdel.Add(par[j]); + curvesToDelete.Add(curvesAsArray[j]); } } } } - foreach (Point2D point in pdel) + foreach (GeometryCurve curve in curvesToDelete) { - NewlyEffectedPoints.Remove(point); + NewlyEffectedCurves.Remove(curve); } + } - var cdel = new List(); - GeometryCurve[] car = NewlyEffectedCurves.ToArray(); - // First remove all "illegal" newlyeffected curves - for (var i = 0; i < car.Length; i++) + private void RemoveIllegalDoublesFromNewlyEffectedCurves() + { + var curvesToDelete = new List(); + + GeometryCurve[] curvesAsArray = NewlyEffectedCurves.ToArray(); + for (var i = 0; i < curvesAsArray.Length; i++) { - if (car[i].HeadPoint == null || car[i].EndPoint == null || car[i].HeadPoint.LocationEquals(car[i].EndPoint)) + if (curvesAsArray[i].HeadPoint == null || curvesAsArray[i].EndPoint == null || curvesAsArray[i].HeadPoint.LocationEquals(curvesAsArray[i].EndPoint)) { - cdel.Add(car[i]); + curvesToDelete.Add(curvesAsArray[i]); } } - foreach (GeometryCurve curve in cdel) + foreach (GeometryCurve curve in curvesToDelete) { NewlyEffectedCurves.Remove(curve); } + } - // then remove all real doubles - GeometryCurve[] car2 = NewlyEffectedCurves.ToArray(); - cdel.Clear(); - for (var i = 0; i < car2.Length; i++) + private void RemoveDoublesFromNewlyEffectedPoints() + { + var pointsToDelete = new List(); + Point2D[] pointsAsArray = NewlyEffectedPoints.ToArray(); + for (var i = 0; i < pointsAsArray.Length; i++) { - for (int j = i; j < car2.Length; j++) + for (int j = i; j < pointsAsArray.Length; j++) { - if (i != j && car2[i].LocationEquals(car2[j])) + if (i != j && pointsAsArray[i].LocationEquals(pointsAsArray[j])) { - if (!cdel.Contains(car2[j])) + if (!pointsToDelete.Contains(pointsAsArray[j])) { - cdel.Add(car2[j]); + pointsToDelete.Add(pointsAsArray[j]); } } } } - foreach (GeometryCurve curve in cdel) + foreach (Point2D point in pointsToDelete) { - NewlyEffectedCurves.Remove(curve); + NewlyEffectedPoints.Remove(point); } } @@ -1086,6 +1062,7 @@ Points.Clear(); Curves.Clear(); Surfaces.Clear(); + Loops.Clear(); NewlyEffectedPoints.Clear(); NewlyEffectedCurves.Clear(); }