SIMOrthoProgram-Orth_LT1AB-.../simorthoprogram-orth_L_sar-.../OctreeNode.h

264 lines
7.8 KiB
C
Raw Permalink Normal View History

#pragma once
#include <iostream>
using namespace std;
//<2F><><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><CBB2><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>
template<class T>
struct OctreeNode
{
T data; //<2F>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
T xmin, xmax; //<2F>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EAA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
T ymin, ymax;
T zmin, zmax;
OctreeNode <T>* top_left_front, * top_left_back; //<2F>ýڵ<C3BD><DAB5>ĸ<EFBFBD><C4B8>ӽ<EFBFBD><D3BD><EFBFBD>
OctreeNode <T>* top_right_front, * top_right_back;
OctreeNode <T>* bottom_left_front, * bottom_left_back;
OctreeNode <T>* bottom_right_front, * bottom_right_back;
OctreeNode //<2F>ڵ<EFBFBD><DAB5><EFBFBD>
(T nodeValue = T(),
T xminValue = T(), T xmaxValue = T(),
T yminValue = T(), T ymaxValue = T(),
T zminValue = T(), T zmaxValue = T(),
OctreeNode<T>* top_left_front_Node = NULL,
OctreeNode<T>* top_left_back_Node = NULL,
OctreeNode<T>* top_right_front_Node = NULL,
OctreeNode<T>* top_right_back_Node = NULL,
OctreeNode<T>* bottom_left_front_Node = NULL,
OctreeNode<T>* bottom_left_back_Node = NULL,
OctreeNode<T>* bottom_right_front_Node = NULL,
OctreeNode<T>* bottom_right_back_Node = NULL)
:data(nodeValue),
xmin(xminValue), xmax(xmaxValue),
ymin(yminValue), ymax(ymaxValue),
zmin(zminValue), zmax(zmaxValue),
top_left_front(top_left_front_Node),
top_left_back(top_left_back_Node),
top_right_front(top_right_front_Node),
top_right_back(top_right_back_Node),
bottom_left_front(bottom_left_front_Node),
bottom_left_back(bottom_left_back_Node),
bottom_right_front(bottom_right_front_Node),
bottom_right_back(bottom_right_back_Node) {}
};
//<2F><><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><CBB2><EFBFBD>
template <class T>
void createOctree(OctreeNode<T>*& root, int maxdepth, double xmin, double xmax, double ymin, double ymax, double zmin, double zmax)
{
//cout<<"<22><><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>Ժ򡭡<D4BA>"<<endl;
maxdepth = maxdepth - 1; //ÿ<>ݹ<EFBFBD>һ<EFBFBD>ξͽ<CEBE><CDBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݹ<EFBFBD><DDB9><EFBFBD><EFBFBD><EFBFBD>-1
if (maxdepth >= 0)
{
root = new OctreeNode<T>();
//cout << "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ֵ:";
//root->data =9;//Ϊ<>ڵ㸳ֵ<E3B8B3><D6B5><EFBFBD><EFBFBD><EFBFBD>Դ洢<D4B4>ڵ<EFBFBD><DAB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><C9BC>ԡ<EFBFBD><D4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD>ʵ<EFBFBD>ְ˲<D6B0><CBB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3>򵥸<EFBFBD>ֵΪ9<CEAA><39>
cin >> root->data; //Ϊ<>ڵ㸳ֵ
root->xmin = xmin; //Ϊ<>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>긳ֵ
root->xmax = xmax;
root->ymin = ymin;
root->ymax = ymax;
root->zmin = zmin;
root->zmax = zmax;
double xm = (xmax - xmin) / 2;//<2F><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ά<EFBFBD><CEAC><EFBFBD>ϵİ<CFB5><C4B0>߳<EFBFBD>
double ym = (ymax - ymin) / 2;
double zm = (ymax - ymin) / 2;
//<2F>ݹ鴴<DDB9><E9B4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿһ<C3BF><D2BB><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC>Žڵ㣩<DAB5><E3A3A9>λ<EFBFBD>þ<EFBFBD><C3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
createOctree(root->top_left_front, maxdepth, xmin, xmax - xm, ymax - ym, ymax, zmax - zm, zmax);
createOctree(root->top_left_back, maxdepth, xmin, xmax - xm, ymin, ymax - ym, zmax - zm, zmax);
createOctree(root->top_right_front, maxdepth, xmax - xm, xmax, ymax - ym, ymax, zmax - zm, zmax);
createOctree(root->top_right_back, maxdepth, xmax - xm, xmax, ymin, ymax - ym, zmax - zm, zmax);
createOctree(root->bottom_left_front, maxdepth, xmin, xmax - xm, ymax - ym, ymax, zmin, zmax - zm);
createOctree(root->bottom_left_back, maxdepth, xmin, xmax - xm, ymin, ymax - ym, zmin, zmax - zm);
createOctree(root->bottom_right_front, maxdepth, xmax - xm, xmax, ymax - ym, ymax, zmin, zmax - zm);
createOctree(root->bottom_right_back, maxdepth, xmax - xm, xmax, ymin, ymax - ym, zmin, zmax - zm);
}
}
int i = 1;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><CBB2><EFBFBD>
template <class T>
void preOrder(OctreeNode<T>*& p)
{
if (p)
{
//cout << i << ".<2E><>ǰ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ֵΪ<D6B5><CEAA>" << p->data << "\n<><6E><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>";
//cout << "xmin: " << p->xmin << " xmax: " << p->xmax;
//cout << "ymin: " << p->ymin << " ymax: " << p->ymax;
//cout << "zmin: " << p->zmin << " zmax: " << p->zmax;
i += 1;
cout << endl;
preOrder(p->top_left_front);
preOrder(p->top_left_back);
preOrder(p->top_right_front);
preOrder(p->top_right_back);
preOrder(p->bottom_left_front);
preOrder(p->bottom_left_back);
preOrder(p->bottom_right_front);
preOrder(p->bottom_right_back);
cout << endl;
}
}
//<2F><><EFBFBD>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
template<class T>
int depth(OctreeNode<T>*& p)
{
if (p == NULL)
return -1;
int h = depth(p->top_left_front);
return h + 1;
}
template<class T>
int num(OctreeNode<T>*& p)
{
if (p == NULL)
return 0;
return 1 + num(p->top_left_front) + num(p->top_left_back) + num(p->top_right_back) + num(p->top_right_front) + num(p->bottom_left_back) + num(p->bottom_left_front) + num(p->bottom_right_back) + num(p->bottom_right_front);
}
//<2F><><EFBFBD>㵥λ<E3B5A5><CEBB><EFBFBD>ȣ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>׼<EFBFBD><D7BC>
int cal(int num)
{
int result = 1;
if (1 == num)
result = 1;
else
{
for (int i = 1; i < num; i++)
result = 2 * result;
}
return result;
}
template<class T>
int find(OctreeNode<T>*& p, double x, double y, double z)
{
//<2F><><EFBFBD>ҵ<EFBFBD>
int maxdepth = 0;
int times = 0;
static double xmin = 0, xmax = 0, ymin = 0, ymax = 0, zmin = 0, zmax = 0;
int tmaxdepth = 0;
double txm = 1, tym = 1, tzm = 1;
double xm = (p->xmax - p->xmin) / 2;
double ym = (p->ymax - p->ymin) / 2;
double zm = (p->ymax - p->ymin) / 2;
times++;
if (x > xmax || x<xmin || y>ymax || y<ymin || z>zmax || z < zmin)
{
//cout << "<22>õ㲻<C3B5>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>У<EFBFBD>" << endl;
return 0;
}
if (x <= p->xmin + txm && x >= p->xmax - txm && y <= p->ymin + tym && y >= p->ymax - tym && z <= p->zmin + tzm && z >= p->zmax - tzm)
{
//cout << endl << "<22>ҵ<EFBFBD><D2B5>õ㣡" << "<22>õ<EFBFBD>λ<EFBFBD><CEBB>" << endl;
//cout << "xmin: " << p->xmin << " xmax: " << p->xmax;
//cout << "ymin: " << p->ymin << " ymax: " << p->ymax;
//cout << "zmin: " << p->zmin << " zmax: " << p->zmax;
//cout << "<22>ڵ<EFBFBD><DAB5>ڣ<EFBFBD>" << endl;
//cout << "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" << times << "<22>εݹ飡" << endl;
return 1;
}
else if (x < (p->xmax - xm) && y < (p->ymax - ym) && z < (p->zmax - zm))
{
find(p->bottom_left_back, x, y, z);
}
else if (x < (p->xmax - xm) && y<(p->ymax - ym) && z>(p->zmax - zm))
{
find(p->top_left_back, x, y, z);
}
else if (x > (p->xmax - xm) && y < (p->ymax - ym) && z < (p->zmax - zm))
{
find(p->bottom_right_back, x, y, z);
}
else if (x > (p->xmax - xm) && y<(p->ymax - ym) && z>(p->zmax - zm))
{
find(p->top_right_back, x, y, z);
}
else if (x<(p->xmax - xm) && y>(p->ymax - ym) && z < (p->zmax - zm))
{
find(p->bottom_left_front, x, y, z);
}
else if (x<(p->xmax - xm) && y>(p->ymax - ym) && z > (p->zmax - zm))
{
find(p->top_left_front, x, y, z);
}
else if (x > (p->xmax - xm) && y > (p->ymax - ym) && z < (p->zmax - zm))
{
find(p->bottom_right_front, x, y, z);
}
else if (x > (p->xmax - xm) && y > (p->ymax - ym) && z > (p->zmax - zm))
{
find(p->top_right_front, x, y, z);
}
}
//main<69><6E><EFBFBD><EFBFBD>
/*
int main()
{
OctreeNode<double>* rootNode = NULL;
int choiced = 0;
cout << "ϵͳ<EFBFBD><EFBFBD>ʼǰ<EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD>" << endl;
cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>" << endl;
cin >> maxdepth;
cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>꣬˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>xmin,xmax,ymin,ymax,zmin,zmax" << endl;
cin >> xmin >> xmax >> ymin >> ymax >> zmin >> zmax;
if (maxdepth >= 0 || xmax > xmin || ymax > ymin || zmax > zmin || xmin > 0 || ymin > 0 || zmin > 0)
{
tmaxdepth = cal(maxdepth);
txm = (xmax - xmin) / tmaxdepth;
tym = (ymax - ymin) / tmaxdepth;
tzm = (zmax - zmin) / tmaxdepth;
createOctree(rootNode, maxdepth, xmin, xmax, ymin, ymax, zmin, zmax);
}
while (true)
{
system("cls");
cout << "<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n";
cout << "\t1.<2E><><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>\n";
cout << "\t2.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><CBB2><EFBFBD>\n";
cout << "\t3.<2E><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n";
cout << "\t4.<2E><><EFBFBD>ҽڵ<D2BD> \n";
cout << "\t0.<2E>˳<EFBFBD>\n";
cin >> choiced;
if (choiced == 0)
return 0;
if (choiced == 1)
{
system("cls");
cout << "<EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" << endl;
cout << num(rootNode);
}
if (choiced == 2)
{
system("cls");
cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/n";
i = 1;
preOrder(rootNode);
cout << endl;
system("pause");
}
if (choiced == 3)
{
system("cls");
int dep = depth(rootNode);
cout << "<EFBFBD>˰˲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ" << dep + 1 << endl;
system("pause");
}
if (choiced == 4)
{
system("cls");
cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>꣬˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>x,y,z\n";
double x, y, z;
cin >> x >> y >> z;
times = 0;
cout << endl << "<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>Ѱ<EFBFBD>õ㡭<EFBFBD><EFBFBD>" << endl;
find(rootNode, x, y, z);
system("pause");
}
else
{
system("cls");
cout << "\n\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n";
system("pause");
}
}
*/