mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-05-01 10:26:12 +03:00
Provide the easy to use interfaces for selection of the elements from BVH tree. The selection rules should be implemented in the selector class derived from *BVH_Traverse* or in *BVH_PairTraverse* in Reject/Accept methods. The *BVH_Traverse* is used for selection of the elements from the tree. The *BVH_PairTraverse* is used for selection of the pairs of elements from two BVH trees. Auxiliary changes: - Two methods BVH_Box::IsOut(OtherBox) and BVH_Box::IsOut(Point) have been added; - Added methods for conversion of Bnd boxes to BVH boxes Added new class *BVH_Tools* containing useful static methods operating on BVH points and boxes. The classes BRepExtrema_OverlapTool and BVH_DistanceField have been rebased to use the new traverse methods.
133 lines
4.2 KiB
C++
133 lines
4.2 KiB
C++
// Created by: Eugeny MALTCHIKOV
|
|
// Created on: 2019-04-17
|
|
// Copyright (c) 2019 OPEN CASCADE SAS
|
|
//
|
|
// This file is part of Open CASCADE Technology software library.
|
|
//
|
|
// This library is free software; you can redistribute it and/or modify it under
|
|
// the terms of the GNU Lesser General Public License version 2.1 as published
|
|
// by the Free Software Foundation, with special exception defined in the file
|
|
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
|
|
// distribution for complete text of the license and disclaimer of any warranty.
|
|
//
|
|
// Alternatively, this file may be used under the terms of Open CASCADE
|
|
// commercial license or contractual agreement.
|
|
|
|
#ifndef _BVH_BoxSet_Header
|
|
#define _BVH_BoxSet_Header
|
|
|
|
#include <BVH_PrimitiveSet.hxx>
|
|
|
|
//! Implements easy to use interfaces for adding the elements into
|
|
//! BVH tree and its following construction.
|
|
//! To make it more effective it is better to set the number of elements
|
|
//! that are going to be added into BVH tree.
|
|
//! For better efficiency on heavy data types it is recommended to use
|
|
//! either BHV_IndexedBoxSet which uses indirect indexing for accessing
|
|
//! the elements and their boxes or set the element to be an index
|
|
//! of the real element in the application's internal data structures.
|
|
//!
|
|
//! \tparam NumType Numeric data type
|
|
//! \tparam Dimension Vector dimension
|
|
//! \tparam DataType Type of elements on which the boxes are built
|
|
template <class NumType, int Dimension, class DataType = Standard_Integer>
|
|
class BVH_BoxSet : public BVH_PrimitiveSet <NumType, Dimension>
|
|
{
|
|
public: //! @name Constructors
|
|
|
|
//! Empty constructor for use the default BVH_Builder
|
|
BVH_BoxSet()
|
|
: BVH_PrimitiveSet <NumType, Dimension>()
|
|
{
|
|
}
|
|
|
|
//! Constructor for usage the custom BVH builder
|
|
BVH_BoxSet (const opencascade::handle <BVH_Builder <NumType, Dimension> >& theBuilder)
|
|
: BVH_PrimitiveSet <NumType, Dimension> (theBuilder)
|
|
{
|
|
}
|
|
|
|
public: //! @name Setting expected size of the BVH
|
|
|
|
//! Sets the expected size of BVH tree
|
|
virtual void SetSize (const Standard_Size theSize)
|
|
{
|
|
myElements.reserve (theSize);
|
|
myBoxes.reserve (theSize);
|
|
}
|
|
|
|
public: //! @name Adding elements in BVH
|
|
|
|
//! Adds the element into BVH
|
|
virtual void Add (const DataType& theElement, const BVH_Box<NumType, Dimension>& theBox)
|
|
{
|
|
myElements.push_back (theElement);
|
|
myBoxes.push_back (theBox);
|
|
BVH_Object<NumType, Dimension>::myIsDirty = Standard_True;
|
|
}
|
|
|
|
public: //! @name BVH construction
|
|
|
|
//! BVH construction
|
|
void Build()
|
|
{
|
|
BVH_PrimitiveSet <NumType, Dimension>::Update();
|
|
}
|
|
|
|
public: //! @name Clearing the elements and boxes
|
|
|
|
//! Clears the vectors of elements and boxes
|
|
virtual void Clear()
|
|
{
|
|
myElements.clear();
|
|
myBoxes.clear();
|
|
BVH_Object<NumType, Dimension>::myIsDirty = Standard_True;
|
|
}
|
|
|
|
public: //! @name Necessary overrides for BVH construction
|
|
|
|
//! Make inherited method Box() visible to avoid CLang warning
|
|
using BVH_PrimitiveSet <NumType, Dimension>::Box;
|
|
|
|
//! Returns the bounding box with the given index.
|
|
virtual BVH_Box <NumType, Dimension> Box (const Standard_Integer theIndex) const Standard_OVERRIDE
|
|
{
|
|
return myBoxes[theIndex];
|
|
}
|
|
|
|
//! Returns centroid position along specified axis.
|
|
virtual Standard_Real Center (const Standard_Integer theIndex,
|
|
const Standard_Integer theAxis) const Standard_OVERRIDE
|
|
{
|
|
return Box (theIndex).Center (theAxis);
|
|
}
|
|
|
|
//! Returns the number of boxes.
|
|
virtual Standard_Integer Size() const Standard_OVERRIDE
|
|
{
|
|
return static_cast<Standard_Integer> (myBoxes.size());
|
|
}
|
|
|
|
//! Swaps indices of two specified boxes.
|
|
virtual void Swap (const Standard_Integer theIndex1,
|
|
const Standard_Integer theIndex2) Standard_OVERRIDE
|
|
{
|
|
std::swap (myElements[theIndex1], myElements[theIndex2]);
|
|
std::swap (myBoxes [theIndex1], myBoxes [theIndex2]);
|
|
}
|
|
|
|
//! Returns the Element with the index theIndex.
|
|
virtual DataType Element (const Standard_Integer theIndex) const
|
|
{
|
|
return myElements[theIndex];
|
|
}
|
|
|
|
protected: //! @name Fields
|
|
|
|
std::vector <DataType> myElements; //!< Elements
|
|
std::vector <BVH_Box <NumType, Dimension> > myBoxes; //!< Boxes for the elements
|
|
|
|
};
|
|
|
|
#endif // _BVH_BoxSet_Header
|