Index: Ringtoets.sln =================================================================== diff -u -rdcfb3bff66ae6101fef3d8f46ffde3e67b11cef5 -r4f569d13df154ec7983b6a59ced2553faf1f7bea --- Ringtoets.sln (.../Ringtoets.sln) (revision dcfb3bff66ae6101fef3d8f46ffde3e67b11cef5) +++ Ringtoets.sln (.../Ringtoets.sln) (revision 4f569d13df154ec7983b6a59ced2553faf1f7bea) @@ -2012,7 +2012,7 @@ {C90B77DA-E421-43CC-B82E-529651BC21AC} = {C90B77DA-E421-43CC-B82E-529651BC21AC} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Riskeer.Integration.Util", "Ringtoets\Integration\src\Ringtoets.Integration.Util\Riskeer.Integration.Util.csproj", "{D4D21027-B2CD-47E2-A299-70885CC93AB4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Riskeer.Integration.Util", "Ringtoets\Integration\src\Riskeer.Integration.Util\Riskeer.Integration.Util.csproj", "{D4D21027-B2CD-47E2-A299-70885CC93AB4}" ProjectSection(ProjectDependencies) = postProject {C90B77DA-E421-43CC-B82E-529651BC21AC} = {C90B77DA-E421-43CC-B82E-529651BC21AC} EndProjectSection Fisheye: Tag 4f569d13df154ec7983b6a59ced2553faf1f7bea refers to a dead (removed) revision in file `Ringtoets/Integration/src/Ringtoets.Integration.Util/FailureMechanismSectionHelper.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 4f569d13df154ec7983b6a59ced2553faf1f7bea refers to a dead (removed) revision in file `Ringtoets/Integration/src/Ringtoets.Integration.Util/Properties/AssemblyInfo.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 4f569d13df154ec7983b6a59ced2553faf1f7bea refers to a dead (removed) revision in file `Ringtoets/Integration/src/Ringtoets.Integration.Util/Riskeer.Integration.Util.csproj'. Fisheye: No comparison available. Pass `N' to diff? Index: Ringtoets/Integration/src/Riskeer.Integration.Util/FailureMechanismSectionHelper.cs =================================================================== diff -u --- Ringtoets/Integration/src/Riskeer.Integration.Util/FailureMechanismSectionHelper.cs (revision 0) +++ Ringtoets/Integration/src/Riskeer.Integration.Util/FailureMechanismSectionHelper.cs (revision 4f569d13df154ec7983b6a59ced2553faf1f7bea) @@ -0,0 +1,129 @@ +// Copyright (C) Stichting Deltares 2018. All rights reserved. +// +// This file is part of Ringtoets. +// +// Ringtoets is free software: you can redistribute it and/or modify +// it under the terms of the GNU 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 General Public License for more details. +// +// You should have received a copy of the GNU 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 System; +using System.Collections.Generic; +using System.Linq; +using Core.Common.Base.Geometry; +using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.Common.Data.FailureMechanism; + +namespace Riskeer.Integration.Util +{ + /// + /// Class containing helper methods for . + /// + public static class FailureMechanismSectionHelper + { + /// + /// Gets the geometry of a failure mechanism section based on the geometry + /// of the , and . + /// + /// The reference line to get the geometry from. + /// The start of the section relative to the start of the reference line in meters. + /// The end of the section relative to the start of the reference line in meters. + /// The failure mechanism section geometry. + /// Thrown when is null. + public static IEnumerable GetFailureMechanismSectionGeometry(ReferenceLine referenceLine, double sectionStart, double sectionEnd) + { + if (referenceLine == null) + { + throw new ArgumentNullException(nameof(referenceLine)); + } + + int startIndex; + int endIndex; + + Point2D[] referenceLinePoints = referenceLine.Points.ToArray(); + Point2D startPoint = GetPointByOffset(referenceLinePoints, sectionStart, out startIndex); + Point2D endPoint = GetPointByOffset(referenceLinePoints, sectionEnd, out endIndex); + + var sectionPoints = new List + { + startPoint + }; + + sectionPoints.AddRange(referenceLinePoints.Skip(startIndex + 1).Take(endIndex - startIndex)); + + if (!sectionPoints.Contains(endPoint)) + { + sectionPoints.Add(endPoint); + } + + return sectionPoints; + } + + private static Point2D GetPointByOffset(Point2D[] referenceLinePoints, double offset, out int index) + { + index = 0; + Point2D point = null; + + if (Math.Abs(offset) < 1e-8) + { + return referenceLinePoints[0]; + } + + double totalLength = 0; + + for (var i = 1; i < referenceLinePoints.Length; i++) + { + index = i; + double pointsLength = Math2D.Length(new[] + { + referenceLinePoints[i - 1], + referenceLinePoints[i] + }); + + totalLength += pointsLength; + + if (Math.Abs(totalLength - offset) < 1e-8) + { + point = referenceLinePoints[i]; + break; + } + + if (totalLength > offset) + { + double distance = offset - (totalLength - pointsLength); + point = InterpolatePoint(referenceLinePoints[i - 1], referenceLinePoints[i], distance); + index = i - 1; + break; + } + } + + return point; + } + + private static Point2D InterpolatePoint(Point2D startPoint, Point2D endPoint, double distance) + { + double magnitude = Math2D.Length(new[] + { + startPoint, + endPoint + }); + + double factor = distance / magnitude; + + return new Point2D(startPoint.X + (factor * (endPoint.X - startPoint.X)), + startPoint.Y + (factor * (endPoint.Y - startPoint.Y))); + } + } +} \ No newline at end of file Index: Ringtoets/Integration/src/Riskeer.Integration.Util/Properties/AssemblyInfo.cs =================================================================== diff -u --- Ringtoets/Integration/src/Riskeer.Integration.Util/Properties/AssemblyInfo.cs (revision 0) +++ Ringtoets/Integration/src/Riskeer.Integration.Util/Properties/AssemblyInfo.cs (revision 4f569d13df154ec7983b6a59ced2553faf1f7bea) @@ -0,0 +1,25 @@ +// Copyright (C) Stichting Deltares 2018. All rights reserved. +// +// This file is part of Ringtoets. +// +// Ringtoets is free software: you can redistribute it and/or modify +// it under the terms of the GNU 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 General Public License for more details. +// +// You should have received a copy of the GNU 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 System.Reflection; + +[assembly: AssemblyTitle("Riskeer.Integration.Util")] +[assembly: AssemblyProduct("Riskeer.Integration.Util")] \ No newline at end of file Index: Ringtoets/Integration/src/Riskeer.Integration.Util/Riskeer.Integration.Util.csproj =================================================================== diff -u --- Ringtoets/Integration/src/Riskeer.Integration.Util/Riskeer.Integration.Util.csproj (revision 0) +++ Ringtoets/Integration/src/Riskeer.Integration.Util/Riskeer.Integration.Util.csproj (revision 4f569d13df154ec7983b6a59ced2553faf1f7bea) @@ -0,0 +1,34 @@ + + + + {D4D21027-B2CD-47E2-A299-70885CC93AB4} + Riskeer.Integration.Util + Riskeer.Integration.Util + + + + + + + + + + + + + Copying.licenseheader + + + + + {3bbfd65b-b277-4e50-ae6d-bd24c3434609} + Core.Common.Base + False + + + {d4200f43-3f72-4f42-af0a-8ced416a38ec} + Ringtoets.Common.Data + False + + + \ No newline at end of file