Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs =================================================================== diff -u -r5111 -r5258 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 5111) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 5258) @@ -340,7 +340,7 @@ /// /// /// - /// + /// Curve private GeometryCurve GetNextTopCurve(GeometryCurve curve, List boundaryCurves, List excludedCurves) { @@ -350,18 +350,11 @@ return null; } - foreach (GeometryCurve geometryCurve in boundaryCurves) - { - if (geometryCurve != curve && !excludedCurves.Contains(geometryCurve)) - { - if (AreConnected(curve, geometryCurve)) - { - return geometryCurve; - } - } - } - - return null; + IEnumerable includedCurves = boundaryCurves.Where(geometryCurve => geometryCurve != curve && !excludedCurves.Contains(geometryCurve)); + IEnumerable connectedCurves = includedCurves.Where(geometryCurve => AreConnected(curve, geometryCurve)); + IEnumerable connectedCurvesOnRightSide = connectedCurves.Where(geometryCurve => IsOnLeftSideOf(curve, geometryCurve)); + GeometryCurve topConnectedCurve = connectedCurvesOnRightSide.MaxBy(c => c.HeadPoint.Z + c.EndPoint.Z); + return topConnectedCurve; } /// @@ -493,13 +486,29 @@ return false; } - private bool AreConnected(GeometryCurve curve1, GeometryCurve curve2) + private static bool AreConnected(GeometryCurve curve1, GeometryCurve curve2) { - return (curve1.HeadPoint == curve2.HeadPoint || curve1.HeadPoint == curve2.EndPoint || - curve1.EndPoint == curve2.HeadPoint || curve1.EndPoint == curve2.EndPoint); + return curve1.HeadPoint.LocationEquals(curve2.HeadPoint) || + curve1.HeadPoint.LocationEquals(curve2.EndPoint) || + curve1.EndPoint.LocationEquals(curve2.HeadPoint) || + curve1.EndPoint.LocationEquals(curve2.EndPoint); } - + /// + /// Checks if curve1 is on the left side of curve2 + /// + /// + /// + /// True when curve1 is on the left side of curve2 + private static bool IsOnLeftSideOf(GeometryCurve curve1, GeometryCurve curve2) + { + return curve1.HeadPoint.X.IsLessThanOrEqualTo(curve2.HeadPoint.X) && + curve1.HeadPoint.X.IsLessThanOrEqualTo(curve2.EndPoint.X) && + curve1.EndPoint.X.IsLessThanOrEqualTo(curve2.HeadPoint.X) && + curve1.EndPoint.X.IsLessThanOrEqualTo(curve2.EndPoint.X); + } + + /// /// Updates the line at the top of the geometry /// private void UpdateSurfaceLine()