mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
have single intersection only
This commit is contained in:
@ -436,7 +436,13 @@ void Foam::searchableBox::findLineAll
|
|||||||
// Work array
|
// Work array
|
||||||
DynamicList<pointIndexHit, 1, 1> hits;
|
DynamicList<pointIndexHit, 1, 1> hits;
|
||||||
|
|
||||||
// Tolerances
|
//XXX
|
||||||
|
// Tolerances:
|
||||||
|
// To find all intersections we add a small vector to the last intersection
|
||||||
|
// This is chosen such that
|
||||||
|
// - it is significant (SMALL is smallest representative relative tolerance;
|
||||||
|
// we need something bigger since we're doing calculations)
|
||||||
|
// - if the start-end vector is zero we still progress
|
||||||
const vectorField dirVec(end-start);
|
const vectorField dirVec(end-start);
|
||||||
const scalarField magSqrDirVec(magSqr(dirVec));
|
const scalarField magSqrDirVec(magSqr(dirVec));
|
||||||
const vectorField smallVec
|
const vectorField smallVec
|
||||||
@ -447,34 +453,44 @@ void Foam::searchableBox::findLineAll
|
|||||||
|
|
||||||
forAll(start, pointI)
|
forAll(start, pointI)
|
||||||
{
|
{
|
||||||
hits.clear();
|
// See if any intersection between pt and end
|
||||||
|
pointIndexHit inter = findLine(start[pointI], end[pointI]);
|
||||||
|
|
||||||
// Current starting point of ray.
|
if (inter.hit())
|
||||||
point pt = start[pointI];
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
{
|
||||||
// See if any intersection between pt and end
|
hits.clear();
|
||||||
pointIndexHit inter = findLine(pt, end[pointI]);
|
|
||||||
|
|
||||||
if (!inter.hit())
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
hits.append(inter);
|
hits.append(inter);
|
||||||
|
|
||||||
pt = inter.hitPoint() + smallVec[pointI];
|
point pt = inter.hitPoint() + smallVec[pointI];
|
||||||
|
|
||||||
if (((pt-start[pointI])&dirVec[pointI]) > magSqrDirVec[pointI])
|
while (((pt-start[pointI])&dirVec[pointI]) <= magSqrDirVec[pointI])
|
||||||
{
|
{
|
||||||
// Adding smallVec has taken us beyond end
|
// See if any intersection between pt and end
|
||||||
break;
|
pointIndexHit inter = findLine(pt, end[pointI]);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hits.shrink();
|
// Check for not hit or hit same face as before (can happen
|
||||||
info[pointI].transfer(hits);
|
// if vector along surface of face)
|
||||||
hits.clear();
|
if
|
||||||
|
(
|
||||||
|
!inter.hit()
|
||||||
|
|| (inter.index() == hits[hits.size()-1].index())
|
||||||
|
)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
hits.append(inter);
|
||||||
|
|
||||||
|
pt = inter.hitPoint() + smallVec[pointI];
|
||||||
|
}
|
||||||
|
|
||||||
|
hits.shrink();
|
||||||
|
info[pointI].transfer(hits);
|
||||||
|
hits.clear();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
info[pointI].clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user