have single intersection only

This commit is contained in:
mattijs
2008-08-08 11:02:05 +01:00
parent 38870e3256
commit b6c8c1dca1

View File

@ -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();
}
} }
} }