File indexing completed on 2025-01-18 10:03:05
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
0021 #include <Standard_Integer.hxx>
0022 #include <algorithm>
0023
0024
0025 template <int Dimension>
0026 class BOPTools_PairSelector :
0027 public BVH_PairTraverse <Standard_Real, Dimension, BVH_BoxSet <Standard_Real, Dimension, Standard_Integer>>
0028 {
0029 public:
0030
0031
0032 struct PairIDs
0033 {
0034 PairIDs (const Standard_Integer theId1 = -1,
0035 const Standard_Integer theId2 = -1)
0036 : ID1 (theId1), ID2 (theId2)
0037 {}
0038
0039 Standard_Boolean operator< (const PairIDs& theOther) const
0040 {
0041 return ID1 < theOther.ID1 ||
0042 (ID1 == theOther.ID1 && ID2 < theOther.ID2);
0043 }
0044
0045 Standard_Integer ID1;
0046 Standard_Integer ID2;
0047 };
0048
0049 typedef typename BVH::VectorType<Standard_Real, Dimension>::Type BVH_VecNd;
0050
0051 public:
0052
0053
0054 BOPTools_PairSelector()
0055 : mySameBVHs (Standard_False)
0056 {}
0057
0058 public:
0059
0060
0061 void Clear()
0062 {
0063 myPairs.clear();
0064 }
0065
0066
0067 void Sort()
0068 {
0069 std::sort (myPairs.begin(), myPairs.end());
0070 }
0071
0072
0073
0074
0075
0076
0077
0078
0079 void SetSame (const Standard_Boolean theIsSame)
0080 {
0081 mySameBVHs = theIsSame;
0082 }
0083
0084
0085 const std::vector<PairIDs>& Pairs() const
0086 {
0087 return myPairs;
0088 }
0089
0090 public:
0091
0092
0093 virtual Standard_Boolean RejectNode (const BVH_VecNd& theCMin1,
0094 const BVH_VecNd& theCMax1,
0095 const BVH_VecNd& theCMin2,
0096 const BVH_VecNd& theCMax2,
0097 Standard_Real&) const Standard_OVERRIDE
0098 {
0099 return BVH_Box<Standard_Real, 3> (theCMin1, theCMax1).IsOut (theCMin2, theCMax2);
0100 }
0101
0102
0103 Standard_Boolean RejectElement (const Standard_Integer theID1,
0104 const Standard_Integer theID2)
0105 {
0106 return (mySameBVHs && theID1 >= theID2) ||
0107 this->myBVHSet1->Box (theID1).IsOut(
0108 this->myBVHSet2->Box (theID2));
0109 }
0110
0111
0112 virtual Standard_Boolean Accept (const Standard_Integer theID1,
0113 const Standard_Integer theID2) Standard_OVERRIDE
0114 {
0115 if (!RejectElement (theID1, theID2))
0116 {
0117 myPairs.push_back (PairIDs (this->myBVHSet1->Element (theID1),
0118 this->myBVHSet2->Element (theID2)));
0119 return Standard_True;
0120 }
0121 return Standard_False;
0122 }
0123
0124 protected:
0125
0126 std::vector<PairIDs> myPairs;
0127 Standard_Boolean mySameBVHs;
0128 };
0129
0130 #endif