ENH: searchableSurface: handle multiple surfaces. Fixes #1034

This commit is contained in:
mattijs
2018-10-08 17:11:37 +01:00
parent c006a10bd8
commit 6eb1f6fefc

View File

@ -516,37 +516,48 @@ void Foam::searchableSurfacesQueries::findNearest
// - current surface : info+normal1 // - current surface : info+normal1
forAll(near, i) 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); // Have previous hit. Find intersection
plane pl1(info[i].hitPoint(), normal1[i], false); if (mag(normal[i]&normal1[i]) < 1.0-1e-6)
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;
// Trim the max distance
scalar magD = mag(d);
if (magD > SMALL)
{ {
scalar maxDist = Foam::sqrt(distSqr[i]); plane pl0(near[i], normal[i], false);
if (magD > maxDist) plane pl1(info[i].hitPoint(), normal1[i], false);
{
// Clip
d /= magD;
d *= maxDist;
}
near[i] += d; plane::ray r(pl0.planeIntersect(pl1));
normal[i] = normal1[i]; vector n = r.dir() / mag(r.dir());
constraint[i].applyConstraint(normal1[i]);
// 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)
{
// Clip
d /= magD;
d *= maxDist;
}
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]);
}
} }
} }