MDStressLab++
Loading...
Searching...
No Matches
SpatialHash.h
Go to the documentation of this file.
1/*
2 * SpatialHash.h
3 *
4 * Created on: Nov 27, 2019
5 * Author: Nikhil
6 */
7
8#ifndef SRC_SPATIALHASH_H_
9#define SRC_SPATIALHASH_H_
10
11#include <vector>
12#include <iostream>
13#include <map>
14#include <vector>
15#include "range.h"
16#include "typedef.h"
17
24class Triplet: public Vector3i
25{
26public:
27 Triplet()=default;
28 Triplet(int i,int j,int k): Vector3i(i,j,k) {}
29 Triplet(const Vector3i& base) : Vector3i(base){}
30
31 // Define < operator to use std::map<Triplet,std::vector<int>>
32 bool operator <(const Triplet& rhs) const
33 {
34 if (this->operator()(0) < rhs(0)) return true;
35 if (rhs(0) < this->operator()(0)) return false;
36 if (this->operator()(1) < rhs(1)) return true;
37 if (rhs(1) < this->operator()(1)) return false;
38 if (this->operator()(2) < rhs(2)) return true;
39 return false;
40 }
41
42 std::vector<Triplet> neighborList()
43 {
44 std::vector<Triplet> tripletList;
45 for (auto i : range<int>(-1,2))
46 for (auto j : range<int>(-1,2))
47 for (auto k : range<int>(-1,2))
48 {
49 Triplet s= static_cast<Vector3i>(*this + Triplet(i,j,k));
50 tripletList.push_back(s);
51 }
52 return tripletList;
53 }
54
55 virtual ~Triplet(){}
56};
57
58
66template<bool flag, typename T, typename U>
67struct Select
68{
72 typedef T Result;
73};
74
75template<typename T, typename U>
76struct Select<false, T, U> { typedef U Result; };
77
85template<bool isConst>
87public:
90 typedef typename Select<isConst, const std::vector<Vector3d>, std::vector<Vector3d>>::Result C;
91
103 std::vector<Eigen::Map<B>> coordinates;
107 std::map<Triplet,std::vector<int>> hashTable;
108
113 {
114 int size= coordinates.rows();
115 for(int i_point=0; i_point<size; i_point++)
116 {
117 Eigen::Map<B> vector(&coordinates(i_point,0),3);
118 this->coordinates.push_back(vector);
119 hashTable[hashFunction(i_point)].push_back(i_point);
120 }
121 }
125 {
126 int size= coordinates.size();
127 for(int i_point=0; i_point<size; i_point++)
128 {
129 Eigen::Map<B> vector(&coordinates[i_point](0),3);
130 this->coordinates.push_back(vector);
131 hashTable[hashFunction(i_point)].push_back(i_point);
132 }
133
134 }
135
139 Triplet hashFunction(const int& i) const
140 {
141 assert(!(i<0));
142 Triplet triple;
143 Vector3i& base= triple;
144 Vector3d coordinate= coordinates[i];
145 coordinate= coordinate-origin;
146 coordinate= (coordinate.array()/step.array()).floor().matrix();
147 base= coordinate.template cast<int>();
148 return triple;
149 }
150
151 virtual ~SpatialHash(){}
152
153};
155
160class BoxPoints : public SpatialHash<false>
161{
162public:
168 std::vector<Vector3d>& coordinates) : SpatialHash<false>(origin,step,coordinates) {}
169
170 virtual ~BoxPoints(){}
171
176 void fold(const Vector3i& pbc)
177 {
178 int size= coordinates.size();
179 for(auto i_point : range<int>(0,size))
180 {
181 if (hashFunction(i_point) != Triplet(0,0,0))
182 {
183 std::cout << "Folding point " << i_point << ": "
184 << coordinates[i_point] << " ---> ";
185 Vector3d shift;
186 shift= ((hashFunction(i_point).template cast<double>()).array()*step.array()).matrix();
187 shift= (shift.array()* pbc.template cast<double>().array()).matrix();
188 coordinates[i_point]= coordinates[i_point] - shift;
189 std::cout << coordinates[i_point] << std::endl;
190 }
191 }
192 }
193};
194
195#endif /* SRC_SPATIALHASH_H_ */
SpatialHash< true > ConstSpatialHash
void fold(const Vector3i &pbc)
virtual ~BoxPoints()
BoxPoints(Vector3d origin, Vector3d step, MatrixXd &coordinates)
BoxPoints(Vector3d origin, Vector3d step, std::vector< Vector3d > &coordinates)
Select< isConst, constVector3d, Vector3d >::Result B
Definition SpatialHash.h:89
SpatialHash(Vector3d origin, Vector3d step, C &coordinates)
Vector3d step
Definition SpatialHash.h:99
Select< isConst, conststd::vector< Vector3d >, std::vector< Vector3d > >::Result C
Definition SpatialHash.h:90
Vector3d origin
Definition SpatialHash.h:95
std::vector< Eigen::Map< B > > coordinates
Triplet hashFunction(const int &i) const
SpatialHash(Vector3d origin, Vector3d step, A &coordinates)
Select< isConst, constMatrixXd, MatrixXd >::Result A
Definition SpatialHash.h:88
virtual ~SpatialHash()
std::map< Triplet, std::vector< int > > hashTable
Triplet(int i, int j, int k)
Definition SpatialHash.h:28
bool operator<(const Triplet &rhs) const
Definition SpatialHash.h:32
Triplet()=default
Triplet(const Vector3i &base)
Definition SpatialHash.h:29
virtual ~Triplet()
Definition SpatialHash.h:55
std::vector< Triplet > neighborList()
Definition SpatialHash.h:42
Definition range.h:11
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > MatrixXd
Definition typedef.h:54
Eigen::Matrix< double, 1, DIM, Eigen::RowMajor > Vector3d
Definition typedef.h:60
Eigen::Matrix< int, 1, DIM, Eigen::RowMajor > Vector3i
Definition typedef.h:61