00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "G4KDTreeResult.hh"
00037 #include "G4KDNode.hh"
00038 #include "G4KDTree.hh"
00039
00040 using namespace std;
00041
00042 struct ResNode
00043 {
00044 public:
00045 ResNode():fNode(0),fDistanceSqr(0){;}
00046 ResNode(double distsqr, G4KDNode* node):fNode(node),fDistanceSqr(distsqr){;}
00047 ResNode(const ResNode& right)
00048 {
00049 fNode = right.fNode;
00050 fDistanceSqr= right.fDistanceSqr;
00051 }
00052 ~ResNode(){;}
00053
00054 bool operator<(const ResNode& right) const
00055 {
00056 return (fDistanceSqr < right.fDistanceSqr);
00057 }
00058
00059 G4KDNode* GetNode() { return fNode;}
00060 double GetDistanceSqr() { return fDistanceSqr;}
00061
00062 protected:
00063 G4KDNode* fNode;
00064 double fDistanceSqr;
00065
00066 private:
00067 ResNode& operator=(const ResNode& rhs)
00068 {
00069 if(this == &rhs) return *this;
00070 return *this;
00071 }
00072 };
00073
00074
00075 bool CompareResNode(const ResNode& left, const ResNode& right)
00076 {
00077 return left < right;
00078 }
00079
00080 G4KDTreeResult::G4KDTreeResult(G4KDTree* tree) : std::list<ResNode>()
00081 {
00082 fTree = tree;
00083 }
00084
00085 G4KDTreeResult::~G4KDTreeResult()
00086 {
00087 std::list<ResNode>::erase(begin(),end());
00088 }
00089
00090 void G4KDTreeResult::Insert(double pos, G4KDNode* node)
00091 {
00092 std::list<ResNode>::push_back(ResNode(pos,node));
00093 }
00094
00095 void G4KDTreeResult::Clear()
00096 {
00097 std::list<ResNode>::erase(begin(),end());
00098 fIterator = std::list<ResNode>::begin();
00099 }
00100
00101 void G4KDTreeResult::Sort()
00102 {
00103 std::list<ResNode>::sort(CompareResNode);
00104 }
00105
00106 size_t G4KDTreeResult::GetSize()
00107 {
00108 return std::list<ResNode>::size();
00109 }
00110
00111 size_t G4KDTreeResult::size()
00112 {
00113 return std::list<ResNode>::size();
00114 }
00115
00116 void G4KDTreeResult::Rewind()
00117 {
00118 fIterator = begin();
00119 }
00120
00121 bool G4KDTreeResult::End()
00122 {
00123 return (fIterator == end());
00124 }
00125
00126 void G4KDTreeResult::Next()
00127 {
00128 fIterator++;
00129 }
00130
00131 void* G4KDTreeResult::GetItem(double*& pos)
00132 {
00133 if(!pos) pos = new double[fTree->GetDim()];
00134 memcpy(pos, (*fIterator).GetNode()->GetPosition(), fTree->GetDim() * sizeof *pos);
00135 return (*fIterator).GetNode()->GetData();
00136 }
00137
00138 void* G4KDTreeResult::GetItem(double& x, double& y, double& z)
00139 {
00140 x = (*fIterator).GetNode()->GetPosition()[0];
00141 y = (*fIterator).GetNode()->GetPosition()[1];
00142 z = (*fIterator).GetNode()->GetPosition()[2];
00143
00144 return (*fIterator).GetNode()->GetData();
00145 }
00146
00147 void* G4KDTreeResult::GetItemNDistanceSQ(double& dist_sq)
00148 {
00149 dist_sq = (*fIterator).GetDistanceSqr();
00150 return (*fIterator).GetNode()->GetData();
00151 }
00152
00153 void* G4KDTreeResult::GetItemNDistanceSQ(double*& pos, double& dist_sq)
00154 {
00155 dist_sq = (*fIterator).GetDistanceSqr();
00156 return GetItem(pos);
00157 }
00158
00159 void* G4KDTreeResult::GetItemData()
00160 {
00161 return (*fIterator).GetNode()->GetData();
00162 }
00163
00164 double G4KDTreeResult::GetDistanceSqr()
00165 {
00166 return (*fIterator).GetDistanceSqr();
00167 }