// Copyright (C) Stichting Deltares 2025. 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.
///
[TearDown]
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()
{
SurfaceLine2 surfaceLine = CreateSimpleDike();
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
SurfaceLine2 constructNewSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(1);
Assert.That(constructNewSurfaceLine, Is.Not.Null);
}
[Test]
public void AdaptedSimpleDikeLineHasCorrectNewToeDikeAtPolder()
{
SurfaceLine2 surfaceLine = CreateSimpleDike();
var pointDikeToeAtPolder = new Point2D
{
X = 3,
Z = 0
};
surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder);
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(1.0);
var expectedPointDikeToeAtPolder = new Point2D
{
X = 4,
Z = 0
};
Assert.That(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder)), Is.True);
}
[Test]
public void AdaptedDikeWithShoulderHasCorrectPointsAfterToeSlope()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new Point2D
{
X = 9,
Z = 1
};
var pointShoulderTopInside = new Point2D
{
X = 11,
Z = 1
};
var pointDikeToeAtPolder = new Point2D
{
X = 14,
Z = 0
};
var pointSurfaceLevelInside = new Point2D
{
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;
SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX);
var expectedPointShoulderBaseInside = new Point2D
{
X = pointShoulderBaseInside.X + deltaX,
Z = pointShoulderBaseInside.Z
};
var expectedPointShoulderTopInside = new Point2D
{
X = pointShoulderTopInside.X,
Z = pointShoulderTopInside.Z
};
var expectedPointDikeToeAtPolder = new Point2D
{
X = pointDikeToeAtPolder.X,
Z = pointDikeToeAtPolder.Z
};
var expectedPointSurfaceLevelInside = new Point2D
{
X = pointSurfaceLevelInside.X,
Z = pointSurfaceLevelInside.Z
};
Assert.That(expectedPointShoulderBaseInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.ShoulderBaseInside)), Is.True);
Assert.That(expectedPointShoulderTopInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.ShoulderTopInside)), Is.True);
Assert.That(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder)), Is.True);
Assert.That(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.SurfaceLevelInside)), Is.True);
}
[Test]
public void AdaptedDikeWithDitchHasCorrectPointsAfterToeSlope()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointDikeToeAtPolder = new Point2D
{
X = 14,
Z = 0
};
var pointDitchDikeSide = new Point2D
{
X = 16,
Z = 0
};
var pointBottomDitchDikeSide = new Point2D
{
X = 17,
Z = -1
};
var pointBottomDitchPolderSide = new Point2D
{
X = 18,
Z = -1
};
var pointDitchPolderSide = new Point2D
{
X = 19,
Z = 0
};
var pointSurfaceLevelInside = new Point2D
{
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;
SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX);
var expectedPointDikeToeAtPolder = new Point2D
{
X = pointDikeToeAtPolder.X + deltaX,
Z = pointDikeToeAtPolder.Z
};
var expectedPointDitchDikeSide = new Point2D
{
X = pointDitchDikeSide.X + deltaX + deltaXDitch,
Z = pointDitchDikeSide.Z
};
var expectedPointBottomDitchDikeSide = new Point2D
{
X = pointBottomDitchDikeSide.X + deltaX + deltaXDitch,
Z = pointBottomDitchDikeSide.Z
};
var expectedPointBottomDitchPolderSide = new Point2D
{
X = pointBottomDitchPolderSide.X + deltaX + deltaXDitch,
Z = pointBottomDitchPolderSide.Z
};
var expectedPointDitchPolderSide = new Point2D
{
X = pointDitchPolderSide.X + deltaX + deltaXDitch,
Z = pointDitchPolderSide.Z
};
var expectedPointSurfaceLevelInside = new Point2D
{
X = pointSurfaceLevelInside.X,
Z = pointSurfaceLevelInside.Z
};
Assert.That(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder)), Is.True);
Assert.That(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DitchDikeSide)), Is.True);
Assert.That(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.BottomDitchDikeSide)), Is.True);
Assert.That(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.BottomDitchPolderSide)), Is.True);
Assert.That(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DitchPolderSide)), Is.True);
Assert.That(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.SurfaceLevelInside)), Is.True);
}
[Test]
public void AdaptedDikeWithShoulderAndDitchHasCorrectPointsAfterToeSlope()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new Point2D
{
X = 9,
Z = 1
};
var pointShoulderTopInside = new Point2D
{
X = 11,
Z = 1
};
var pointDikeToeAtPolder = new Point2D
{
X = 14,
Z = 0
};
var pointDitchDikeSide = new Point2D
{
X = 16,
Z = 0
};
var pointBottomDitchDikeSide = new Point2D
{
X = 17,
Z = -1
};
var pointBottomDitchPolderSide = new Point2D
{
X = 18,
Z = -1
};
var pointDitchPolderSide = new Point2D
{
X = 19,
Z = 0
};
var pointSurfaceLevelInside = new Point2D
{
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;
SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX);
var expectedPointShoulderBaseInside = new Point2D
{
X = pointShoulderBaseInside.X + deltaX,
Z = pointShoulderBaseInside.Z
};
var expectedPointShoulderTopInside = new Point2D
{
X = pointShoulderTopInside.X,
Z = pointShoulderTopInside.Z
};
var expectedPointDikeToeAtPolder = new Point2D
{
X = pointDikeToeAtPolder.X,
Z = pointDikeToeAtPolder.Z
};
var expectedPointDitchDikeSide = new Point2D
{
X = pointDitchDikeSide.X,
Z = pointDitchDikeSide.Z
};
var expectedPointBottomDitchDikeSide = new Point2D
{
X = pointBottomDitchDikeSide.X,
Z = pointBottomDitchDikeSide.Z
};
var expectedPointBottomDitchPolderSide = new Point2D
{
X = pointBottomDitchPolderSide.X,
Z = pointBottomDitchPolderSide.Z
};
var expectedPointDitchPolderSide = new Point2D
{
X = pointDitchPolderSide.X,
Z = pointDitchPolderSide.Z
};
var expectedPointSurfaceLevelInside = new Point2D
{
X = pointSurfaceLevelInside.X,
Z = pointSurfaceLevelInside.Z
};
Assert.That(expectedPointShoulderBaseInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.ShoulderBaseInside)), Is.True);
Assert.That(expectedPointShoulderTopInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.ShoulderTopInside)), Is.True);
Assert.That(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder)), Is.True);
Assert.That(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DitchDikeSide)), Is.True);
Assert.That(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.BottomDitchDikeSide)), Is.True);
Assert.That(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.BottomDitchPolderSide)), Is.True);
Assert.That(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DitchPolderSide)), Is.True);
Assert.That(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.SurfaceLevelInside)), Is.True);
}
[Test]
public void AdaptedSimpleDikeLineWithInBetweenPointOnInsideSlopeHasCorrectNewToeDikeAtPolder()
{
SurfaceLine2 surfaceLine = CreateSimpleDike();
surfaceLine.EnsurePoint(2.5, 0.4); // in between point on inside slope
surfaceLine.SortPoints();
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(1.0);
var expectedPointDikeToeAtPolder = new Point2D
{
X = 4,
Z = 0
};
Assert.That(surfaceLine.Geometry.Count, Is.EqualTo(6));
Assert.That(adaptedSurfaceLine.Geometry.Count, Is.EqualTo(5)); // in between point should be thrown away
Assert.That(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder)), Is.True);
}
[Test]
public void AdaptedSurfaceLineWithTrafficLoadPointsHasAdjustedPoints()
{
const double cTolerance = 0.0000001;
// Create the base surface line (dike with shoulder and ditch)
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new Point2D
{
X = 9,
Z = 1
};
var pointShoulderTopInside = new Point2D
{
X = 11,
Z = 1
};
var pointDikeToeAtPolder = new Point2D
{
X = 14,
Z = 0
};
var pointDitchDikeSide = new Point2D
{
X = 16,
Z = 0
};
var pointBottomDitchDikeSide = new Point2D
{
X = 17,
Z = -1
};
var pointBottomDitchPolderSide = new Point2D
{
X = 18,
Z = -1
};
var pointDitchPolderSide = new Point2D
{
X = 19,
Z = 0
};
var pointSurfaceLevelInside = new Point2D
{
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 Point2D
{
X = 7,
Z = 2.3333333333
};
var pointTrafficLoadInside = new Point2D
{
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);
var expectedPointTrafficLoadOutside = new Point2D
{
X = 7,
Z = 2.5
};
var expectedPointTrafficLoadInside = new Point2D
{
X = 8,
Z = 2.0
};
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadOutside).X, Is.EqualTo(expectedPointTrafficLoadOutside.X).Within(cTolerance));
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadInside).X, Is.EqualTo(expectedPointTrafficLoadInside.X).Within(cTolerance));
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadOutside).Z, Is.EqualTo(expectedPointTrafficLoadOutside.Z).Within(cTolerance));
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadInside).Z, Is.EqualTo(expectedPointTrafficLoadInside.Z).Within(cTolerance));
pointTrafficLoadOutside = new Point2D
{
X = 9.5,
Z = 1.0
};
pointTrafficLoadInside = new Point2D
{
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 Point2D
{
X = 9.5,
Z = 1.25
};
expectedPointTrafficLoadInside = new Point2D
{
X = 10.5,
Z = 1.0
};
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadOutside).X, Is.EqualTo(expectedPointTrafficLoadOutside.X).Within(cTolerance));
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadInside).X, Is.EqualTo(expectedPointTrafficLoadInside.X).Within(cTolerance));
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadOutside).Z, Is.EqualTo(expectedPointTrafficLoadOutside.Z).Within(cTolerance));
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadInside).Z, Is.EqualTo(expectedPointTrafficLoadInside.Z).Within(cTolerance));
}
#endregion
#region ConstructWithSlopeTangent
[Test]
public void IsExceptionThrownIfSlopeDoesNotIntersectSurfaceLine()
{
SurfaceLine2 surfaceLine = CreateSimpleDike();
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
Assert.That(() => surfaceLineAdapter.ConstructNewSurfaceLineBySlope(0), Throws.InstanceOf());
}
[Test]
public void IsNotExceptionThrownIfSlopeEqualsTheCurrentSlope()
{
SurfaceLine2 surfaceLine = CreateSimpleDike();
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
Assert.That(surfaceLineAdapter.ConstructNewSurfaceLineBySlope(1.0), Is.Not.Null);
}
[Test]
public void ConstructNewSurfaceLineBySlopeReturnsANewSurfaceLine()
{
SurfaceLine2 surfaceLine = CreateSimpleDike();
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
Assert.That(surfaceLineAdapter.ConstructNewSurfaceLineBySlope(0.9), Is.Not.Null);
}
[Test]
public void AdaptedSimpleDikeLineBySlopeHasCorrectNewToeDikeAtPolder()
{
SurfaceLine2 surfaceLine = CreateSimpleDike();
var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location, 0);
const double slopeTangent = 1.0 / 3.0;
SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
var expectedPointDikeToeAtPolder = new Point2D
{
X = 5,
Z = 0
};
Assert.That(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder)), Is.True);
}
[Test]
public void AdaptedDikeWithShoulderBySlopeHasCorrectPointsAfterToeSlope()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new Point2D
{
X = 9,
Z = 1
};
var pointShoulderTopInside = new Point2D
{
X = 11,
Z = 1
};
var pointDikeToeAtPolder = new Point2D
{
X = 14,
Z = 0
};
var pointSurfaceLevelInside = new Point2D
{
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;
SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
const double deltaX = 4.0;
var expectedPointDikeToeAtPolder = new Point2D
{
X = pointDikeToeAtPolder.X + deltaX,
Z = pointDikeToeAtPolder.Z
};
var expectedPointSurfaceLevelInside = new Point2D
{
X = pointSurfaceLevelInside.X,
Z = pointSurfaceLevelInside.Z
};
Assert.That(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside), Is.False);
Assert.That(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside), Is.False);
Assert.That(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder)), Is.True);
Assert.That(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.SurfaceLevelInside)), Is.True);
}
[Test]
public void AdaptedDikeWithDitchBySlopeHasCorrectPointsAfterToeSlope()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointDikeToeAtPolder = new Point2D
{
X = 14,
Z = 0
};
var pointDitchDikeSide = new Point2D
{
X = 16,
Z = 0
};
var pointBottomDitchDikeSide = new Point2D
{
X = 17,
Z = -1
};
var pointBottomDitchPolderSide = new Point2D
{
X = 18,
Z = -1
};
var pointDitchPolderSide = new Point2D
{
X = 19,
Z = 0
};
var pointSurfaceLevelInside = new Point2D
{
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;
SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
const double deltaX = 4.0;
const double deltaXDitch = 3;
var expectedPointDikeToeAtPolder = new Point2D
{
X = pointDikeToeAtPolder.X + deltaX,
Z = pointDikeToeAtPolder.Z
};
var expectedPointDitchDikeSide = new Point2D
{
X = pointDitchDikeSide.X + deltaX + deltaXDitch,
Z = pointDitchDikeSide.Z
};
var expectedPointBottomDitchDikeSide = new Point2D
{
X = pointBottomDitchDikeSide.X + deltaX + deltaXDitch,
Z = pointBottomDitchDikeSide.Z
};
var expectedPointBottomDitchPolderSide = new Point2D
{
X = pointBottomDitchPolderSide.X + deltaX + deltaXDitch,
Z = pointBottomDitchPolderSide.Z
};
var expectedPointDitchPolderSide = new Point2D
{
X = pointDitchPolderSide.X + deltaX + deltaXDitch,
Z = pointDitchPolderSide.Z
};
var expectedPointSurfaceLevelInside = new Point2D
{
X = pointSurfaceLevelInside.X,
Z = pointSurfaceLevelInside.Z
};
Assert.That(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder)), Is.True);
Assert.That(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DitchDikeSide)), Is.True);
Assert.That(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.BottomDitchDikeSide)), Is.True);
Assert.That(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.BottomDitchPolderSide)), Is.True);
Assert.That(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DitchPolderSide)), Is.True);
Assert.That(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.SurfaceLevelInside)), Is.True);
}
[Test]
public void IsExceptionThrownWhenSlopeDoesNotFit()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointDikeToeAtPolder = new Point2D
{
X = 14,
Z = 0
};
var pointDitchDikeSide = new Point2D
{
X = 16,
Z = 0
};
var pointBottomDitchDikeSide = new Point2D
{
X = 17,
Z = -1
};
var pointBottomDitchPolderSide = new Point2D
{
X = 18,
Z = -1
};
var pointDitchPolderSide = new Point2D
{
X = 19,
Z = 0
};
var pointSurfaceLevelInside = new Point2D
{
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;
Assert.That(() => surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent), Throws.InstanceOf());
}
[Test]
public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsBeyondDikeToe()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new Point2D
{
X = 9,
Z = 1
};
var pointShoulderTopInside = new Point2D
{
X = 11,
Z = 1
};
var pointDikeToeAtPolder = new Point2D
{
X = 14,
Z = 0
};
var pointDitchDikeSide = new Point2D
{
X = 16,
Z = 0
};
var pointBottomDitchDikeSide = new Point2D
{
X = 17,
Z = -1
};
var pointBottomDitchPolderSide = new Point2D
{
X = 18,
Z = -1
};
var pointDitchPolderSide = new Point2D
{
X = 19,
Z = 0
};
var pointSurfaceLevelInside = new Point2D
{
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;
SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
const double deltaX = 4.0;
const double deltaXDitch = 3;
var expectedPointDikeToeAtPolder = new Point2D
{
X = pointDikeToeAtPolder.X + deltaX,
Z = pointDikeToeAtPolder.Z
};
var expectedPointDitchDikeSide = new Point2D
{
X = pointDitchDikeSide.X + deltaX + deltaXDitch,
Z = pointDitchDikeSide.Z
};
var expectedPointBottomDitchDikeSide = new Point2D
{
X = pointBottomDitchDikeSide.X + deltaX + deltaXDitch,
Z = pointBottomDitchDikeSide.Z
};
var expectedPointBottomDitchPolderSide = new Point2D
{
X = pointBottomDitchPolderSide.X + deltaX + deltaXDitch,
Z = pointBottomDitchPolderSide.Z
};
var expectedPointDitchPolderSide = new Point2D
{
X = pointDitchPolderSide.X + deltaX + deltaXDitch,
Z = pointDitchPolderSide.Z
};
var expectedPointSurfaceLevelInside = new Point2D
{
X = pointSurfaceLevelInside.X,
Z = pointSurfaceLevelInside.Z
};
Assert.That(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside), Is.False);
Assert.That(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside), Is.False);
Assert.That(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder)), Is.True);
Assert.That(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DitchDikeSide)), Is.True);
Assert.That(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.BottomDitchDikeSide)), Is.True);
Assert.That(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.BottomDitchPolderSide)), Is.True);
Assert.That(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DitchPolderSide)), Is.True);
Assert.That(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.SurfaceLevelInside)), Is.True);
}
[Test]
public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsInShoulderBetweenBaseAndTop()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new Point2D
{
X = 9,
Z = 1
};
var pointShoulderTopInside = new Point2D
{
X = 11,
Z = 1
};
var pointDikeToeAtPolder = new Point2D
{
X = 14,
Z = 0
};
var pointDitchDikeSide = new Point2D
{
X = 16,
Z = 0
};
var pointBottomDitchDikeSide = new Point2D
{
X = 17,
Z = -1
};
var pointBottomDitchPolderSide = new Point2D
{
X = 18,
Z = -1
};
var pointDitchPolderSide = new Point2D
{
X = 19,
Z = 0
};
var pointSurfaceLevelInside = new Point2D
{
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;
SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
const double deltaX = 1.0;
var expectedShoulderBaseInside = new Point2D
{
X = pointShoulderBaseInside.X + deltaX,
Z = pointShoulderBaseInside.Z
};
var expectedShoulderTopInside = new Point2D
{
X = pointShoulderTopInside.X,
Z = pointShoulderTopInside.Z
};
var expectedPointDikeToeAtPolder = new Point2D
{
X = pointDikeToeAtPolder.X,
Z = pointDikeToeAtPolder.Z
};
var expectedPointDitchDikeSide = new Point2D
{
X = pointDitchDikeSide.X,
Z = pointDitchDikeSide.Z
};
var expectedPointBottomDitchDikeSide = new Point2D
{
X = pointBottomDitchDikeSide.X,
Z = pointBottomDitchDikeSide.Z
};
var expectedPointBottomDitchPolderSide = new Point2D
{
X = pointBottomDitchPolderSide.X,
Z = pointBottomDitchPolderSide.Z
};
var expectedPointDitchPolderSide = new Point2D
{
X = pointDitchPolderSide.X,
Z = pointDitchPolderSide.Z
};
var expectedPointSurfaceLevelInside = new Point2D
{
X = pointSurfaceLevelInside.X,
Z = pointSurfaceLevelInside.Z
};
Assert.That(expectedShoulderBaseInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.ShoulderBaseInside)), Is.True);
Assert.That(expectedShoulderTopInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.ShoulderTopInside)), Is.True);
Assert.That(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder)), Is.True);
Assert.That(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DitchDikeSide)), Is.True);
Assert.That(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.BottomDitchDikeSide)), Is.True);
Assert.That(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.BottomDitchPolderSide)), Is.True);
Assert.That(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DitchPolderSide)), Is.True);
Assert.That(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.SurfaceLevelInside)), Is.True);
}
[Test]
public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsOnShoulderTop()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new Point2D
{
X = 9,
Z = 1
};
var pointShoulderTopInside = new Point2D
{
X = 10,
Z = 1
};
var pointDikeToeAtPolder = new Point2D
{
X = 14,
Z = 0
};
var pointDitchDikeSide = new Point2D
{
X = 16,
Z = 0
};
var pointBottomDitchDikeSide = new Point2D
{
X = 17,
Z = -1
};
var pointBottomDitchPolderSide = new Point2D
{
X = 18,
Z = -1
};
var pointDitchPolderSide = new Point2D
{
X = 19,
Z = 0
};
var pointSurfaceLevelInside = new Point2D
{
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;
SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
var expectedNewPoint = new Point2D
{
X = pointShoulderTopInside.X,
Z = pointShoulderTopInside.Z
};
var expectedPointDikeToeAtPolder = new Point2D
{
X = pointDikeToeAtPolder.X,
Z = pointDikeToeAtPolder.Z
};
var expectedPointDitchDikeSide = new Point2D
{
X = pointDitchDikeSide.X,
Z = pointDitchDikeSide.Z
};
var expectedPointBottomDitchDikeSide = new Point2D
{
X = pointBottomDitchDikeSide.X,
Z = pointBottomDitchDikeSide.Z
};
var expectedPointBottomDitchPolderSide = new Point2D
{
X = pointBottomDitchPolderSide.X,
Z = pointBottomDitchPolderSide.Z
};
var expectedPointDitchPolderSide = new Point2D
{
X = pointDitchPolderSide.X,
Z = pointDitchPolderSide.Z
};
var expectedPointSurfaceLevelInside = new Point2D
{
X = pointSurfaceLevelInside.X,
Z = pointSurfaceLevelInside.Z
};
Assert.That(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside), Is.False);
Assert.That(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside), Is.False);
Assert.That(adaptedSurfaceLine.Geometry.DeterminePointAt(expectedNewPoint.X, expectedNewPoint.Z), Is.Not.Null);
Assert.That(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder)), Is.True);
Assert.That(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DitchDikeSide)), Is.True);
Assert.That(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.BottomDitchDikeSide)), Is.True);
Assert.That(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.BottomDitchPolderSide)), Is.True);
Assert.That(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DitchPolderSide)), Is.True);
Assert.That(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.SurfaceLevelInside)), Is.True);
}
[Test]
public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsInShoulderBetweenTopAndDikeToe()
{
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new Point2D
{
X = 7,
Z = 1
};
var pointShoulderTopInside = new Point2D
{
X = 8,
Z = 0
};
var pointDikeToeAtPolder = new Point2D
{
X = 14,
Z = 0
};
var pointDitchDikeSide = new Point2D
{
X = 16,
Z = 0
};
var pointBottomDitchDikeSide = new Point2D
{
X = 17,
Z = -1
};
var pointBottomDitchPolderSide = new Point2D
{
X = 18,
Z = -1
};
var pointDitchPolderSide = new Point2D
{
X = 19,
Z = 0
};
var pointSurfaceLevelInside = new Point2D
{
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;
SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
const double deltaX = 4.0; // from pointShoulderTopInside
var expectedNewPoint = new Point2D
{
X = pointShoulderTopInside.X + deltaX,
Z = pointShoulderTopInside.Z
};
var expectedPointDikeToeAtPolder = new Point2D
{
X = pointDikeToeAtPolder.X,
Z = pointDikeToeAtPolder.Z
};
var expectedPointDitchDikeSide = new Point2D
{
X = pointDitchDikeSide.X,
Z = pointDitchDikeSide.Z
};
var expectedPointBottomDitchDikeSide = new Point2D
{
X = pointBottomDitchDikeSide.X,
Z = pointBottomDitchDikeSide.Z
};
var expectedPointBottomDitchPolderSide = new Point2D
{
X = pointBottomDitchPolderSide.X,
Z = pointBottomDitchPolderSide.Z
};
var expectedPointDitchPolderSide = new Point2D
{
X = pointDitchPolderSide.X,
Z = pointDitchPolderSide.Z
};
var expectedPointSurfaceLevelInside = new Point2D
{
X = pointSurfaceLevelInside.X,
Z = pointSurfaceLevelInside.Z
};
Assert.That(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside), Is.False);
Assert.That(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside), Is.False);
Assert.That(adaptedSurfaceLine.Geometry.DeterminePointAt(expectedNewPoint.X, expectedNewPoint.Z), Is.Not.Null);
Assert.That(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder)), Is.True);
Assert.That(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DitchDikeSide)), Is.True);
Assert.That(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.BottomDitchDikeSide)), Is.True);
Assert.That(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.BottomDitchPolderSide)), Is.True);
Assert.That(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DitchPolderSide)), Is.True);
Assert.That(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.SurfaceLevelInside)), Is.True);
}
[Test]
public void AdaptedSimpleDikeLineWithInBetweenPointOnInsideSlopeBySlopeHasCorrectNewToeDikeAtPolder()
{
SurfaceLine2 surfaceLine = CreateSimpleDike();
Point2D pointDikeToeAtPolder = surfaceLine.CharacteristicPoints.GetPoint2D(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;
SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
const double deltaX = 3.0;
var expectedPointDikeToeAtPolder = new Point2D
{
X = pointDikeToeAtPolder.X + deltaX,
Z = pointDikeToeAtPolder.Z
};
Assert.That(surfaceLine.Geometry.Count, Is.EqualTo(6));
Assert.That(adaptedSurfaceLine.Geometry.Count, Is.EqualTo(5)); // in between point should be thrown away
Assert.That(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.DikeToeAtPolder)), Is.True);
}
[Test]
public void AdaptedSurfaceLineWithTrafficLoadPointsBySlopeHasAdjustedPoints()
{
const double cTolerance = 0.0000001;
// Create the base surface line (dike with shoulder and ditch)
var surfaceLine = new SurfaceLine2
{
CharacteristicPoints =
{
GeometryMustContainPoint = true
},
Geometry = new GeometryPointString()
};
var pointShoulderBaseInside = new Point2D
{
X = 9,
Z = 1
};
var pointShoulderTopInside = new Point2D
{
X = 11,
Z = 1
};
var pointDikeToeAtPolder = new Point2D
{
X = 14,
Z = 0
};
var pointDitchDikeSide = new Point2D
{
X = 16,
Z = 0
};
var pointBottomDitchDikeSide = new Point2D
{
X = 17,
Z = -1
};
var pointBottomDitchPolderSide = new Point2D
{
X = 18,
Z = -1
};
var pointDitchPolderSide = new Point2D
{
X = 19,
Z = 0
};
var pointSurfaceLevelInside = new Point2D
{
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 Point2D
{
X = 7,
Z = 2.3333333333
};
var pointTrafficLoadInside = new Point2D
{
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;
SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent);
var expectedPointTrafficLoadOutside = new Point2D
{
X = 7,
Z = 2.75
};
var expectedPointTrafficLoadInside = new Point2D
{
X = 8,
Z = 2.5
};
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadOutside).X, Is.EqualTo(expectedPointTrafficLoadOutside.X).Within(cTolerance));
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadInside).X, Is.EqualTo(expectedPointTrafficLoadInside.X).Within(cTolerance));
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadOutside).Z, Is.EqualTo(expectedPointTrafficLoadOutside.Z).Within(cTolerance));
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadInside).Z, Is.EqualTo(expectedPointTrafficLoadInside.Z).Within(cTolerance));
pointTrafficLoadOutside = new Point2D
{
X = 10.0,
Z = 1.0
};
pointTrafficLoadInside = new Point2D
{
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 Point2D
{
X = 10.0,
Z = 2.0
};
expectedPointTrafficLoadInside = new Point2D
{
X = 13,
Z = 1.25
};
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadOutside).X, Is.EqualTo(expectedPointTrafficLoadOutside.X).Within(cTolerance));
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadInside).X, Is.EqualTo(expectedPointTrafficLoadInside.X).Within(cTolerance));
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadOutside).Z, Is.EqualTo(expectedPointTrafficLoadOutside.Z).Within(cTolerance));
Assert.That(adaptedSurfaceLine.CharacteristicPoints.GetPoint2D(CharacteristicPointType.TrafficLoadInside).Z, Is.EqualTo(expectedPointTrafficLoadInside.Z).Within(cTolerance));
}
#endregion
}