Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryHelper.cs =================================================================== diff -u -r4897 -r4899 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryHelper.cs (.../GeometryHelper.cs) (revision 4897) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryHelper.cs (.../GeometryHelper.cs) (revision 4899) @@ -124,21 +124,19 @@ /// X position to cut the geometry. public static void CutGeometryLeft(GeometryData geometry, double atX) { - // TODO: This method is duplicated in SoilSurfaceProfile2D, should be refactored to a single method GeometryCurve intersectionCurve = GetIntersectionCurveAt(geometry, atX); // check if a curve intersects the atX, if so move point. GeometryCurve[] curves = geometry.Curves.ToArray(); foreach (GeometryCurve geometryCurve in curves) { - var resPoint = new Point2D(); var p1 = new Point2D(geometryCurve.HeadPoint.X, geometryCurve.HeadPoint.Z); var p2 = new Point2D(geometryCurve.EndPoint.X, geometryCurve.EndPoint.Z); // If head or endpoint is at atX, skip this curve if (Math.Abs(p1.X - atX) > GeometryConstants.Accuracy && Math.Abs(p2.X - atX) > GeometryConstants.Accuracy) { var p3 = new Point2D(intersectionCurve.HeadPoint.X, intersectionCurve.HeadPoint.Z); var p4 = new Point2D(intersectionCurve.EndPoint.X, intersectionCurve.EndPoint.Z); - LineIntersection res = Routines2D.DetermineIf2DLinesIntersectStrickly(p1, p2, p3, p4, out resPoint); + LineIntersection res = Routines2D.DetermineIf2DLinesIntersectStrickly(p1, p2, p3, p4, out Point2D resPoint); if (res == LineIntersection.Intersects) { var splitPoint = new Point2D(resPoint.X, resPoint.Z); @@ -150,6 +148,78 @@ } /// + /// Cuts the geometry right at the given value of x. + /// + /// The geometry. + /// X position to cut the geometry. + private static void CutGeometryRight(GeometryData geometry, double atX) + { + GeometryCurve intersectionCurve = GetIntersectionCurveAt(geometry, atX); + // check if a curve intersects the atX, if so move point. + GeometryCurve[] curves = geometry.Curves.ToArray(); + foreach (GeometryCurve geometryCurve in curves) + { + var p1 = new Point2D(geometryCurve.HeadPoint.X, geometryCurve.HeadPoint.Z); + var p2 = new Point2D(geometryCurve.EndPoint.X, geometryCurve.EndPoint.Z); + // If head or endpoint is at atX, skip this curve + if (Math.Abs(p1.X - atX) > GeometryConstants.Accuracy && Math.Abs(p2.X - atX) > GeometryConstants.Accuracy) + { + var p3 = new Point2D(intersectionCurve.HeadPoint.X, intersectionCurve.HeadPoint.Z); + var p4 = new Point2D(intersectionCurve.EndPoint.X, intersectionCurve.EndPoint.Z); + LineIntersection res = Routines2D.DetermineIf2DLinesIntersectStrickly(p1, p2, p3, p4, out Point2D resPoint); + if (res == LineIntersection.Intersects) + { + var splitPoint = new Point2D(resPoint.X, resPoint.Z); + // Split the curve at the split point + SplitCurveAtPoint(geometry, geometryCurve, splitPoint); + } + } + } + + // To ensure that curves right of the atX are removed when they are completely right (so no intersection) + // remove all points right of the at X. + Point2D[] points = geometry.Points.ToArray(); + for (var i = 0; i < points.Length; i++) + { + if (points[i].X > atX + GeometryConstants.Accuracy) + { + geometry.DeletePointWithCurves(points[i]); + } + } + + // Set the right boundary + geometry.Rebox(); + geometry.Right = atX; + + // Add missing vertical curves on the right boundary + List rightPoints = geometry.GetRightPoints().OrderBy(a => a.Z).ToList(); + AddMissingBoundaryCurves(geometry, rightPoints); + } + + /// + /// Adds the missing boundary curves. + /// + /// The geometry + /// The boundary points. + private static void AddMissingBoundaryCurves(GeometryData geometry, List boundaryPoints) + { + for (var i = 1; i < boundaryPoints.Count; i++) + { + // get the centerpoint of the "would be" curve + var midPoint = new Point2D((boundaryPoints[i - 1].X + boundaryPoints[i].X) / 2, + (boundaryPoints[i - 1].Z + boundaryPoints[i].Z) / 2); + // Check if the "would be" curve exists, if not add it + var existingCurves = new List(); + geometry.GetCurvesCoincidingWithPoint(midPoint, ref existingCurves); + if (existingCurves.Count == 0) + { + var newCurve = new GeometryCurve(boundaryPoints[i - 1], boundaryPoints[i]); + geometry.Curves.Add(newCurve); + } + } + } + + /// /// Gets the intersection curve which is a vertical helper line which can be used to find all intersections at a given x. /// /// The geometry. Index: DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/GeometryHelperTests.cs =================================================================== diff -u -r4898 -r4899 --- DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/GeometryHelperTests.cs (.../GeometryHelperTests.cs) (revision 4898) +++ DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/GeometryHelperTests.cs (.../GeometryHelperTests.cs) (revision 4899) @@ -113,13 +113,35 @@ // When GeometryHelper.CutGeometryLeft(soilProfile2D.Geometry, 2); // For debugging purposes - GeometryExporter.ExportToFile(soilProfile2D.Geometry, visualizationFolder + "Geometry.txt"); - GeometryExporter.ExportToJsonFile(soilProfile2D.Geometry, visualizationFolder + "Geometry.json"); + // GeometryExporter.ExportToFile(soilProfile2D.Geometry, visualizationFolder + "Geometry.txt"); + // GeometryExporter.ExportToJsonFile(soilProfile2D.Geometry, visualizationFolder + "Geometry.json"); // Then GeometryBounds geometryBounds = soilProfile2D.Geometry.GetGeometryBounds(); Assert.That(geometryBounds.Left, Is.EqualTo(2).Within(cTolerance)); Assert.That(soilProfile2D.Geometry.Left, Is.EqualTo(2).Within(cTolerance)); Assert.That(soilProfile2D.Geometry.Surfaces.Count, Is.EqualTo(3)); } + + [Test, Ignore("Work in progress")] + public void GivenTwoLayerGeometryWhenCuttingRightThenRightBoundaryIsChanged() + { + // Given + SoilProfile2D soilProfile2D = FactoryForSoilProfiles.CreateSoilProfile2DWithThreeLayers(); + // For debugging purposes + // GeometryExporter.ExportToFile(soilProfile2D.Geometry, visualizationFolder + "Geometry.txt"); + // GeometryExporter.ExportToJsonFile(soilProfile2D.Geometry, visualizationFolder + "Geometry.json"); + + // When + GeometryHelper.CutGeometryLeft(soilProfile2D.Geometry, 8); + // For debugging purposes + // GeometryExporter.ExportToFile(soilProfile2D.Geometry, visualizationFolder + "Geometry.txt"); + // GeometryExporter.ExportToJsonFile(soilProfile2D.Geometry, visualizationFolder + "Geometry.json"); + + // Then + GeometryBounds geometryBounds = soilProfile2D.Geometry.GetGeometryBounds(); + Assert.That(geometryBounds.Right, Is.EqualTo(8).Within(cTolerance)); + Assert.That(soilProfile2D.Geometry.Right, Is.EqualTo(8).Within(cTolerance)); + Assert.That(soilProfile2D.Geometry.Surfaces.Count, Is.EqualTo(3)); + } } \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs =================================================================== diff -u -r4897 -r4899 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 4897) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 4899) @@ -246,6 +246,30 @@ } /// + /// 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 + } + } + } + + /// /// Returns a that represents this instance. /// ///