Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-07-29 09:14:33

0001 // Created by: Eugeny MALTCHIKOV
0002 // Copyright (c) 2017 OPEN CASCADE SAS
0003 //
0004 // This file is part of Open CASCADE Technology software library.
0005 //
0006 // This library is free software; you can redistribute it and/or modify it under
0007 // the terms of the GNU Lesser General Public License version 2.1 as published
0008 // by the Free Software Foundation, with special exception defined in the file
0009 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
0010 // distribution for complete text of the license and disclaimer of any warranty.
0011 //
0012 // Alternatively, this file may be used under the terms of Open CASCADE
0013 // commercial license or contractual agreement.
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 //! Template Selector for selection of the elements from two BVH trees.
0025 template <int Dimension>
0026 class BOPTools_PairSelector
0027     : public BVH_PairTraverse<Standard_Real,
0028                               Dimension,
0029                               BVH_BoxSet<Standard_Real, Dimension, Standard_Integer>>
0030 {
0031 public: //! @name public types
0032   //! Auxiliary structure to keep the pair of indices
0033   struct PairIDs
0034   {
0035     PairIDs(const Standard_Integer theId1 = -1, const Standard_Integer theId2 = -1)
0036         : ID1(theId1),
0037           ID2(theId2)
0038     {
0039     }
0040 
0041     Standard_Boolean operator<(const PairIDs& theOther) const
0042     {
0043       return ID1 < theOther.ID1 || (ID1 == theOther.ID1 && ID2 < theOther.ID2);
0044     }
0045 
0046     Standard_Integer ID1;
0047     Standard_Integer ID2;
0048   };
0049 
0050   typedef typename BVH::VectorType<Standard_Real, Dimension>::Type BVH_VecNd;
0051 
0052 public: //! @name Constructor
0053   //! Empty constructor
0054   BOPTools_PairSelector()
0055       : mySameBVHs(Standard_False)
0056   {
0057   }
0058 
0059 public: //! @name public interfaces
0060   //! Clears the indices
0061   void Clear() { myPairs.clear(); }
0062 
0063   //! Sorts the indices
0064   void Sort() { std::sort(myPairs.begin(), myPairs.end()); }
0065 
0066   //! Tells to selector that BVH trees are the same.
0067   //! If the flag is set to true the resulting vector will contain
0068   //! only unique pairs (mirrored pairs will be rejected,
0069   //! e.g. (1, 2) will be taken, (2, 1) will be rejected) and will
0070   //! not contain pairs in which IDs are the same (pair (1, 1) will be rejected).
0071   //! If it is required to have a full vector of pairs even
0072   //! for the same BVH trees, just keep the false value of this flag.
0073   void SetSame(const Standard_Boolean theIsSame) { mySameBVHs = theIsSame; }
0074 
0075   //! Returns the list of accepted indices
0076   const std::vector<PairIDs>& Pairs() const { return myPairs; }
0077 
0078 public: //! @name Rejection/Acceptance rules
0079   //! Basing on the bounding boxes of the nodes checks if the pair of nodes should be rejected.
0080   virtual Standard_Boolean RejectNode(const BVH_VecNd& theCMin1,
0081                                       const BVH_VecNd& theCMax1,
0082                                       const BVH_VecNd& theCMin2,
0083                                       const BVH_VecNd& theCMax2,
0084                                       Standard_Real&) const Standard_OVERRIDE
0085   {
0086     return BVH_Box<Standard_Real, 3>(theCMin1, theCMax1).IsOut(theCMin2, theCMax2);
0087   }
0088 
0089   //! Checks if the pair of elements should be rejected.
0090   Standard_Boolean RejectElement(const Standard_Integer theID1, const Standard_Integer theID2)
0091   {
0092     return (mySameBVHs && theID1 >= theID2)
0093            || this->myBVHSet1->Box(theID1).IsOut(this->myBVHSet2->Box(theID2));
0094   }
0095 
0096   //! Checks and accepts the pair of elements.
0097   virtual Standard_Boolean Accept(const Standard_Integer theID1,
0098                                   const Standard_Integer theID2) Standard_OVERRIDE
0099   {
0100     if (!RejectElement(theID1, theID2))
0101     {
0102       myPairs.push_back(
0103         PairIDs(this->myBVHSet1->Element(theID1), this->myBVHSet2->Element(theID2)));
0104       return Standard_True;
0105     }
0106     return Standard_False;
0107   }
0108 
0109 protected:                         //! @name Fields
0110   std::vector<PairIDs> myPairs;    //!< Selected pairs of indices
0111   Standard_Boolean     mySameBVHs; //!< Selection is performed from the same BVH trees
0112 };
0113 
0114 #endif