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.
///
///