mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: treeDataPrimitivePatch: exposed findIntersection
This commit is contained in:
@ -66,76 +66,6 @@ void Foam::treeDataPrimitivePatch<PatchType>::update()
|
||||
}
|
||||
|
||||
|
||||
template<class PatchType>
|
||||
bool Foam::treeDataPrimitivePatch<PatchType>::findIntersection
|
||||
(
|
||||
const indexedOctree<treeDataPrimitivePatch<PatchType> >& tree,
|
||||
const label index,
|
||||
const point& start,
|
||||
const point& end,
|
||||
point& intersectionPoint
|
||||
)
|
||||
{
|
||||
const treeDataPrimitivePatch<PatchType>& shape = tree.shapes();
|
||||
const PatchType& patch = shape.patch();
|
||||
|
||||
const pointField& points = patch.points();
|
||||
const typename PatchType::FaceType& f = patch[index];
|
||||
|
||||
// Do quick rejection test
|
||||
if (shape.cacheBb_)
|
||||
{
|
||||
const treeBoundBox& faceBb = shape.bbs_[index];
|
||||
|
||||
if ((faceBb.posBits(start) & faceBb.posBits(end)) != 0)
|
||||
{
|
||||
// start and end in same block outside of faceBb.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const vector dir(end - start);
|
||||
pointHit inter;
|
||||
|
||||
if (f.size() == 3)
|
||||
{
|
||||
inter = triPointRef
|
||||
(
|
||||
points[f[0]],
|
||||
points[f[1]],
|
||||
points[f[2]]
|
||||
).intersection(start, dir, intersection::HALF_RAY, shape.planarTol_);
|
||||
}
|
||||
else
|
||||
{
|
||||
const pointField& faceCentres = patch.faceCentres();
|
||||
|
||||
inter = f.intersection
|
||||
(
|
||||
start,
|
||||
dir,
|
||||
faceCentres[index],
|
||||
points,
|
||||
intersection::HALF_RAY,
|
||||
shape.planarTol_
|
||||
);
|
||||
}
|
||||
|
||||
if (inter.hit() && inter.distance() <= 1)
|
||||
{
|
||||
// Note: no extra test on whether intersection is in front of us
|
||||
// since using half_ray
|
||||
intersectionPoint = inter.hitPoint();
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
// Construct from components
|
||||
@ -700,4 +630,74 @@ bool Foam::treeDataPrimitivePatch<PatchType>::findSelfIntersectOp::operator()
|
||||
}
|
||||
|
||||
|
||||
template<class PatchType>
|
||||
bool Foam::treeDataPrimitivePatch<PatchType>::findIntersection
|
||||
(
|
||||
const indexedOctree<treeDataPrimitivePatch<PatchType> >& tree,
|
||||
const label index,
|
||||
const point& start,
|
||||
const point& end,
|
||||
point& intersectionPoint
|
||||
)
|
||||
{
|
||||
const treeDataPrimitivePatch<PatchType>& shape = tree.shapes();
|
||||
const PatchType& patch = shape.patch();
|
||||
|
||||
const pointField& points = patch.points();
|
||||
const typename PatchType::FaceType& f = patch[index];
|
||||
|
||||
// Do quick rejection test
|
||||
if (shape.cacheBb_)
|
||||
{
|
||||
const treeBoundBox& faceBb = shape.bbs_[index];
|
||||
|
||||
if ((faceBb.posBits(start) & faceBb.posBits(end)) != 0)
|
||||
{
|
||||
// start and end in same block outside of faceBb.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const vector dir(end - start);
|
||||
pointHit inter;
|
||||
|
||||
if (f.size() == 3)
|
||||
{
|
||||
inter = triPointRef
|
||||
(
|
||||
points[f[0]],
|
||||
points[f[1]],
|
||||
points[f[2]]
|
||||
).intersection(start, dir, intersection::HALF_RAY, shape.planarTol_);
|
||||
}
|
||||
else
|
||||
{
|
||||
const pointField& faceCentres = patch.faceCentres();
|
||||
|
||||
inter = f.intersection
|
||||
(
|
||||
start,
|
||||
dir,
|
||||
faceCentres[index],
|
||||
points,
|
||||
intersection::HALF_RAY,
|
||||
shape.planarTol_
|
||||
);
|
||||
}
|
||||
|
||||
if (inter.hit() && inter.distance() <= 1)
|
||||
{
|
||||
// Note: no extra test on whether intersection is in front of us
|
||||
// since using half_ray
|
||||
intersectionPoint = inter.hitPoint();
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -86,16 +86,6 @@ class treeDataPrimitivePatch
|
||||
//- Initialise all member data
|
||||
void update();
|
||||
|
||||
//- Find intersection of line with shapes
|
||||
static bool findIntersection
|
||||
(
|
||||
const indexedOctree<treeDataPrimitivePatch<PatchType> >& tree,
|
||||
const label index,
|
||||
const point& start,
|
||||
const point& end,
|
||||
point& intersectionPoint
|
||||
);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
@ -260,6 +250,16 @@ public:
|
||||
const point& centre,
|
||||
const scalar radiusSqr
|
||||
) const;
|
||||
|
||||
//- Helper: find intersection of line with shapes
|
||||
static bool findIntersection
|
||||
(
|
||||
const indexedOctree<treeDataPrimitivePatch<PatchType> >& tree,
|
||||
const label index,
|
||||
const point& start,
|
||||
const point& end,
|
||||
point& intersectionPoint
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user