-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathKdTree.cpp
97 lines (77 loc) · 1.74 KB
/
KdTree.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "stdafx.h"
#include "3Dmath.h"
#include ".\kdtree.h"
CKdTree::CKdTree(unsigned int nvIndices, int ECoefNum)
{
pBox = new float[6];
memset(pBox, 0, sizeof(float) * 6);
nVIndices = nvIndices;
pVIndices = new unsigned int[nVIndices];
memset(pVIndices, 0, sizeof(unsigned int) * nVIndices);
pECoefs = new float[ECoefNum];
memset(pECoefs, 0, sizeof(float) * ECoefNum);
pECoefIdx = new short int[ECoefNum];
memset(pECoefIdx, 0, sizeof(short int) * ECoefNum);
m_EcoefNum = ECoefNum;
Av = 0;
Pv = Vec3(0,0,0);
depth = 0;
pL = pR = pP = NULL;
}
CKdTree::~CKdTree(void)
{
delete pL; //this will call ~pL() recursively, no need to call Destroy()
delete pR;
pL = pR = pP = NULL;
delete[] pBox;
pBox = NULL;
if(pECoefs)delete[] pECoefs;
pECoefs = NULL;
delete[] pVIndices;
pVIndices = NULL;
}
void CKdTree::Destroy()
{
delete[] pBox;
pBox = NULL;
if(pECoefs)delete[] pECoefs;
pECoefs = NULL;
delete[] pVIndices;
pVIndices = NULL;
if(!pL) //assert !pR, now is leaf.
{
delete[] pP;
pP = NULL;
return;
}
pL->Destroy();
pR->Destroy();
pL = pR = pP = NULL;
}
//void CKdTree::DumpData(CKdTree* pNode, FILE* fKd)
//{
// size_t n = fwrite(pNode->pECoefs, sizeof(float), nECoefs, fKd);
// assert(n == nECoefs);
//
// if(pNode->pL == NULL)
// return;
// DumpData(pNode->pL, fKd);
// DumpData(pNode->pR, fKd);
//}
void CKdTree::PrintInfo()
{
float EvSum = 0;
for(int i = 0; i < m_EcoefNum; ++i)
EvSum += pECoefs[i];
printf("\nPv=(%f,%f,%f), EvSum=%f, Av=%f\n", Pv.x, Pv.y, Pv.z, EvSum, Av);
for(int i = 0; i < depth; ++i)
printf("- ");
for(unsigned int i = 0; i < nVIndices; ++i)
printf("%d ",pVIndices[i]);
if(pL == NULL)
return;
printf("\nL:");
pL->PrintInfo();
printf("\nR:");
pR->PrintInfo();
}