mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: searchableSurface: handle multiple surfaces. Fixes #1034
This commit is contained in:
@ -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]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user