From 6eb1f6fefc338fdc04609811fa7a14e1e4f90628 Mon Sep 17 00:00:00 2001 From: mattijs <mattijs> Date: Mon, 8 Oct 2018 17:11:37 +0100 Subject: [PATCH] ENH: searchableSurface: handle multiple surfaces. Fixes #1034 --- .../searchableSurfacesQueries.C | 55 +++++++++++-------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/src/meshTools/searchableSurfaces/searchableSurfacesQueries/searchableSurfacesQueries.C b/src/meshTools/searchableSurfaces/searchableSurfacesQueries/searchableSurfacesQueries.C index f5c48914a27..df5234dc1ae 100644 --- a/src/meshTools/searchableSurfaces/searchableSurfacesQueries/searchableSurfacesQueries.C +++ b/src/meshTools/searchableSurfaces/searchableSurfacesQueries/searchableSurfacesQueries.C @@ -516,37 +516,48 @@ void Foam::searchableSurfacesQueries::findNearest // - current surface : info+normal1 forAll(near, i) { - if (info[i].hit() && normal[i] != vector::zero) + if (info[i].hit()) { - if (mag(normal[i]&normal1[i]) < 1.0-1e-6) + if (normal[i] != vector::zero) { - plane pl0(near[i], normal[i], false); - plane pl1(info[i].hitPoint(), normal1[i], false); + // Have previous hit. Find intersection + if (mag(normal[i]&normal1[i]) < 1.0-1e-6) + { + plane pl0(near[i], normal[i], false); + plane pl1(info[i].hitPoint(), normal1[i], false); - plane::ray r(pl0.planeIntersect(pl1)); - vector n = r.dir() / mag(r.dir()); + plane::ray r(pl0.planeIntersect(pl1)); + vector n = r.dir() / mag(r.dir()); - // Calculate vector to move onto intersection line - vector d(r.refPoint()-near[i]); - d -= (d&n)*n; + // Calculate vector to move onto intersection line + vector d(r.refPoint()-near[i]); + d -= (d&n)*n; - // Trim the max distance - scalar magD = mag(d); - if (magD > SMALL) - { - scalar maxDist = Foam::sqrt(distSqr[i]); - if (magD > maxDist) + // Trim the max distance + scalar magD = mag(d); + if (magD > SMALL) { - // Clip - d /= magD; - d *= maxDist; + scalar maxDist = Foam::sqrt(distSqr[i]); + if (magD > maxDist) + { + // Clip + d /= magD; + d *= maxDist; + } + + near[i] += d; + normal[i] = normal1[i]; + constraint[i].applyConstraint(normal1[i]); } - - near[i] += d; - normal[i] = normal1[i]; - constraint[i].applyConstraint(normal1[i]); } } + else + { + // First hit + near[i] = info[i].hitPoint(); + normal[i] = normal1[i]; + constraint[i].applyConstraint(normal1[i]); + } } } -- GitLab