File indexing completed on 2026-09-27 09:16:56
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #ifndef BOPTools_PairSelector_HeaderFile
0016 #define BOPTools_PairSelector_HeaderFile
0017
0018 #include <BVH_Traverse.hxx>
0019 #include <BVH_BoxSet.hxx>
0020 #include <NCollection_LinearVector.hxx>
0021
0022 #include <algorithm>
0023
0024
0025 template <int Dimension>
0026 class BOPTools_PairSelector
0027 : public BVH_PairTraverse<double, Dimension, BVH_BoxSet<double, Dimension, int>>
0028 {
0029 public:
0030
0031 struct PairIDs
0032 {
0033 PairIDs(const int theId1 = -1, const int theId2 = -1)
0034 : ID1(theId1),
0035 ID2(theId2)
0036 {
0037 }
0038
0039 bool operator<(const PairIDs& theOther) const
0040 {
0041 return ID1 < theOther.ID1 || (ID1 == theOther.ID1 && ID2 < theOther.ID2);
0042 }
0043
0044 int ID1;
0045 int ID2;
0046 };
0047
0048 typedef typename BVH::VectorType<double, Dimension>::Type BVH_VecNd;
0049
0050 public:
0051
0052 BOPTools_PairSelector()
0053 : mySameBVHs(false)
0054 {
0055 }
0056
0057 public:
0058
0059 void Clear() { myPairs.Clear(); }
0060
0061
0062 void Sort() { std::sort(myPairs.begin(), myPairs.end()); }
0063
0064
0065
0066
0067
0068
0069
0070
0071 void SetSame(const bool theIsSame) { mySameBVHs = theIsSame; }
0072
0073
0074 const NCollection_LinearVector<PairIDs>& Pairs() const { return myPairs; }
0075
0076 public:
0077
0078 bool RejectNode(const BVH_VecNd& theCMin1,
0079 const BVH_VecNd& theCMax1,
0080 const BVH_VecNd& theCMin2,
0081 const BVH_VecNd& theCMax2,
0082 double&) const override
0083 {
0084 return BVH_Box<double, 3>(theCMin1, theCMax1).IsOut(theCMin2, theCMax2);
0085 }
0086
0087
0088 bool RejectElement(const int theID1, const int theID2)
0089 {
0090 return (mySameBVHs && theID1 >= theID2)
0091 || this->myBVHSet1->Box(theID1).IsOut(this->myBVHSet2->Box(theID2));
0092 }
0093
0094
0095 bool Accept(const int theID1, const int theID2) override
0096 {
0097 if (!RejectElement(theID1, theID2))
0098 {
0099 myPairs.Append(PairIDs(this->myBVHSet1->Element(theID1), this->myBVHSet2->Element(theID2)));
0100 return true;
0101 }
0102 return false;
0103 }
0104
0105 protected:
0106 NCollection_LinearVector<PairIDs> myPairs;
0107 bool mySameBVHs;
0108 };
0109
0110 #endif