Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryGenerator.cs =================================================================== diff -u -r5216 -r5217 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryGenerator.cs (.../GeometryGenerator.cs) (revision 5216) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryGenerator.cs (.../GeometryGenerator.cs) (revision 5217) @@ -1041,28 +1041,42 @@ private bool RegenerateParallelCurves(GeometryCurve line1, GeometryCurve line2, ref bool isCurveInserted) { - Point2D pointXz1 = line1.HeadPoint; - Point2D pointXz2 = line1.EndPoint; - Point2D pointXz3 = line2.HeadPoint; - Point2D pointXz4 = line2.EndPoint; - bool flag1 = Routines2D.DoesPointExistInLine(pointXz1, pointXz2, pointXz3, 0.001); - bool flag2 = Routines2D.DoesPointExistInLine(pointXz1, pointXz2, pointXz4, 0.001); - bool flag3 = Routines2D.DoesPointExistInLine(pointXz3, pointXz4, pointXz1, 0.001); - bool flag4 = Routines2D.DoesPointExistInLine(pointXz3, pointXz4, pointXz2, 0.001); - double num1 = !pointXz1.Z.IsNearEqual(pointXz2.Z) ? (pointXz1.X - pointXz2.X) / (pointXz1.Z - pointXz2.Z) : double.MaxValue; - double num2 = !pointXz3.Z.IsNearEqual(pointXz4.Z) ? (pointXz3.X - pointXz4.X) / (pointXz3.Z - pointXz4.Z) : double.MaxValue; + Point2D headPoint1 = line1.HeadPoint; + Point2D endPoint1 = line1.EndPoint; + Point2D headPoint2 = line2.HeadPoint; + Point2D endPoint2 = line2.EndPoint; + bool flag1 = Routines2D.DoesPointExistInLine(headPoint1, endPoint1, headPoint2, 0.001); + bool flag2 = Routines2D.DoesPointExistInLine(headPoint1, endPoint1, endPoint2, 0.001); + bool flag3 = Routines2D.DoesPointExistInLine(headPoint2, endPoint2, headPoint1, 0.001); + bool flag4 = Routines2D.DoesPointExistInLine(headPoint2, endPoint2, endPoint1, 0.001); + double num1 = !headPoint1.Z.IsNearEqual(endPoint1.Z) ? (headPoint1.X - endPoint1.X) / (headPoint1.Z - endPoint1.Z) : double.MaxValue; + double num2 = !headPoint2.Z.IsNearEqual(endPoint2.Z) ? (headPoint2.X - endPoint2.X) / (headPoint2.Z - endPoint2.Z) : double.MaxValue; if (Math.Abs(Math.Abs(num1) - Math.Abs(num2)) > 5E-12) { - DetermineFlagValues1to4(pointXz1, pointXz3, pointXz2, pointXz4, ref flag3, ref flag4, ref flag1, ref flag2); + if (flag1 && flag2) + { + DetermineFlagValuesWithDistanceToLine(headPoint2, endPoint2, headPoint1, endPoint1, ref flag1, ref flag2); + } + if (flag3 && flag4) + { + DetermineFlagValuesWithDistanceToLine(headPoint1, endPoint1, headPoint2, endPoint2, ref flag3, ref flag4); + } } - bool flag5 = Routines2D.DetermineIfPointsCoincide(pointXz1.X, pointXz1.Z, pointXz3.X, pointXz3.Z, 0.001); - bool flag6 = Routines2D.DetermineIfPointsCoincide(pointXz1.X, pointXz1.Z, pointXz4.X, pointXz4.Z, 0.001); - bool flag7 = Routines2D.DetermineIfPointsCoincide(pointXz2.X, pointXz2.Z, pointXz3.X, pointXz3.Z, 0.001); - bool flag8 = Routines2D.DetermineIfPointsCoincide(pointXz2.X, pointXz2.Z, pointXz4.X, pointXz4.Z, 0.001); + bool flag5 = Routines2D.DetermineIfPointsCoincide(headPoint1.X, headPoint1.Z, headPoint2.X, headPoint2.Z, 0.001); + bool flag6 = Routines2D.DetermineIfPointsCoincide(headPoint1.X, headPoint1.Z, endPoint2.X, endPoint2.Z, 0.001); + bool flag7 = Routines2D.DetermineIfPointsCoincide(endPoint1.X, endPoint1.Z, headPoint2.X, headPoint2.Z, 0.001); + bool flag8 = Routines2D.DetermineIfPointsCoincide(endPoint1.X, endPoint1.Z, endPoint2.X, endPoint2.Z, 0.001); if (Math.Abs(Math.Abs(num1) - Math.Abs(num2)) > 5E-12) { - DetermineFlagValues5to8(pointXz1, pointXz3, pointXz2, pointXz4, ref flag5, ref flag6, ref flag7, ref flag8); + if (flag5 && flag7) + { + DetermineFlagValuesWithDistanceBetweenPoints(headPoint1, endPoint1, headPoint2, ref flag5, ref flag7); + } + if (flag6 && flag8) + { + DetermineFlagValuesWithDistanceBetweenPoints(headPoint1, endPoint1, endPoint2, ref flag6, ref flag8); + } } //if (flag3 && flag4 || flag1 && flag2 || flag1 | flag2 && flag3 || flag4) @@ -1094,8 +1108,8 @@ if (flag1 && flag2 && !flag5 && !flag8 && !flag7 && !flag6) { - if (Routines2D.Compute2DDistance(pointXz1.X, pointXz1.Z, pointXz3.X, pointXz3.Z) < - Routines2D.Compute2DDistance(pointXz1.X, pointXz1.Z, pointXz4.X, pointXz4.Z)) + if (Routines2D.Compute2DDistance(headPoint1.X, headPoint1.Z, headPoint2.X, headPoint2.Z) < + Routines2D.Compute2DDistance(headPoint1.X, headPoint1.Z, endPoint2.X, endPoint2.Z)) SplitCurve(line1, line2.HeadPoint).HeadPoint = line2.EndPoint; else SplitCurve(line1, line2.EndPoint).HeadPoint = line2.HeadPoint; @@ -1106,8 +1120,8 @@ if (flag3 && flag4 && !flag5 && !flag8 && !flag7 && !flag6) { - if (Routines2D.Compute2DDistance(pointXz3.X, pointXz3.Z, pointXz1.X, pointXz1.Z) < - Routines2D.Compute2DDistance(pointXz3.X, pointXz3.Z, pointXz2.X, pointXz2.Z)) + if (Routines2D.Compute2DDistance(headPoint2.X, headPoint2.Z, headPoint1.X, headPoint1.Z) < + Routines2D.Compute2DDistance(headPoint2.X, headPoint2.Z, endPoint1.X, endPoint1.Z)) SplitCurve(line2, line1.HeadPoint).HeadPoint = line1.EndPoint; else SplitCurve(line2, line1.EndPoint).HeadPoint = line1.HeadPoint; @@ -1154,46 +1168,28 @@ return true; } - private static void DetermineFlagValues5to8(Point2D pointXz1, Point2D pointXz3, Point2D pointXz2, Point2D pointXz4, ref bool flag5, ref bool flag6, ref bool flag7, ref bool flag8) + private static void DetermineFlagValuesWithDistanceBetweenPoints(Point2D point1, Point2D point2, Point2D point3, + ref bool flagA, ref bool flagB) { - if (flag5 && flag7) - { - if (Routines2D.Compute2DDistance(pointXz1.X, pointXz1.Z, pointXz3.X, pointXz3.Z) > - Routines2D.Compute2DDistance(pointXz2.X, pointXz2.Z, pointXz3.X, pointXz3.Z)) - flag5 = false; - else - flag7 = false; - } - - if (flag6 && flag8) - { - if (Routines2D.Compute2DDistance(pointXz1.X, pointXz1.Z, pointXz4.X, pointXz4.Z) > - Routines2D.Compute2DDistance(pointXz2.X, pointXz2.Z, pointXz4.X, pointXz4.Z)) - flag6 = false; - else - flag8 = false; - } + double distancePoint1ToPoint3 = Routines2D.Compute2DDistance(point1.X, point1.Z, point3.X, point3.Z); + double distancePoint2ToPoint3 = Routines2D.Compute2DDistance(point2.X, point2.Z, point3.X, point3.Z); + if (distancePoint1ToPoint3 > distancePoint2ToPoint3) + flagA = false; + else + flagB = false; } - private static void DetermineFlagValues1to4(Point2D pointXz1, Point2D pointXz3, Point2D pointXz2, Point2D pointXz4, ref bool flag3, ref bool flag4, ref bool flag1, ref bool flag2) + private static void DetermineFlagValuesWithDistanceToLine(Point2D point1, Point2D point2, Point2D headPoint, Point2D endPoint, + ref bool flagA, ref bool flagB) { - if (flag3 && flag4) - { - if (Routines2D.CalculateDistanceToLine(pointXz1.X, pointXz1.Z, pointXz3.X, pointXz3.Z, pointXz4.X, pointXz4.Z) > - Routines2D.CalculateDistanceToLine(pointXz2.X, pointXz2.Z, pointXz3.X, pointXz3.Z, pointXz4.X, pointXz4.Z)) - flag3 = false; - else - flag4 = false; - } - - if (flag1 && flag2) - { - if (Routines2D.CalculateDistanceToLine(pointXz3.X, pointXz3.Z, pointXz1.X, pointXz1.Z, pointXz2.X, pointXz2.Z) > - Routines2D.CalculateDistanceToLine(pointXz4.X, pointXz4.Z, pointXz1.X, pointXz1.Z, pointXz2.X, pointXz2.Z)) - flag1 = false; - else - flag2 = false; - } + double distancePoint1ToLine = Routines2D.CalculateDistanceToLine(point1.X, point1.Z, + headPoint.X, headPoint.Z, endPoint.X, endPoint.Z); + double distancePoint2ToLine = Routines2D.CalculateDistanceToLine(point2.X, point2.Z, + headPoint.X, headPoint.Z, endPoint.X, endPoint.Z); + if (distancePoint1ToLine > distancePoint2ToLine) + flagA = false; + else + flagB = false; } private GeometryCurve SplitCurve(GeometryCurve curve, Point2D aPointOnCurve)