Index: Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.Forms/Factories/MacroStabilityInwardsChartDataPointsFactory.cs =================================================================== diff -u -r70fcdcf73a30c29ab3a710b449d12a31022b3ab7 -rabaf857dd9adbb07113b33f4212efb95571ab145 --- Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.Forms/Factories/MacroStabilityInwardsChartDataPointsFactory.cs (.../MacroStabilityInwardsChartDataPointsFactory.cs) (revision 70fcdcf73a30c29ab3a710b449d12a31022b3ab7) +++ Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.Forms/Factories/MacroStabilityInwardsChartDataPointsFactory.cs (.../MacroStabilityInwardsChartDataPointsFactory.cs) (revision abaf857dd9adbb07113b33f4212efb95571ab145) @@ -24,6 +24,7 @@ using System.Linq; using Core.Common.Base.Data; using Core.Common.Base.Geometry; +using Core.Common.Utils.Extensions; using Core.Components.Chart.Data; using Ringtoets.MacroStabilityInwards.Data; using Ringtoets.MacroStabilityInwards.Primitives; @@ -278,12 +279,12 @@ } Point2D[] surfaceLineLocalGeometry = surfaceLine.LocalGeometry.ToArray(); - Point2D[] phreaticLineGeometry = waternetLine.PhreaticLine.Geometry.ToArray(); - Point2D[] waternetLineGeometry = waternetLine.Geometry.ToArray(); + Point2D[] phreaticLineGeometry = new RoundedPoint2DCollection(2, waternetLine.PhreaticLine.Geometry).ToArray(); + Point2D[] waternetLineGeometry = new RoundedPoint2DCollection(2, waternetLine.Geometry).ToArray(); return IsSurfaceLineAboveWaternetZone(surfaceLineLocalGeometry, waternetLineGeometry, phreaticLineGeometry) - ? CreateZoneAreas(waternetLineGeometry, phreaticLineGeometry) - : GetWaternetZoneWithSurfaceLineIntersection(surfaceLineLocalGeometry, waternetLineGeometry, phreaticLineGeometry); + ? CreateZoneAreas(waternetLineGeometry, phreaticLineGeometry).ToArray() + : GetWaternetZoneWithSurfaceLineIntersection(surfaceLineLocalGeometry, waternetLineGeometry, phreaticLineGeometry).ToArray(); } /// @@ -432,7 +433,14 @@ { IEnumerable waternetZoneAsPolygons = CreateZoneAreas(waternetLineGeometry, phreaticLineGeometry); - return waternetZoneAsPolygons.Select(waternetZoneAsPolygon => ClipWaternetZoneToSurfaceLine(surfaceLineLocalGeometry, waternetZoneAsPolygon)).ToArray(); + foreach (Point2D[] waternetZoneAsPolygon in waternetZoneAsPolygons) + { + Point2D[] areaPoints = ClipWaternetZoneToSurfaceLine(surfaceLineLocalGeometry, waternetZoneAsPolygon); + if (areaPoints.Any()) + { + yield return areaPoints; + } + } } private static Point2D[] ClipWaternetZoneToSurfaceLine(Point2D[] surfaceLineLocalGeometry, Point2D[] waternetZoneAsPolygon) @@ -478,20 +486,21 @@ double waternetZoneTop = waternetZoneIntersection.Max(p => p.Y); double waternetZoneBottom = waternetZoneIntersection.Min(p => p.Y); - if (waternetZoneBottom >= surfaceLineIntersection.Y) + double waternetBottomDelta = waternetZoneBottom - surfaceLineIntersection.Y; + double waternetTopDelta = waternetZoneTop - surfaceLineIntersection.Y; + + if ((Math.Abs(waternetBottomDelta) < 1e-6 || waternetBottomDelta > 0) && !intersectionPoints.Any(c => c.X.Equals(xCoordinate))) { continue; } - if (waternetZoneTop <= surfaceLineIntersection.Y) + if (Math.Abs(waternetTopDelta) < 1e-6 || waternetTopDelta < 0) { Point2D[] waternetZonePoints = waternetZoneIntersection.OrderBy(p => p.Y).ToArray(); bottomLine.Add(waternetZonePoints.First()); topLine.Add(waternetZonePoints.Last()); } - - if (waternetZoneTop > surfaceLineIntersection.Y && - waternetZoneBottom < surfaceLineIntersection.Y) + else if (waternetTopDelta > 0 && waternetBottomDelta < 0) { Point2D[] waternetZonePoints = waternetZoneIntersection.OrderBy(p => p.Y).ToArray(); bottomLine.Add(waternetZonePoints.First()); @@ -501,16 +510,28 @@ } var area = new List(); - area.AddRange(topLine); - area.AddRange(bottomLine.OrderByDescending(p => p.X)); - if (topLine.Any()) + if (AreaIsNotFlatLine(topLine, bottomLine)) { - area.Add(topLine.First()); + area.AddRange(topLine); + area.AddRange(bottomLine.OrderByDescending(p => p.X)); + if (topLine.Any()) + { + area.Add(topLine.First()); + } } - return area.ToArray(); } + private static bool AreaIsNotFlatLine(List topLine, List bottomLine) + { + Point2D[] topLineCoordinates = topLine.ToArray(); + Point2D[] bottomLineCoordinates = bottomLine.ToArray(); + + return topLineCoordinates.Length != bottomLineCoordinates.Length + || topLineCoordinates.Where((t, i) => !(Math.Abs(t.X - bottomLineCoordinates[i].X) < 1e-6) + || !(Math.Abs(t.Y - bottomLineCoordinates[i].Y) < 1e-6)).Any(); + } + private static bool IsSurfaceLineAboveWaternetZone(Point2D[] surfaceLineLocalGeometry, Point2D[] waternetLineGeometry, Point2D[] phreaticLineGeometry) { double surfaceLineLowestPointY = surfaceLineLocalGeometry.Min(p => p.Y); Index: Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Forms.Test/Factories/MacroStabilityInwardsChartDataPointsFactoryTest.cs =================================================================== diff -u -r70fcdcf73a30c29ab3a710b449d12a31022b3ab7 -rabaf857dd9adbb07113b33f4212efb95571ab145 --- Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Forms.Test/Factories/MacroStabilityInwardsChartDataPointsFactoryTest.cs (.../MacroStabilityInwardsChartDataPointsFactoryTest.cs) (revision 70fcdcf73a30c29ab3a710b449d12a31022b3ab7) +++ Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Forms.Test/Factories/MacroStabilityInwardsChartDataPointsFactoryTest.cs (.../MacroStabilityInwardsChartDataPointsFactoryTest.cs) (revision abaf857dd9adbb07113b33f4212efb95571ab145) @@ -1144,6 +1144,50 @@ }, zones[0], new Point2DComparerWithTolerance(1e-2)); } + [Test] + public void CreateWaternetZonePoints_WaternetLineOnSurfaceLineAndIntersectsPhreaticLine() + { + // Setup + var waternetLineGeometry = new[] + { + new Point2D(0, 2), + new Point2D(5, 4), + new Point2D(10, 7), + new Point2D(15, 10) + }; + var phreaticLineGeometry = new[] + { + new Point2D(0, 7), + new Point2D(10, 7), + new Point2D(15, -8) + }; + + var surfaceLine = new MacroStabilityInwardsSurfaceLine("Test"); + surfaceLine.SetGeometry(new[] + { + new Point3D(0, 2, 2), + new Point3D(5, 4, 4), + new Point3D(10, 7, 7), + new Point3D(15, 10, 10) + }); + + MacroStabilityInwardsWaternetLine waternetLine = CreateWaterNetLine(phreaticLineGeometry, waternetLineGeometry); + + // Call + Point2D[][] zones = MacroStabilityInwardsChartDataPointsFactory.CreateWaternetZonePoints(waternetLine, surfaceLine).ToArray(); + + // Assert + Assert.AreEqual(1, zones.Length); + CollectionAssert.AreEqual(new[] + { + new Point2D(11.18, 7), + new Point2D(15, 8.97), + new Point2D(15, -8), + new Point2D(11.18, 3.46), + new Point2D(11.18, 7) + }, zones[0], new Point2DComparerWithTolerance(1e-2)); + } + private static MacroStabilityInwardsWaternetLine CreateWaterNetLine(IEnumerable waternetLineGeometry, IEnumerable phreaticLineGeometry) {