6a3fc0fd97
- implementazione delle classi KdTree e Cell - problemi : bilanciamento albero e uso puntatori
73 lines
3.1 KiB
C++
73 lines
3.1 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2023
|
|
//----------------------------------------------------------------------------
|
|
// File : Kd-tree.h Data : 21.04.23 Versione :
|
|
// Contenuto : Implementazione della classe Cell di un kd-tree.
|
|
//
|
|
//
|
|
//
|
|
// Modifiche : 21.04.23 DB Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
//--------------------------- Include ----------------------------------------
|
|
#include "SurfBezier.h"
|
|
|
|
//----------------------------------------------------------------------------
|
|
class Cell
|
|
{
|
|
public :
|
|
~Cell( void) ;
|
|
Cell( void) ;
|
|
Cell( Point3d ptBL, Point3d ptTR) : m_ptPbl( ptBL), m_ptPtr(ptTR) {}
|
|
inline bool IsSame ( std::shared_ptr<Cell> cOtherCell) ;
|
|
void SetBottomLeft( Point3d ptBL) { m_ptPbl = ptBL ; }
|
|
void SetTopRight( Point3d ptTR) { m_ptPtr = ptTR ; }
|
|
void SetSplitDirVert( bool bVert) { m_bSplitVert = bVert ; }
|
|
void SetSplitValue ( double dSplitValue) { m_dSplit = dSplitValue ; }
|
|
void SetParent (std::shared_ptr<Cell> pCParent) { m_cParent = pCParent ; }
|
|
void Split( double dSpiltValue) ;
|
|
Point3d GetBottomLeft( void) { return m_ptPbl ; }
|
|
Point3d GetTopRight( void) { return m_ptPtr ; }
|
|
//bool IsLeaf( void) const ;
|
|
bool IsLeaf( void) ;
|
|
bool IsProcessed ( void) const { return m_bProcessed ; }
|
|
void Processed ( void) { m_bProcessed = true ; }
|
|
|
|
public :
|
|
std::shared_ptr<Cell> m_cTop ; // cella adiacente al lato top
|
|
std::shared_ptr<Cell> m_cBottom ; // cella adiacente al lato bottom
|
|
std::shared_ptr<Cell> m_cLeft ; // cella adiacente al lato left
|
|
std::shared_ptr<Cell> m_cRight ; // cella adiacente al lato right
|
|
std::shared_ptr<Cell> m_cParent ; // cella genitore
|
|
std::shared_ptr<Cell> m_cChild1 ; // prima cella figlio
|
|
std::shared_ptr<Cell> m_cChild2 ; // seconda cella figlio
|
|
|
|
private :
|
|
Point3d m_ptPbl ; // punto bottom left
|
|
Point3d m_ptPtr ; // punto top right
|
|
bool m_bProcessed ; // flag che indica se la cella è stata processata
|
|
bool m_bSplitVert ; // flag che indica in quale direzione è stata divisa la cella
|
|
double m_dSplit ; // lunghezza normalizzata a cui è stata splittata la cella
|
|
} ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
class KdTree
|
|
{
|
|
public :
|
|
~KdTree( void) ;
|
|
KdTree( void) ;
|
|
KdTree ( const SurfBezier* pSrfBz) ;
|
|
void SetSurf( const SurfBezier* pSrfBz) ;
|
|
bool BuildTree( int nStepU, int nStepV) ;
|
|
bool GetPolygons( POLYLINEVECTOR& vPolygons) ;
|
|
|
|
private :
|
|
double m_dLinTol ; // errore dell'approssimazione
|
|
std::shared_ptr<Cell> m_cRoot ; // cella base
|
|
const SurfBezier* m_pSrfBz ; // root
|
|
POLYLINEVECTOR m_vPolygons ; // vettore dei poligoni del kd-tree
|
|
} ; |