forAll(probeLocations(), probei) { const point sample = probeLocations()[probei]; scalar span = boundaryTree.bb().mag(); pointIndexHit info = boundaryTree.findNearest ( sample, Foam::sqr(span) ); if (!info.hit()) { info = boundaryTree.findNearest ( sample, Foam::sqr(GREAT) ); } label facei = boundaryTree.shapes().faceLabels()[info.index()]; const label patchi = bm.whichPatch(facei); if (isA<emptyPolyPatch>(bm[patchi])) { WarningInFunction << " The sample point: " << sample << " belongs to " << patchi << " which is an empty patch. This is not permitted. " << " This sample will not be included " << endl; } else { const point& fc = mesh.faceCentres()[facei]; mappedPatchBase::nearInfo sampleInfo; sampleInfo.first() = pointIndexHit ( true, fc, facei ); sampleInfo.second().first() = magSqr(fc-sample); sampleInfo.second().second() = Pstream::myProcNo(); nearest[probei]= sampleInfo; } }
void Foam::searchableDisk::findLine ( const point& start, const point& end, pointIndexHit& info ) const { info = pointIndexHit(false, Zero, -1); vector v(start - origin_); // Decompose sample-origin into normal and parallel component scalar parallel = (v & normal_); if (sign(parallel) == sign((end - origin_) & normal_)) { return; } // Remove the parallel component and normalise v -= parallel*normal_; scalar magV = mag(v); if (magV < ROOTVSMALL) { v = Zero; } else { v /= magV; } // Set (hit or miss) to intersection of ray and plane of disk info.setPoint(origin_ + magV*v); if (magV <= radius_) { info.setHit(); info.setIndex(0); } }
//- Get nearest point on edge and classify position on edge. Foam::pointIndexHit Foam::surfaceFeatures::edgeNearest ( const point& start, const point& end, const point& sample ) { pointHit eHit = linePointRef(start, end).nearestDist(sample); // Classification of position on edge. label endPoint; if (eHit.hit()) { // Nearest point is on edge itself. // Note: might be at or very close to endpoint. We should use tolerance // here. endPoint = -1; } else { // Nearest point has to be one of the end points. Find out // which one. if ( mag(eHit.rawPoint() - start) < mag(eHit.rawPoint() - end) ) { endPoint = 0; } else { endPoint = 1; } } return pointIndexHit(eHit.hit(), eHit.rawPoint(), endPoint); }
void Foam::searchableSurfaceCollection::findNearest ( const pointField& samples, scalarField& minDistSqr, List<pointIndexHit>& nearestInfo, labelList& nearestSurf ) const { // Initialise nearestInfo.setSize(samples.size()); nearestInfo = pointIndexHit(); nearestSurf.setSize(samples.size()); nearestSurf = -1; List<pointIndexHit> hitInfo(samples.size()); const scalarField localMinDistSqr(samples.size(), GREAT); forAll(subGeom_, surfI) { subGeom_[surfI].findNearest ( cmptDivide // Transform then divide ( transform_[surfI].localPosition(samples), scale_[surfI] ), localMinDistSqr, hitInfo ); forAll(hitInfo, pointI) { if (hitInfo[pointI].hit()) { // Rework back into global coordinate sys. Multiply then // transform point globalPt = transform_[surfI].globalPosition ( cmptMultiply ( hitInfo[pointI].rawPoint(), scale_[surfI] ) ); scalar distSqr = magSqr(globalPt - samples[pointI]); if (distSqr < minDistSqr[pointI]) { minDistSqr[pointI] = distSqr; nearestInfo[pointI].setPoint(globalPt); nearestInfo[pointI].setHit(); nearestInfo[pointI].setIndex ( hitInfo[pointI].index() + indexOffset_[surfI] ); nearestSurf[pointI] = surfI; } } } }