Skip to content
Snippets Groups Projects
Commit 822acaf6 authored by Mark OLESEN's avatar Mark OLESEN
Browse files

ENH: make indices for boundBox::add() a templated parameter

- allows use with any container with begin(), end() and where the
  "*iterator" dereference returns a label, which is used for indexing
  into the list of points.
  This container could be labelUList, bitSet, labelHashSet, etc
parent 7bb68b4d
No related branches found
No related tags found
No related merge requests found
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. \\ / A nd | Copyright (C) 2016-2018 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
...@@ -32,6 +32,9 @@ Description ...@@ -32,6 +32,9 @@ Description
#include "boundBox.H" #include "boundBox.H"
#include "treeBoundBox.H" #include "treeBoundBox.H"
#include "cellModel.H" #include "cellModel.H"
#include "bitSet.H"
#include "HashSet.H"
#include "ListOps.H"
using namespace Foam; using namespace Foam;
...@@ -117,6 +120,29 @@ int main(int argc, char *argv[]) ...@@ -117,6 +120,29 @@ int main(int argc, char *argv[])
box1.add(box4); box1.add(box4);
Info<<"union with " << box4 << " => " << box1 << endl; Info<<"union with " << box4 << " => " << box1 << endl;
labelRange range(10, 25);
auto variousPoints = ListOps::create<point>
(
range.begin(),
range.end(),
[](const label val) { return vector(val, val, val); }
);
Info<< nl << nl;
labelHashSet select1{4, 5, 55};
bitSet select2(15, {1, 5, 20, 24, 34});
Info<< "From points: size=" << variousPoints.size() << " from "
<< variousPoints.first() << " ... " << variousPoints.last() << nl;
Info<< "add points @ " << flatOutput(select1.sortedToc()) << nl;
box1.add(variousPoints, select1);
Info<< "box is now => " << box1 << endl;
box1.add(variousPoints, select2);
Info<< "box is now => " << box1 << endl;
} }
return 0; return 0;
......
...@@ -68,8 +68,7 @@ const Foam::FixedList<Foam::vector, 6> Foam::boundBox::faceNormals ...@@ -68,8 +68,7 @@ const Foam::FixedList<Foam::vector, 6> Foam::boundBox::faceNormals
Foam::boundBox::boundBox(const UList<point>& points, bool doReduce) Foam::boundBox::boundBox(const UList<point>& points, bool doReduce)
: :
min_(invertedBox.min()), boundBox()
max_(invertedBox.max())
{ {
add(points); add(points);
...@@ -82,8 +81,7 @@ Foam::boundBox::boundBox(const UList<point>& points, bool doReduce) ...@@ -82,8 +81,7 @@ Foam::boundBox::boundBox(const UList<point>& points, bool doReduce)
Foam::boundBox::boundBox(const tmp<pointField>& tpoints, bool doReduce) Foam::boundBox::boundBox(const tmp<pointField>& tpoints, bool doReduce)
: :
min_(invertedBox.min()), boundBox()
max_(invertedBox.max())
{ {
add(tpoints); add(tpoints);
...@@ -101,8 +99,7 @@ Foam::boundBox::boundBox ...@@ -101,8 +99,7 @@ Foam::boundBox::boundBox
bool doReduce bool doReduce
) )
: :
min_(invertedBox.min()), boundBox()
max_(invertedBox.max())
{ {
add(points, indices); add(points, indices);
...@@ -246,29 +243,6 @@ bool Foam::boundBox::contains(const UList<point>& points) const ...@@ -246,29 +243,6 @@ bool Foam::boundBox::contains(const UList<point>& points) const
} }
bool Foam::boundBox::contains
(
const UList<point>& points,
const labelUList& indices
) const
{
if (points.empty() || indices.empty())
{
return true;
}
for (const label pointi : indices)
{
if (!contains(points[pointi]))
{
return false;
}
}
return true;
}
bool Foam::boundBox::containsAny(const UList<point>& points) const bool Foam::boundBox::containsAny(const UList<point>& points) const
{ {
if (points.empty()) if (points.empty())
...@@ -288,29 +262,6 @@ bool Foam::boundBox::containsAny(const UList<point>& points) const ...@@ -288,29 +262,6 @@ bool Foam::boundBox::containsAny(const UList<point>& points) const
} }
bool Foam::boundBox::containsAny
(
const UList<point>& points,
const labelUList& indices
) const
{
if (points.empty() || indices.empty())
{
return true;
}
for (const label pointi : indices)
{
if (contains(points[pointi]))
{
return true;
}
}
return false;
}
Foam::point Foam::boundBox::nearest(const point& pt) const Foam::point Foam::boundBox::nearest(const point& pt) const
{ {
// Clip the point to the range of the bounding box // Clip the point to the range of the bounding box
......
...@@ -126,7 +126,7 @@ public: ...@@ -126,7 +126,7 @@ public:
inline boundBox(Istream& is); inline boundBox(Istream& is);
// Member functions // Member Functions
// Access // Access
...@@ -201,19 +201,11 @@ public: ...@@ -201,19 +201,11 @@ public:
//- Extend to include the points from the temporary point field. //- Extend to include the points from the temporary point field.
inline void add(const tmp<pointField>& tpoints); inline void add(const tmp<pointField>& tpoints);
//- Extend to include the subset of the point field.
// The indices could be from cell/face etc.
inline void add
(
const UList<point>& points,
const labelUList& indices
);
//- Extend to include the points. //- Extend to include the points.
template<unsigned Size> template<unsigned Size>
void add(const FixedList<point, Size>& points); void add(const FixedList<point, Size>& points);
//- Extend to include the subset of the point field. //- Extend to include a (subsetted) point field.
// The indices could be from edge/triFace etc. // The indices could be from edge/triFace etc.
template<unsigned Size> template<unsigned Size>
void add void add
...@@ -222,6 +214,17 @@ public: ...@@ -222,6 +214,17 @@ public:
const FixedList<label, Size>& indices const FixedList<label, Size>& indices
); );
//- Extend to include a (subsetted) point field.
//
// \tparam IntContainer A container with an iterator that
// dereferences to an label
template<class IntContainer>
void add
(
const UList<point>& points,
const IntContainer& indices
);
//- Inflate box by factor*mag(span) in all dimensions //- Inflate box by factor*mag(span) in all dimensions
void inflate(const scalar s); void inflate(const scalar s);
...@@ -259,43 +262,53 @@ public: ...@@ -259,43 +262,53 @@ public:
//- Contains point? (inside only) //- Contains point? (inside only)
inline bool containsInside(const point& pt) const; inline bool containsInside(const point& pt) const;
//- Contains all of the points? (inside or on edge) //- Contains all points? (inside or on edge)
bool contains(const UList<point>& points) const; bool contains(const UList<point>& points) const;
//- Contains all of the subset of points? (inside or on edge) //- Contains all of the (subsetted) points? (inside or on edge)
template<unsigned Size>
bool contains bool contains
( (
const UList<point>& points, const UList<point>& points,
const labelUList& indices const FixedList<label, Size>& indices
) const; ) const;
//- Contains all of the subset of points? (inside or on edge)
template<unsigned Size> //- Contains all of the (subsetted) points? (inside or on edge)
//
// \tparam IntContainer A container with an iterator that
// dereferences to an label
template<class IntContainer>
bool contains bool contains
( (
const UList<point>& points, const UList<point>& points,
const FixedList<label, Size>& indices const IntContainer& indices
) const; ) const;
//- Contains any of the points? (inside or on edge) //- Contains any of the points? (inside or on edge)
bool containsAny(const UList<point>& points) const; bool containsAny(const UList<point>& points) const;
//- Contains any of the subset of points? (inside or on edge) //- Contains any of the (subsetted) points? (inside or on edge)
template<unsigned Size>
bool containsAny bool containsAny
( (
const UList<point>& points, const UList<point>& points,
const labelUList& indices const FixedList<label, Size>& indices
) const; ) const;
//- Contains any of the subset of points? (inside or on edge) //- Contains any of the (subsetted) points? (inside or on edge)
template<unsigned Size> //
// \tparam IntContainer A container with an iterator that
// dereferences to an label
template<class IntContainer>
bool containsAny bool containsAny
( (
const UList<point>& points, const UList<point>& points,
const FixedList<label, Size>& indices const IntContainer& indices
) const; ) const;
//- Return the nearest point on the boundBox to the supplied point. //- Return the nearest point on the boundBox to the supplied point.
// If point is inside the boundBox then the point is returned // If point is inside the boundBox then the point is returned
// unchanged. // unchanged.
......
...@@ -25,7 +25,6 @@ License ...@@ -25,7 +25,6 @@ License
#include "boundBox.H" #include "boundBox.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
inline Foam::boundBox::boundBox() inline Foam::boundBox::boundBox()
...@@ -195,22 +194,6 @@ inline void Foam::boundBox::add(const tmp<pointField>& tpoints) ...@@ -195,22 +194,6 @@ inline void Foam::boundBox::add(const tmp<pointField>& tpoints)
} }
inline void Foam::boundBox::add
(
const UList<point>& points,
const labelUList& indices
)
{
if (!points.empty())
{
for (const label pointi : indices)
{
add(points[pointi]);
}
}
}
inline bool Foam::boundBox::overlaps(const boundBox& bb) const inline bool Foam::boundBox::overlaps(const boundBox& bb) const
{ {
return return
......
...@@ -36,8 +36,7 @@ Foam::boundBox::boundBox ...@@ -36,8 +36,7 @@ Foam::boundBox::boundBox
bool doReduce bool doReduce
) )
: :
min_(invertedBox.min()), boundBox()
max_(invertedBox.max())
{ {
add(points, indices); add(points, indices);
...@@ -56,10 +55,9 @@ void Foam::boundBox::add ...@@ -56,10 +55,9 @@ void Foam::boundBox::add
const FixedList<point, Size>& points const FixedList<point, Size>& points
) )
{ {
// a FixedList is never empty for (const point& p : points)
for (unsigned i=0; i < Size; ++i)
{ {
add(points[i]); add(p);
} }
} }
...@@ -71,64 +69,166 @@ void Foam::boundBox::add ...@@ -71,64 +69,166 @@ void Foam::boundBox::add
const FixedList<label, Size>& indices const FixedList<label, Size>& indices
) )
{ {
// points may be empty, but a FixedList is never empty const label len = points.size();
if (!points.empty())
// Skip if points is empty
if (len)
{
for (const label pointi : indices)
{
if (pointi >= 0 && pointi < len)
{
add(points[pointi]);
}
}
}
}
template<class IntContainer>
void Foam::boundBox::add
(
const UList<point>& points,
const IntContainer& indices
)
{
const label len = points.size();
// Skip if points is empty
if (len)
{ {
for (const label pointi : indices) for (const label pointi : indices)
{
if (pointi >= 0 && pointi < len)
{ {
add(points[pointi]); add(points[pointi]);
} }
} }
} }
}
template<unsigned Size> template<unsigned Size>
bool Foam::boundBox::contains inline bool Foam::boundBox::contains
( (
const UList<point>& points, const UList<point>& points,
const FixedList<label, Size>& indices const FixedList<label, Size>& indices
) const ) const
{ {
// points may be empty, but a FixedList is never empty const label len = points.size();
if (points.empty())
if (!len)
{
return true;
}
for (const label pointi : indices)
{
if (pointi >= 0 && pointi < len)
{
if (!contains(points[pointi]))
{ {
return false; return false;
} }
}
}
return true;
}
template<class IntContainer>
inline bool Foam::boundBox::contains
(
const UList<point>& points,
const IntContainer& indices
) const
{
const label len = points.size();
if (!len)
{
return true;
}
for (const label pointi : indices) for (const label pointi : indices)
{
if (pointi >= 0 && pointi < len)
{ {
if (!contains(points[pointi])) if (!contains(points[pointi]))
{ {
return false; return false;
} }
} }
}
return true; return true;
} }
template<unsigned Size> template<unsigned Size>
bool Foam::boundBox::containsAny inline bool Foam::boundBox::containsAny
( (
const UList<point>& points, const UList<point>& points,
const FixedList<label, Size>& indices const FixedList<label, Size>& indices
) const ) const
{ {
// points may be empty, but a FixedList is never empty const label len = points.size();
if (points.empty())
if (!len)
{ {
return false; return true;
} }
label failed = 0;
for (const label pointi : indices) for (const label pointi : indices)
{
if (pointi >= 0 && pointi < len)
{ {
if (contains(points[pointi])) if (contains(points[pointi]))
{ {
return true; return true;
} }
++failed;
}
} }
return false; return !failed;
}
template<class IntContainer>
inline bool Foam::boundBox::containsAny
(
const UList<point>& points,
const IntContainer& indices
) const
{
const label len = points.size();
if (!len)
{
return true;
}
label failed = 0;
for (const label pointi : indices)
{
if (pointi >= 0 && pointi < len)
{
if (contains(points[pointi]))
{
return true;
}
++failed;
}
}
return !failed;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment