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 * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
// Construct from components
|
// 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
|
//- Initialise all member data
|
||||||
void update();
|
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:
|
public:
|
||||||
|
|
||||||
@ -260,6 +250,16 @@ public:
|
|||||||
const point& centre,
|
const point& centre,
|
||||||
const scalar radiusSqr
|
const scalar radiusSqr
|
||||||
) const;
|
) 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