// Copyright (C) Stichting Deltares 2019. All rights reserved. // // This file is part of the Dam Engine. // // The Dam Engine is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // // All names, logos, and references to "Deltares" are registered trademarks of // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. using Deltares.DamEngine.Calculators.DikesDesign; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Geotechnics; using NUnit.Framework; namespace Deltares.DamEngine.Calculators.Tests.DikesDesign { /// /// Class for testing SurfaceLineSlopeAdapter /// [TestFixture] public class SurfaceLineSlopeAdapterTest { private readonly Location location = new Location(); /// /// Tests the fixture tear down. /// [TestFixtureTearDown] public void TestFixtureTearDown() { } private static SurfaceLine2 CreateSimpleDike() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(1, 1, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(2, 1, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(3, 0, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(100, 0, CharacteristicPointType.SurfaceLevelInside); return surfaceLine; } #region ConstructWithDeltaX [Test] public void ConstructNewSurfaceLineReturnsANewSurfaceLine() { var surfaceLine = CreateSimpleDike(); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); var constructNewSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(1); Assert.IsNotNull(constructNewSurfaceLine); } [Test] public void AdaptedSimpleDikeLineHasCorrectNewToeDikeAtPolder() { var surfaceLine = CreateSimpleDike(); var pointDikeToeAtPolder = new GeometryPoint { X = 3, Z = 0 }; surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(1.0); var expectedPointDikeToeAtPolder = new GeometryPoint { X = 4, Z = 0 }; Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); } [Test] public void AdaptedDikeWithShoulderHasCorrectPointsAfterToeSlope() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 }; var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; var pointSurfaceLevelInside = new GeometryPoint { X = 20, Z = 0 }; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); const double deltaX = 1.0; var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX); var expectedPointShoulderBaseInside = new GeometryPoint { X = pointShoulderBaseInside.X + deltaX, Z = pointShoulderBaseInside.Z }; var expectedPointShoulderTopInside = new GeometryPoint { X = pointShoulderTopInside.X, Z = pointShoulderTopInside.Z }; var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X, Z = pointDikeToeAtPolder.Z }; var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; Assert.IsTrue(expectedPointShoulderBaseInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside))); Assert.IsTrue(expectedPointShoulderTopInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderTopInside))); Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); } [Test] public void AdaptedDikeWithDitchHasCorrectPointsAfterToeSlope() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; var pointSurfaceLevelInside = new GeometryPoint { X = 30, Z = 0 }; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); const double deltaX = 1.0; const double deltaXDitch = 3; var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX); var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X + deltaX, Z = pointDikeToeAtPolder.Z }; var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X + deltaX + deltaXDitch, Z = pointDitchDikeSide.Z }; var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X + deltaX + deltaXDitch, Z = pointBottomDitchDikeSide.Z }; var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X + deltaX + deltaXDitch, Z = pointBottomDitchPolderSide.Z }; var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X + deltaX + deltaXDitch, Z = pointDitchPolderSide.Z }; var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide))); Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide))); Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide))); Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide))); Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); } [Test] public void AdaptedDikeWithShoulderAndDitchHasCorrectPointsAfterToeSlope() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 }; var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); const double deltaX = 1.0; var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX); var expectedPointShoulderBaseInside = new GeometryPoint { X = pointShoulderBaseInside.X + deltaX, Z = pointShoulderBaseInside.Z }; var expectedPointShoulderTopInside = new GeometryPoint { X = pointShoulderTopInside.X, Z = pointShoulderTopInside.Z }; var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X, Z = pointDikeToeAtPolder.Z }; var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X, Z = pointDitchDikeSide.Z }; var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X, Z = pointBottomDitchDikeSide.Z }; var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X, Z = pointBottomDitchPolderSide.Z }; var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X, Z = pointDitchPolderSide.Z }; var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; Assert.IsTrue(expectedPointShoulderBaseInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside))); Assert.IsTrue(expectedPointShoulderTopInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderTopInside))); Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide))); Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide))); Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide))); Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide))); Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); } [Test] public void AdaptedSimpleDikeLineWithInBetweenPointOnInsideSlopeHasCorrectNewToeDikeAtPolder() { var surfaceLine = CreateSimpleDike(); surfaceLine.EnsurePoint(2.5, 0.4); // in between point on inside slope surfaceLine.SortPoints(); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(1.0); var expectedPointDikeToeAtPolder = new GeometryPoint { X = 4, Z = 0 }; Assert.AreEqual(6, surfaceLine.Geometry.Count); Assert.AreEqual(5, adaptedSurfaceLine.Geometry.Count); // in between point should be thrown away Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); } [Test] public void AdaptedSurfaceLineWithTrafficLoadPointsHasAdjustedPoints() { const double cTolerance = 0.0000001; // Create the base surfaceline (dike with shoulder and ditch) var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 }; var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; var pointSurfaceLevelInside = new GeometryPoint { X = 20, Z = 0 }; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var pointTrafficLoadOutside = new GeometryPoint { X = 7, Z = 2.3333333333 }; var pointTrafficLoadInside = new GeometryPoint { X = 8, Z = 1.6666666667 }; surfaceLine.EnsurePointOfType(pointTrafficLoadOutside.X, pointTrafficLoadOutside.Z, CharacteristicPointType.TrafficLoadOutside); surfaceLine.EnsurePointOfType(pointTrafficLoadInside.X, pointTrafficLoadInside.Z, CharacteristicPointType.TrafficLoadInside); surfaceLine.SortPoints(); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); const double deltaX = 1.0; SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX); GeometryPoint expectedPointTrafficLoadOutside = new GeometryPoint { X = 7, Z = 2.5 }; GeometryPoint expectedPointTrafficLoadInside = new GeometryPoint { X = 8, Z = 2.0 }; Assert.AreEqual(expectedPointTrafficLoadOutside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X, cTolerance); Assert.AreEqual(expectedPointTrafficLoadInside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).X, cTolerance); Assert.AreEqual(expectedPointTrafficLoadOutside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).Z, cTolerance); Assert.AreEqual(expectedPointTrafficLoadInside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).Z, cTolerance); pointTrafficLoadOutside = new GeometryPoint { X = 9.5, Z = 1.0 }; pointTrafficLoadInside = new GeometryPoint { X = 10.5, Z = 1.0 }; surfaceLine.EnsurePointOfType(pointTrafficLoadOutside.X, pointTrafficLoadOutside.Z, CharacteristicPointType.TrafficLoadOutside); surfaceLine.EnsurePointOfType(pointTrafficLoadInside.X, pointTrafficLoadInside.Z, CharacteristicPointType.TrafficLoadInside); surfaceLine.SortPoints(); surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX); expectedPointTrafficLoadOutside = new GeometryPoint { X = 9.5, Z = 1.25 }; expectedPointTrafficLoadInside = new GeometryPoint { X = 10.5, Z = 1.0 }; Assert.AreEqual(expectedPointTrafficLoadOutside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X, cTolerance); Assert.AreEqual(expectedPointTrafficLoadInside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).X, cTolerance); Assert.AreEqual(expectedPointTrafficLoadOutside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).Z, cTolerance); Assert.AreEqual(expectedPointTrafficLoadInside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).Z, cTolerance); } #endregion #region ConstructWithSlopeTangent [Test] [ExpectedException(typeof(SurfaceLineAdapterException))] public void IsExceptionThrownIfSlopeDoesNotIntersectSurfaceLine() { var surfaceLine = CreateSimpleDike(); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); surfaceLineAdapter.ConstructNewSurfaceLineBySlope(0); } [Test] public void IsNotExceptionThrownIfSlopeEqualsTheCurrentSlope() { var surfaceLine = CreateSimpleDike(); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); Assert.IsNotNull(surfaceLineAdapter.ConstructNewSurfaceLineBySlope(1.0)); } [Test] public void ConstructNewSurfaceLineBySlopeReturnsANewSurfaceLine() { var surfaceLine = CreateSimpleDike(); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); Assert.IsNotNull(surfaceLineAdapter.ConstructNewSurfaceLineBySlope(0.9)); } [Test] public void AdaptedSimpleDikeLineBySlopeHasCorrectNewToeDikeAtPolder() { var surfaceLine = CreateSimpleDike(); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); const double slopeTangent = 1.0 / 3.0; var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); var expectedPointDikeToeAtPolder = new GeometryPoint { X = 5, Z = 0 }; Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); } [Test] public void AdaptedDikeWithShoulderBySlopeHasCorrectPointsAfterToeSlope() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 }; var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); const double slopeTangent = 1.0 / 4.0; var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); const double deltaX = 4.0; var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X + deltaX, Z = pointDikeToeAtPolder.Z }; var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside)); Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside)); Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); } [Test] public void AdaptedDikeWithDitchBySlopeHasCorrectPointsAfterToeSlope() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); const double slopeTangent = 1.0 / 4.0; var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); const double deltaX = 4.0; const double deltaXDitch = 3; var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X + deltaX, Z = pointDikeToeAtPolder.Z }; var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X + deltaX + deltaXDitch, Z = pointDitchDikeSide.Z }; var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X + deltaX + deltaXDitch, Z = pointBottomDitchDikeSide.Z }; var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X + deltaX + deltaXDitch, Z = pointBottomDitchPolderSide.Z }; var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X + deltaX + deltaXDitch, Z = pointDitchPolderSide.Z }; var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide))); Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide))); Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide))); Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide))); Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); } [Test] [ExpectedException(typeof(SurfaceLineAdapterException))] public void IsExceptionThrownWhenSlopeDoesNotFit() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; var pointSurfaceLevelInside = new GeometryPoint { X = 20, Z = 0 }; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); const double slopeTangent = 1.0 / 4.0; surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); } [Test] public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsBeyondDikeToe() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 }; var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); const double slopeTangent = 1.0 / 4.0; var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); const double deltaX = 4.0; const double deltaXDitch = 3; var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X + deltaX, Z = pointDikeToeAtPolder.Z }; var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X + deltaX + deltaXDitch, Z = pointDitchDikeSide.Z }; var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X + deltaX + deltaXDitch, Z = pointBottomDitchDikeSide.Z }; var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X + deltaX + deltaXDitch, Z = pointBottomDitchPolderSide.Z }; var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X + deltaX + deltaXDitch, Z = pointDitchPolderSide.Z }; var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside)); Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside)); Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide))); Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide))); Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide))); Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide))); Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); } [Test] public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsInShoulderBetweenBaseAndTop() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 }; var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); const double slopeTangent = 1.0 / 2.0; var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); const double deltaX = 1.0; var expectedShoulderBaseInside = new GeometryPoint { X = pointShoulderBaseInside.X + deltaX, Z = pointShoulderBaseInside.Z }; var expectedShoulderTopInside = new GeometryPoint { X = pointShoulderTopInside.X, Z = pointShoulderTopInside.Z }; var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X, Z = pointDikeToeAtPolder.Z }; var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X, Z = pointDitchDikeSide.Z }; var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X, Z = pointBottomDitchDikeSide.Z }; var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X, Z = pointBottomDitchPolderSide.Z }; var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X, Z = pointDitchPolderSide.Z }; var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; Assert.IsTrue(expectedShoulderBaseInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside))); Assert.IsTrue(expectedShoulderTopInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderTopInside))); Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide))); Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide))); Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide))); Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide))); Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); } [Test] public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsOnShoulderTop() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; var pointShoulderTopInside = new GeometryPoint { X = 10, Z = 1 }; var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); const double slopeTangent = 1.0 / 2.0; var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); var expectedNewPoint = new GeometryPoint { X = pointShoulderTopInside.X, Z = pointShoulderTopInside.Z }; var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X, Z = pointDikeToeAtPolder.Z }; var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X, Z = pointDitchDikeSide.Z }; var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X, Z = pointBottomDitchDikeSide.Z }; var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X, Z = pointBottomDitchPolderSide.Z }; var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X, Z = pointDitchPolderSide.Z }; var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside)); Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside)); Assert.IsTrue(adaptedSurfaceLine.Geometry.GetPointAt(expectedNewPoint.X, expectedNewPoint.Z) != null); Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide))); Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide))); Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide))); Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide))); Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); } [Test] public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsInShoulderBetweenTopAndDikeToe() { var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var pointShoulderBaseInside = new GeometryPoint { X = 7, Z = 1 }; var pointShoulderTopInside = new GeometryPoint { X = 8, Z = 0 }; var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); const double slopeTangent = 1.0 / 2.0; var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); const double deltaX = 4.0; // from pointShoulderTopInside var expectedNewPoint = new GeometryPoint { X = pointShoulderTopInside.X + deltaX, Z = pointShoulderTopInside.Z }; var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X, Z = pointDikeToeAtPolder.Z }; var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X, Z = pointDitchDikeSide.Z }; var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X, Z = pointBottomDitchDikeSide.Z }; var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X, Z = pointBottomDitchPolderSide.Z }; var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X, Z = pointDitchPolderSide.Z }; var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside)); Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside)); Assert.IsTrue(adaptedSurfaceLine.Geometry.GetPointAt(expectedNewPoint.X, expectedNewPoint.Z) != null); Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide))); Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide))); Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide))); Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide))); Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); } [Test] public void AdaptedSimpleDikeLineWithInBetweenPointOnInsideSlopeBySlopeHasCorrectNewToeDikeAtPolder() { var surfaceLine = CreateSimpleDike(); var pointDikeToeAtPolder = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePoint(2.5, 0.4); // in between point on inside slope surfaceLine.SortPoints(); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); const double slopeTangent = 1.0 / 4.0; var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); const double deltaX = 3.0; var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X + deltaX, Z = pointDikeToeAtPolder.Z }; Assert.AreEqual(6, surfaceLine.Geometry.Count); Assert.AreEqual(5, adaptedSurfaceLine.Geometry.Count); // in between point should be thrown away Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); } [Test] public void AdaptedSurfaceLineWithTrafficLoadPointsBySlopeHasAdjustedPoints() { const double cTolerance = 0.0000001; // Create the base surfaceline (dike with shoulder and ditch) var surfaceLine = new SurfaceLine2 { CharacteristicPoints = { GeometryMustContainPoint = true }, Geometry = new GeometryPointString() }; var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 }; var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); var pointTrafficLoadOutside = new GeometryPoint { X = 7, Z = 2.3333333333 }; var pointTrafficLoadInside = new GeometryPoint { X = 8, Z = 1.6666666667 }; surfaceLine.EnsurePointOfType(pointTrafficLoadOutside.X, pointTrafficLoadOutside.Z, CharacteristicPointType.TrafficLoadOutside); surfaceLine.EnsurePointOfType(pointTrafficLoadInside.X, pointTrafficLoadInside.Z, CharacteristicPointType.TrafficLoadInside); surfaceLine.SortPoints(); var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); const double slopeTangent = 1.0 / 4.0; var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); var expectedPointTrafficLoadOutside = new GeometryPoint { X = 7, Z = 2.75 }; var expectedPointTrafficLoadInside = new GeometryPoint { X = 8, Z = 2.5 }; Assert.AreEqual(expectedPointTrafficLoadOutside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X, cTolerance); Assert.AreEqual(expectedPointTrafficLoadInside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).X, cTolerance); Assert.AreEqual(expectedPointTrafficLoadOutside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).Z, cTolerance); Assert.AreEqual(expectedPointTrafficLoadInside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).Z, cTolerance); pointTrafficLoadOutside = new GeometryPoint { X = 10.0, Z = 1.0 }; pointTrafficLoadInside = new GeometryPoint { X = 13, Z = 1.0 / 3.0 }; surfaceLine.EnsurePointOfType(pointTrafficLoadOutside.X, pointTrafficLoadOutside.Z, CharacteristicPointType.TrafficLoadOutside); surfaceLine.EnsurePointOfType(pointTrafficLoadInside.X, pointTrafficLoadInside.Z, CharacteristicPointType.TrafficLoadInside); surfaceLine.SortPoints(); surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0); adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); expectedPointTrafficLoadOutside = new GeometryPoint { X = 10.0, Z = 2.0 }; expectedPointTrafficLoadInside = new GeometryPoint { X = 13, Z = 1.25 }; Assert.AreEqual(expectedPointTrafficLoadOutside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X, cTolerance); Assert.AreEqual(expectedPointTrafficLoadInside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).X, cTolerance); Assert.AreEqual(expectedPointTrafficLoadOutside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).Z, cTolerance); Assert.AreEqual(expectedPointTrafficLoadInside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).Z, cTolerance); } #endregion } }