Conformed with the base interface
This commit is contained in:
parent
5b4f40661d
commit
51efef83bf
|
@ -21,8 +21,8 @@
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef OCTREE_H
|
#ifndef VCG_SPACE_INDEX_OCTREE_H
|
||||||
#define OCTREE_H
|
#define VCG_SPACE_INDEX_OCTREE_H
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@ -102,7 +102,7 @@ namespace vcg
|
||||||
|
|
||||||
|
|
||||||
template < class OBJECT_TYPE, class SCALAR_TYPE>
|
template < class OBJECT_TYPE, class SCALAR_TYPE>
|
||||||
class Octree : public OctreeTemplate< Voxel, SCALAR_TYPE >, public vcg::SpatialIndex< OBJECT_TYPE, SCALAR_TYPE >
|
class Octree : public vcg::OctreeTemplate< Voxel, SCALAR_TYPE >, public vcg::SpatialIndex< OBJECT_TYPE, SCALAR_TYPE >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef SCALAR_TYPE ScalarType;
|
typedef SCALAR_TYPE ScalarType;
|
||||||
|
@ -148,16 +148,16 @@ namespace vcg
|
||||||
|
|
||||||
ObjectPlaceholder() { z_order = object_index = -1, leaf_pointer = NULL;}
|
ObjectPlaceholder() { z_order = object_index = -1, leaf_pointer = NULL;}
|
||||||
|
|
||||||
ObjectPlaceholder(unsigned long long z_order, void* leaf_pointer, unsigned int object_index)
|
ObjectPlaceholder(ZOrderType z_order, void* leaf_pointer, unsigned int object_index)
|
||||||
{
|
{
|
||||||
this->z_order = z_order;
|
this->z_order = z_order;
|
||||||
this->leaf_pointer = leaf_pointer;
|
this->leaf_pointer = leaf_pointer;
|
||||||
this->object_index = object_index;
|
this->object_index = object_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long long z_order;
|
ZOrderType z_order;
|
||||||
LeafPointer leaf_pointer;
|
LeafPointer leaf_pointer;
|
||||||
unsigned int object_index;
|
unsigned int object_index;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -823,4 +823,4 @@ public:
|
||||||
|
|
||||||
} //end of namespace vcg
|
} //end of namespace vcg
|
||||||
|
|
||||||
#endif //OCTREE_H
|
#endif //VCG_SPACE_INDEX_OCTREE_H
|
||||||
|
|
|
@ -22,8 +22,8 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#ifndef OCTREETEMPLATE_H
|
#ifndef VCG_SPACE_INDEX_OCTREETEMPLATE_H
|
||||||
#define OCTREETEMPLATE_H
|
#define VCG_SPACE_INDEX_OCTREETEMPLATE_H
|
||||||
|
|
||||||
#include <vcg/space/point3.h>
|
#include <vcg/space/point3.h>
|
||||||
#include <vcg/space/box3.h>
|
#include <vcg/space/box3.h>
|
||||||
|
@ -56,6 +56,7 @@ protected:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Octree Type Definitions
|
// Octree Type Definitions
|
||||||
|
typedef unsigned long long ZOrderType;
|
||||||
typedef SCALAR_TYPE ScalarType;
|
typedef SCALAR_TYPE ScalarType;
|
||||||
typedef typename VOXEL_TYPE VoxelType;
|
typedef typename VOXEL_TYPE VoxelType;
|
||||||
typedef typename VOXEL_TYPE *VoxelPointer;
|
typedef typename VOXEL_TYPE *VoxelPointer;
|
||||||
|
@ -201,21 +202,21 @@ public:
|
||||||
// Return the center of the n-th node
|
// Return the center of the n-th node
|
||||||
inline CenterType CenterInOctreeCoordinates(const NodePointer n) const { return n->center;}
|
inline CenterType CenterInOctreeCoordinates(const NodePointer n) const { return n->center;}
|
||||||
|
|
||||||
// Return the center of the n-th node expressed in world-coordinate
|
/*!
|
||||||
inline CoordinateType CenterInWorldCoordinates(const NodePointer n) const
|
* Return the center of the n-th node expressed in world-coordinate
|
||||||
|
* \param NodePointer the pointer to the node whose center in world coordinate has to be computed
|
||||||
|
*/
|
||||||
|
inline void CenterInWorldCoordinates(const NodePointer n, CoordinateType &wc_Center) const
|
||||||
{
|
{
|
||||||
assert(0<=n && n<NodeCount());
|
assert(0<=n && n<NodeCount());
|
||||||
|
|
||||||
int level = n->level;
|
int shift = maximumDepth - n->level + 1;
|
||||||
int shift = maxDepth-level+1;
|
|
||||||
CoordinateType wcCenter;
|
|
||||||
CoordinateType ocCenter = CenterInOctreeCoordinates(n);
|
CoordinateType ocCenter = CenterInOctreeCoordinates(n);
|
||||||
CoordinateType nodeSize = boundingBox.Dim()/float(1<<level);
|
CoordinateType nodeSize = boundingBox.Dim()/float(1<<level);
|
||||||
wcCenter.X() = boundingBox.min.X() + (nodeSize.X()*(0.5f+(ocCenter.X()>>shift)));
|
wcCenter.X() = boundingBox.min.X() + (nodeSize.X()*(0.5f+(ocCenter.X()>>shift)));
|
||||||
wcCenter.Y() = boundingBox.min.Y() + (nodeSize.Y()*(0.5f+(ocCenter.Y()>>shift)));
|
wcCenter.Y() = boundingBox.min.Y() + (nodeSize.Y()*(0.5f+(ocCenter.Y()>>shift)));
|
||||||
wcCenter.Z() = boundingBox.min.Z() + (nodeSize.Z()*(0.5f+(ocCenter.Z()>>shift)));
|
wcCenter.Z() = boundingBox.min.Z() + (nodeSize.Z()*(0.5f+(ocCenter.Z()>>shift)));
|
||||||
return wcCenter
|
};
|
||||||
}
|
|
||||||
|
|
||||||
// Given a node (even not leaf) it returns the center of the box it represent.
|
// Given a node (even not leaf) it returns the center of the box it represent.
|
||||||
// the center is expressed not in world-coordinates.
|
// the center is expressed not in world-coordinates.
|
||||||
|
@ -282,8 +283,6 @@ public:
|
||||||
// Return the bounding-box of the n-th node expressed in world-coordinate
|
// Return the bounding-box of the n-th node expressed in world-coordinate
|
||||||
BoundingBoxType BoundingBoxInWorldCoordinates(const NodePointer n)
|
BoundingBoxType BoundingBoxInWorldCoordinates(const NodePointer n)
|
||||||
{
|
{
|
||||||
assert(0<=n && n<Size());
|
|
||||||
|
|
||||||
char level = Level(n);
|
char level = Level(n);
|
||||||
int shift = maximumDepth-level+1;
|
int shift = maximumDepth-level+1;
|
||||||
CoordinateType nodeDim = boundingBox.Dim()/float(1<<level);
|
CoordinateType nodeDim = boundingBox.Dim()/float(1<<level);
|
||||||
|
@ -296,6 +295,22 @@ public:
|
||||||
return nodeBB;
|
return nodeBB;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Return the bounding-box of a node expressed in world-coordinate
|
||||||
|
* \param NodePointer the node whose bounding-box has to be computed
|
||||||
|
* \param wc_BB the bounding-box of the node in world coordinta
|
||||||
|
*/
|
||||||
|
inline void BoundingBoxInWorldCoordinates(const NodePointer n, BoundingBoxType &wc_bb) const
|
||||||
|
{
|
||||||
|
char level = Level(n);
|
||||||
|
int shift = maximumDepth - level + 1;
|
||||||
|
CoordinateType node_dimension = boundingBox.Dim()/ScalarType(1<<level);
|
||||||
|
wc_bb.min.X() = boundingBox.min.X()+(node_dimension.X()*(n->center.X()>>shift));
|
||||||
|
wc_bb.min.Y() = boundingBox.min.Y()+(node_dimension.Y()*(n->center.Y()>>shift));
|
||||||
|
wc_bb.min.Z() = boundingBox.min.Z()+(node_dimension.Z()*(n->center.Z()>>shift));
|
||||||
|
wc_bb.max = wc_bb.min+node_dimension;
|
||||||
|
};
|
||||||
|
|
||||||
// Return one of the 8 subb box of a given box.
|
// Return one of the 8 subb box of a given box.
|
||||||
BoundingBoxType SubBox(BoundingBoxType &lbb, int i)
|
BoundingBoxType SubBox(BoundingBoxType &lbb, int i)
|
||||||
{
|
{
|
||||||
|
@ -408,6 +423,10 @@ public:
|
||||||
return curNode;
|
return curNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Given a query point, compute the z_order of the leaf where this point would be contained.
|
||||||
|
* This leaf not necessarily must be exist!
|
||||||
|
*/
|
||||||
// Convert the point p coordinates to the integer based representation
|
// Convert the point p coordinates to the integer based representation
|
||||||
// in the range 0..size, where size is 2^maxdepth
|
// in the range 0..size, where size is 2^maxdepth
|
||||||
CenterType Interize(const CoordinateType &pf) const
|
CenterType Interize(const CoordinateType &pf) const
|
||||||
|
@ -445,13 +464,13 @@ public:
|
||||||
// Compute the z-ordering integer value for a given node;
|
// Compute the z-ordering integer value for a given node;
|
||||||
// this value can be used to compute a complete ordering of the nodes of a given level of the octree.
|
// this value can be used to compute a complete ordering of the nodes of a given level of the octree.
|
||||||
// It assumes that the octree has a max depth of 10.
|
// It assumes that the octree has a max depth of 10.
|
||||||
unsigned long long ZOrder(NodePointer n)
|
ZOrderType ZOrder(NodePointer n) const { return ZOrder(GetPath(n), Level(n)); }
|
||||||
{
|
ZOrderType ComputeZOrder(const CoordinateType &query) const { return ZOrder(CenterType::Construct(Interize(query)), maximumDepth); };
|
||||||
unsigned long long finalPosition = 0;
|
|
||||||
unsigned long long currentPosition;
|
|
||||||
char level = Level(n);
|
|
||||||
|
|
||||||
CenterType path = GetPath(n);
|
inline ZOrderType ZOrder(const CenterType &path, const char level) const
|
||||||
|
{
|
||||||
|
ZOrderType finalPosition = 0;
|
||||||
|
ZOrderType currentPosition;
|
||||||
|
|
||||||
for(int i=0; i<level; ++i)
|
for(int i=0; i<level; ++i)
|
||||||
{
|
{
|
||||||
|
@ -464,7 +483,7 @@ public:
|
||||||
finalPosition |= currentPosition;
|
finalPosition |= currentPosition;
|
||||||
}
|
}
|
||||||
return finalPosition;
|
return finalPosition;
|
||||||
}
|
};
|
||||||
|
|
||||||
// Funzione principale di accesso secondo un path;
|
// Funzione principale di accesso secondo un path;
|
||||||
// restituisce l'indice del voxel di profondita' massima
|
// restituisce l'indice del voxel di profondita' massima
|
||||||
|
@ -528,7 +547,7 @@ public:
|
||||||
// I nodi mancanti dalla radice fino a profondità maxDepth vengono aggiunti.
|
// I nodi mancanti dalla radice fino a profondità maxDepth vengono aggiunti.
|
||||||
// In posizione i ci sarà il nodo di livello i.
|
// In posizione i ci sarà il nodo di livello i.
|
||||||
// Restituisce lo z-order del punto p
|
// Restituisce lo z-order del punto p
|
||||||
unsigned long long BuildRoute(const CoordinateType &p, NodePointer *&route)
|
ZOrderType BuildRoute(const CoordinateType &p, NodePointer *&route)
|
||||||
{
|
{
|
||||||
assert( boundingBox.min.X()<=p.X() && p.X()<=boundingBox.max.X() );
|
assert( boundingBox.min.X()<=p.X() && p.X()<=boundingBox.max.X() );
|
||||||
assert( boundingBox.min.Y()<=p.Y() && p.Y()<=boundingBox.max.Y() );
|
assert( boundingBox.min.Y()<=p.Y() && p.Y()<=boundingBox.max.Y() );
|
||||||
|
@ -536,11 +555,9 @@ public:
|
||||||
|
|
||||||
route[0] = Root();
|
route[0] = Root();
|
||||||
NodePointer curNode = Root();
|
NodePointer curNode = Root();
|
||||||
int finalLevel = 0;
|
|
||||||
int shift = maximumDepth-1;
|
int shift = maximumDepth-1;
|
||||||
|
CenterType path = CenterType::Construct(Interize(p));
|
||||||
CenterType path = CenterType::Construct(Interize(p));
|
while(shift >= 0)
|
||||||
while(shift >= finalLevel)
|
|
||||||
{
|
{
|
||||||
int son = 0;
|
int son = 0;
|
||||||
if((path[0]>>shift)%2) son +=1;
|
if((path[0]>>shift)%2) son +=1;
|
||||||
|
@ -701,4 +718,4 @@ template <typename VOXEL_TYPE, class SCALAR_TYPE>
|
||||||
const SCALAR_TYPE OctreeTemplate<VOXEL_TYPE, SCALAR_TYPE>::EXPANSION_FACTOR = SCALAR_TYPE(0.035);
|
const SCALAR_TYPE OctreeTemplate<VOXEL_TYPE, SCALAR_TYPE>::EXPANSION_FACTOR = SCALAR_TYPE(0.035);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //OCTREETEMPLATE_H
|
#endif //VCG_SPACE_INDEX_OCTREETEMPLATE_H
|
||||||
|
|
Loading…
Reference in New Issue