diff --git a/src/meshTools/searchableSurface/searchableBox.C b/src/meshTools/searchableSurface/searchableBox.C index cb664b5757..b1776b3c9e 100644 --- a/src/meshTools/searchableSurface/searchableBox.C +++ b/src/meshTools/searchableSurface/searchableBox.C @@ -436,7 +436,13 @@ void Foam::searchableBox::findLineAll // Work array DynamicList 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 scalarField magSqrDirVec(magSqr(dirVec)); const vectorField smallVec @@ -447,34 +453,44 @@ void Foam::searchableBox::findLineAll 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. - point pt = start[pointI]; - - while (true) + if (inter.hit()) { - // See if any intersection between pt and end - pointIndexHit inter = findLine(pt, end[pointI]); - - if (!inter.hit()) - { - break; - } + hits.clear(); 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 - break; - } - } + // See if any intersection between pt and end + pointIndexHit inter = findLine(pt, end[pointI]); - hits.shrink(); - info[pointI].transfer(hits); - hits.clear(); + // Check for not hit or hit same face as before (can happen + // if vector along surface of face) + 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(); + } } }