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()