From 2c94e2f7878e73e8d2a126ccec63f7e2950889b3 Mon Sep 17 00:00:00 2001 From: Andreas Buykx Date: Wed, 8 Nov 2023 12:26:58 +0100 Subject: [PATCH] GRIDEDIT-779: refactor refinement loop --- libs/MeshKernel/src/Polygon.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/libs/MeshKernel/src/Polygon.cpp b/libs/MeshKernel/src/Polygon.cpp index 7df20a2b7..f1545e716 100644 --- a/libs/MeshKernel/src/Polygon.cpp +++ b/libs/MeshKernel/src/Polygon.cpp @@ -264,22 +264,20 @@ void RefineSegment(std::vector& refinedPolygon, const auto& n0 = *nodeIterator; const auto& n1 = *std::next(nodeIterator); - auto p = n0; - - refinedPolygon.push_back(p); + refinedPolygon.push_back(n0); const double segmentLength = ComputeDistance(n0, n1, projection); + + auto n = std::lround(std::round(segmentLength / refinementDistance)); + if (n * refinementDistance > segmentLength || + meshkernel::IsEqual(n * refinementDistance, segmentLength, meshkernel::constants::geometric::refinementTolerance)) + --n; + // Refined segment step size. const meshkernel::Point delta = (n1 - n0) * refinementDistance / segmentLength; - double lengthAlongInterval = refinementDistance; - - // Exit when the lengthAlongInterval is greater or equal than segmentLength - // To prevent very small refined segment lengths, also exit when lengthAlongInterval is a small fraction less (defined by refinementTolerance) - while (lengthAlongInterval < segmentLength && !meshkernel::IsEqual(lengthAlongInterval, segmentLength, meshkernel::constants::geometric::refinementTolerance)) + for (auto i = 1; i <= n; ++i) { - p += delta; - lengthAlongInterval += refinementDistance; - refinedPolygon.push_back(p); + refinedPolygon.push_back(n0 + i * delta); } }