template<class MetricType>
class BVH_BaseTraverse< MetricType >
The classes implement the traverse of the BVH tree.
There are two traverse methods implemented:
- Traverse of the single tree
- Parallel traverse of two trees
To perform Selection of the elements from BVH_Tree using the traverse methods implemented here it is required to define Acceptance/Rejection rules in the following methods:
- RejectNode - Node rejection by its bounding box. It is applied to both inner and outer nodes of the BVH tree. Optionally, the method should compute the metric for the node which will allow performing traverse faster by descending by the best branches.
- Accept - Element acceptance. It takes the index of the element of BVH tree. The access to the element itself should be performed through the set on which BVH is built. The Accept method implements the leaf node operation and usually defines the logic of the whole operation.
- IsMetricBetter - Compares the metrics of the nodes and returns true if the left metric is better than the right one.
- RejectMetric - Node rejection by the metric. It should compare the metric of the node with the global one and return true if the global metric is better than the given one.
- Stop - implements conditions to stop the tree descend if the necessary elements are already found.
The selector of a single tree has an extra method which allows accepting the whole branches without any further checks (e.g. full inclusion test):
- AcceptMetric - basing on the metric of the node decides if the node may be accepted without any further checks.
Two ways of selection are possible:
- Set the BVH set containing the tree and use the method Select() which allows using common interface for setting the BVH Set for accessing the BVH tree and elements in the Accept method.
- Keep the BVHSetType void, do not set the BVH set and use the method Select (const BVH_Tree<>&) which allows performing selection on the arbitrary BVH tree.
Here is the example of usage of the traverse to find the point-triangulation minimal distance.
struct Triangle
{
Triangle() {}
: Node1 (theNode1), Node2 (theNode2), Node3 (theNode3)
{}
};
class BVH_PointTriangulationSqDist :
public BVH_Distance<Standard_Real, 3, BVH_Vec3d, BVH_BoxSet<Standard_Real, 3, Triangle>>
{
public:
{
}
{
const Triangle& aTri =
myBVHSet->Element (theIndex);
aTri.Node1, aTri.Node2, aTri.Node3);
if (aDist <
myDistance)
{
}
}
};
opencascade::handle<BVH_BoxSet<Standard_Real, 3, Triangle>> aTriangulationSet = ...;
BVH_PointTriangulationSqDist aDistTool;
aDistTool.SetObject (aPoint);
aDistTool.SetBVHSet (aTriangulationSet.get());
aDistTool.ComputeDistance();
if (aDistTool.IsDone())
{
}
BVH::VectorType< Standard_Real, 3 >::Type BVH_Vec3d
3D vector of double precision reals.
Definition BVH_Types.hxx:158
#define Standard_OVERRIDE
Should be used in declarations of virtual methods overridden in the derived classes,...
Definition Standard_Macro.hxx:41
bool Standard_Boolean
Definition Standard_TypeDef.hxx:64
#define Standard_False
Definition Standard_TypeDef.hxx:56
int Standard_Integer
Definition Standard_TypeDef.hxx:61
#define Standard_True
Definition Standard_TypeDef.hxx:57
double Standard_Real
Definition Standard_TypeDef.hxx:63
virtual Standard_Boolean RejectMetric(const NumType &theMetric) const override
Rejects the branch by the metric.
Definition BVH_Distance.hxx:71
NumType myDistance
Distance.
Definition BVH_Distance.hxx:83
ObjectType myObject
Object to compute the distance to.
Definition BVH_Distance.hxx:85
virtual Standard_Boolean RejectNode(const BVH_VecNt &theCornerMin, const BVH_VecNt &theCornerMax, NumType &theMetric) const=0
virtual Standard_Boolean Accept(const Standard_Integer theIndex, const NumType &theMetric)=0
BVHSetType * myBVHSet
Definition BVH_Traverse.hxx:242
Abstract class implementing the base Traverse interface required for selection of the elements from BVH tree.
- Template Parameters
-
MetricType | Type of metric to perform more optimal tree descend |