34 Foam::scalar Foam::treeDataFace::tolSqr =
sqr(1
E-6);
43 const face&
f = mesh_.
faces()[faceI];
45 treeBoundBox bb(points[f[0]], points[f[0]]);
47 for (label fp = 1; fp < f.size(); fp++)
49 const point&
p = points[f[fp]];
51 bb.min() =
min(bb.min(),
p);
52 bb.max() =
max(bb.max(),
p);
58 void Foam::treeDataFace::update()
62 isTreeFace_.set(faceLabels_[i], 1);
67 bbs_.setSize(faceLabels_.size());
71 bbs_[i] = calcBb(faceLabels_[i]);
88 faceLabels_(faceLabels),
89 isTreeFace_(mesh.
nFaces(), 0),
103 faceLabels_(
identity(mesh_.nFaces())),
104 isTreeFace_(mesh.
nFaces(), 0),
123 isTreeFace_(mesh_.nFaces(), 0),
138 cc[i] = mesh_.faceCentres()[faceLabels_[i]];
167 if (info.
index() == -1)
171 "treeDataFace::getSampleType"
172 "(indexedOctree<treeDataFace>&, const point&)"
173 ) <<
"Could not find " << sample <<
" in octree."
179 label faceI = faceLabels_[info.
index()];
183 Pout<<
"getSampleType : sample:" << sample
184 <<
" nearest face:" << faceI;
192 const face& f = mesh_.faces()[faceI];
193 const vector& area = mesh_.faceAreas()[faceI];
194 const point& fc = mesh_.faceCentres()[faceI];
209 Pout<<
" -> face hit:" << curPt
210 <<
" comparing to face normal " << area <<
endl;
217 Pout<<
" -> face miss:" << curPt;
225 const scalar typDimSqr =
mag(area) + VSMALL;
229 if ((
magSqr(points[f[fp]] - curPt)/typDimSqr) < tolSqr)
241 if (isTreeFace_.get(pFaces[i]) == 1)
243 vector n = mesh_.faceAreas()[pFaces[i]];
244 n /=
mag(n) + VSMALL;
252 Pout<<
" -> face point hit :" << points[f[fp]]
253 <<
" point normal:" << pointNormal
255 <<
magSqr(points[f[fp]] - curPt)/typDimSqr <<
endl;
264 if ((
magSqr(fc - curPt)/typDimSqr) < tolSqr)
271 Pout<<
" -> centre hit:" << fc
272 <<
" distance:" <<
magSqr(fc - curPt)/typDimSqr <<
endl;
284 const labelList& myEdges = mesh_.faceEdges()[faceI];
288 const edge&
e = mesh_.edges()[myEdges[myEdgeI]];
295 ).nearestDist(sample);
304 const labelList& eFaces = mesh_.edgeFaces()[myEdges[myEdgeI]];
310 if (isTreeFace_.get(eFaces[i]) == 1)
312 vector n = mesh_.faceAreas()[eFaces[i]];
313 n /=
mag(n) + VSMALL;
322 <<
" comparing to edge normal:" << edgeNormal
347 ).nearestDist(sample);
355 vector ePrev = points[f[f.rcIndex(fp)]] - fc;
356 vector eNext = points[f[f.fcIndex(fp)]] - fc;
359 nLeft /=
mag(nLeft) + VSMALL;
361 vector nRight = e ^ eNext;
362 nRight /=
mag(nRight) + VSMALL;
366 Pout<<
" -> internal edge hit point:" << edgeHit.
rawPoint()
367 <<
" comparing to edge normal "
368 << 0.5*(nLeft + nRight)
376 0.5*(nLeft + nRight),
384 Pout<<
"Did not find sample " << sample
385 <<
" anywhere related to nearest face " << faceI <<
endl
390 Pout<<
" vertex:" << f[fp] <<
" coord:" << points[f[fp]]
421 if (!cubeBb.
overlaps(calcBb(faceLabels_[index])))
431 label faceI = faceLabels_[index];
433 const face& f = mesh_.faces()[faceI];
445 const point& fc = mesh_.faceCentres()[faceI];
473 scalar& nearestDistSqr,
480 label index = indices[i];
482 const face& f = mesh_.faces()[faceLabels_[index]];
487 if (distSqr < nearestDistSqr)
489 nearestDistSqr = distSqr;
502 point& intersectionPoint
517 label faceI = faceLabels_[index];
519 const vector dir(end - start);
521 pointHit inter = mesh_.faces()[faceI].intersection
525 mesh_.faceCentres()[faceI],
534 intersectionPoint = inter.
hitPoint();