1 #ifndef GfxTL__SLIDINGMIDPOINTSPLITTINGKDTREESTRATEGY_HEADER__
2 #define GfxTL__SLIDINGMIDPOINTSPLITTINGKDTREESTRATEGY_HEADER__
8 template <
class InheritedStrategyT>
11 typedef typename InheritedStrategyT::value_type
value_type;
13 struct CellData :
public InheritedStrategyT::CellData
17 template <
class BaseT>
28 template <
class BuildInformationT>
33 Sub(bi.CellBBox()[1], bi.CellBBox()[0], &cellDiff);
35 Sub(bi.BBox()[1], bi.BBox()[0], &diff);
36 unsigned int axis = 0;
39 for (
unsigned int j = 1; j < BaseType::m_dim; ++j)
41 if ((cellDiff[j] > length && spread < 2 * diff[j]) ||
42 (cellDiff[j] == length && diff[j] > spread) || diff[j] > 2 * spread)
49 cell->SplitAxis() = axis;
50 cell->SplitValue() = (bi.CellBBox()[0][axis] + bi.CellBBox()[1][axis]) / 2;
51 if (cell->SplitValue() < bi.BBox()[0][axis] ||
52 cell->SplitValue() > bi.BBox()[1][axis])
54 cell->SplitValue() = (bi.BBox()[1][axis] + bi.BBox()[0][axis]) / 2;
60 template <
class BuildInformationT>
65 Sub(bi.CellBBox()[1], bi.CellBBox()[0], &cellDiff);
67 Sub(bi.BBox()[1], bi.BBox()[0], &diff);
68 cell->SplitAxis() = axis;
69 cell->SplitValue() = (bi.CellBBox()[0][axis] + bi.CellBBox()[1][axis]) / 2;
70 if (cell->SplitValue() < bi.BBox()[0][axis])
72 cell->SplitValue() = bi.BBox()[0][axis];
74 else if (cell->SplitValue() > bi.BBox()[1][axis])
76 cell->SplitValue() = bi.BBox()[1][axis];
82 template <
class BuildInformationT>
86 unsigned int axis = (cell->SplitAxis() + 1) % BaseType::m_dim;
87 cell->SplitAxis() = axis;
88 cell->SplitValue() = (bi.CellBBox()[1][axis] + bi.CellBBox()[0][axis]) / 2;
89 if (cell->SplitValue() < bi.BBox()[0][axis])
91 cell->SplitValue() = bi.BBox()[0][axis];
93 else if (cell->SplitValue() > bi.BBox()[1][axis])
95 cell->SplitValue() = bi.BBox()[1][axis];