|
cgma
|
#include <GridSearchTree.hpp>
Public Member Functions | |
| GridSearchTree (double tolerance) | |
| ~GridSearchTree () | |
| CubitPoint * | fix (CubitPoint *data) |
Private Attributes | |
| double | epsilon |
| gmap | nodemap |
| gmap::iterator | pos |
Definition at line 11 of file GridSearchTree.hpp.
| GridSearchTree::GridSearchTree | ( | double | tolerance | ) | [inline] |
Definition at line 19 of file GridSearchTree.hpp.
{
epsilon = tolerance;
}
| GridSearchTree::~GridSearchTree | ( | ) | [inline] |
Definition at line 23 of file GridSearchTree.hpp.
{}
| CubitPoint * GridSearchTree::fix | ( | CubitPoint * | data | ) |
Definition at line 8 of file GridSearchTree.cpp.
{
long i, j, k;
double x, y, z;
x=data->x();
y=data->y();
z=data->z();
// get the coordinates of the box containing the point
i=(long)(x/(2*epsilon));
j=(long)(y/(2*epsilon));
k=(long)(z/(2*epsilon));
if (x<0) i--;
if (y<0) j--;
if (z<0) k--;
int ofi;
int ofj;
int ofk;
int ii;
// calculate the i, j, k offset for the seven neighboring boxes to be searched
if (fabs(x-i*2*epsilon) < epsilon) ofi = -1; else ofi = 1;
if (fabs(y-j*2*epsilon) < epsilon) ofj = -1; else ofj = 1;
if (fabs(z-k*2*epsilon) < epsilon) ofk = -1; else ofk = 1;
// mindist holds the distance to the current closest point
double mindist=2*epsilon;
// curdist holds the distance to the current point
double curdist;
// closest is the current closest point
CubitPoint * closest = NULL;
// curpoint is the current point
CubitPoint * curpoint;
// construct grid cell ( box )
GridSearchTreeNode * curnode = new GridSearchTreeNode(i+ofi,j+ofj,k+ofk);
// attempt to find it in the tree
pos = nodemap.find(curnode);
if (pos!=nodemap.end())
{
// if cell is in the tree search its list for close points
DLIList<CubitPoint*> curlist = (*pos).first->get_list();
for (ii= curlist.size(); ii>0; ii--)
{
curpoint = curlist.get_and_step();
curdist = dist(data, curpoint);
if (curdist<mindist)
{
closest = curpoint;
mindist=curdist;
}
}
}
delete curnode;
// construct grid cell ( box )
curnode = new GridSearchTreeNode(i+ofi,j+ofj,k);
// attempt to find it in the tree
pos = nodemap.find(curnode);
if (pos!=nodemap.end())
{
// if cell is in the tree search its list for close points
DLIList<CubitPoint*> curlist = (*pos).first->get_list();
for (ii= curlist.size(); ii>0; ii--)
{
curpoint = curlist.get_and_step();
curdist = dist(data, curpoint);
if (curdist<mindist)
{
closest = curpoint;
mindist=curdist;
}
}
}
delete curnode;
curnode = new GridSearchTreeNode(i+ofi,j,k+ofk);
pos = nodemap.find(curnode);
if (pos!=nodemap.end())
{
DLIList<CubitPoint*> curlist = (*pos).first->get_list();
for (ii= curlist.size(); ii>0; ii--)
{
curpoint = curlist.get_and_step();
curdist = dist(data, curpoint);
if (curdist<mindist)
{
closest = curpoint;
mindist=curdist;
}
}
}
delete curnode;
curnode = new GridSearchTreeNode(i+ofi,j,k);
pos = nodemap.find(curnode);
if (pos!=nodemap.end())
{
DLIList<CubitPoint*> curlist = (*pos).first->get_list();
for (ii= curlist.size(); ii>0; ii--)
{
curpoint = curlist.get_and_step();
curdist = dist(data, curpoint);
if (curdist<mindist)
{
closest = curpoint;
mindist=curdist;
}
}
}
delete curnode;
curnode = new GridSearchTreeNode(i,j+ofj,k+ofk);
pos = nodemap.find(curnode);
if (pos!=nodemap.end())
{
DLIList<CubitPoint*> curlist = (*pos).first->get_list();
for (ii= curlist.size(); ii>0; ii--)
{
curpoint = curlist.get_and_step();
curdist = dist(data, curpoint);
if (curdist<mindist)
{
closest = curpoint;
mindist=curdist;
}
}
}
delete curnode;
curnode = new GridSearchTreeNode(i,j+ofj,k);
pos = nodemap.find(curnode);
if (pos!=nodemap.end())
{
DLIList<CubitPoint*> curlist = (*pos).first->get_list();
for (ii= curlist.size(); ii>0; ii--)
{
curpoint = curlist.get_and_step();
curdist = dist(data, curpoint);
if (curdist<mindist)
{
closest = curpoint;
mindist=curdist;
}
}
}
delete curnode;
curnode = new GridSearchTreeNode(i,j,k+ofk);
pos = nodemap.find(curnode);
if (pos!=nodemap.end())
{
DLIList<CubitPoint*> curlist = (*pos).first->get_list();
for (ii= curlist.size(); ii>0; ii--)
{
curpoint = curlist.get_and_step();
curdist = dist(data, curpoint);
if (curdist<mindist)
{
closest = curpoint;
mindist=curdist;
}
}
}
delete curnode;
curnode = new GridSearchTreeNode(i,j,k);
pos = nodemap.find(curnode);
if (pos!=nodemap.end())
{
DLIList<CubitPoint*> curlist = (*pos).first->get_list();
for (ii= curlist.size(); ii>0; ii--)
{
curpoint = curlist.get_and_step();
curdist = dist(data, curpoint);
if (curdist<mindist)
{
closest = curpoint;
mindist=curdist;
}
}
}
// if closest point is within epsilon distance return the closest point
if (mindist<=epsilon)
{
delete curnode;
return closest;
}
else
{
// add current point and cell to tree
if (pos==nodemap.end())
{
curnode->add(data);
nodemap.insert(gmap::value_type(curnode, 1));
}
else
{
(*pos).first->add(data);
delete curnode;
}
return data;
}
}
double GridSearchTree::epsilon [private] |
Definition at line 14 of file GridSearchTree.hpp.
gmap GridSearchTree::nodemap [private] |
Definition at line 15 of file GridSearchTree.hpp.
gmap::iterator GridSearchTree::pos [private] |
Definition at line 16 of file GridSearchTree.hpp.