8#include <unordered_map>
21template <
typename O>
class Grid {
24 std::unordered_map<Vec, size_t>
um;
41 std::array<std::vector<std::vector<O>>, 8> res;
48 std::array<std::vector<std::vector<O>>, 8> res;
51 for (
auto &color : res) {
52 if (color.size() > 1) {
53 for (
auto it = std::next(color.begin()); it != color.end();) {
54 if ((*std::prev(it)).
size() <
57 auto pv = std::prev(it);
59 a.insert(a.end(), b.begin(), b.end());
72 return (
abs((
int)v.
x()) % 2) + (
abs((
int)v.
y()) % 2) * 2 + (
abs((
int)v.
z()) % 2) * 4;
75 template <
typename V>
void insert(V &&k,
const O &o) {
76 if (!
um.count(std::forward<V>(k))) {
88 const Vec ¢er =
ptr(obj)->getPosition();
89 const double &
radius =
ptr(obj)->getBoundingBoxRadius();
92 for (
double i = minCorner.
x(); i <= maxCorner.
x(); ++i) {
93 for (
double j = minCorner.
y(); j <= maxCorner.
y(); ++j) {
94 for (
double k = minCorner.
z(); k <= maxCorner.
z(); ++k) {
110 const Vec ¢er =
ptr(obj)->getPosition();
111 const double &
radius =
ptr(obj)->getBoundingBoxRadius();
113 const double cubeSize = 1.0 /
cellSize;
116 for (
double i = minCorner.
x(); i <= maxCorner.
x(); ++i) {
117 for (
double j = minCorner.
y(); j <= maxCorner.
y(); ++j) {
118 for (
double k = minCorner.
z(); k <= maxCorner.
z(); ++k) {
123 double cx = (i + 0.5) * cubeSize;
125 double cy = (j + 0.5) * cubeSize;
127 double cz = (k + 0.5) * cubeSize;
130 Vec cubeCenter(cx, cy, cz);
137 if ((cubeCenter - center).sqlength() < sqRadius) {
150 Vec blf(min(p0.
x(), min(p1.
x(), p2.
x())), min(p0.
y(), min(p1.
y(), p2.
y())),
151 min(p0.
z(), min(p1.
z(), p2.
z())));
152 Vec trb(max(p0.
x(), max(p1.
x(), p2.
x())), max(p0.
y(), max(p1.
y(), p2.
y())),
153 max(p0.
z(), max(p1.
z(), p2.
z())));
158 if ((center - projec.second).sqlength() < 0.8 * cs * cs) {
175 for (
double i = minCorner.
x(); i <= maxCorner.
x(); ++i) {
176 for (
double j = minCorner.
y(); j <= maxCorner.
y(); ++j) {
177 for (
double k = minCorner.
z(); k <= maxCorner.
z(); ++k) {
197 res += (6.0 -
static_cast<double>(
getNbNeighbours(i.first))) * faceArea;
201 return pow(1.0 /
cellSize, 2) *
static_cast<double>(
um.size());
206 return pow(1.0 /
cellSize, 3) *
static_cast<double>(
um.size());
212 if (s <= 0)
return -1;
219 if (
um.count(cell -
Vec(0, 0, 1))) ++res;
220 if (
um.count(cell -
Vec(0, 1, 0))) ++res;
221 if (
um.count(cell -
Vec(1, 0, 0))) ++res;
222 if (
um.count(cell +
Vec(0, 0, 1))) ++res;
223 if (
um.count(cell +
Vec(0, 1, 0))) ++res;
224 if (
um.count(cell +
Vec(1, 0, 0))) ++res;
double getBoundingBoxRadius() const
Infinite grid of fixed cell size for space partitioning.
std::array< vector< vector< O > >, 8 > getThreadSafeGrid() const
double computeSurface() const
void insertOnlyCenter(const O &obj)
void insert(const O &obj, const Vec &p0, const Vec &p1, const Vec &p2)
std::array< vector< vector< O > >, 8 > getThreadSafeGrid(size_t minEl) const
std::unordered_map< Vec, size_t > & getUnorderedMap()
double computeSphericity() const
vector< O > retrieve(const Vec ¢er, double radius) const
std::vector< std::pair< Vec, std::vector< O > > > orderedVec
size_t vecToColor(const Vec &v) const
vector< O > retrieve(const O &obj) const
std::unordered_map< Vec, size_t > um
void insert(const O &obj)
const std::vector< std::pair< Vec, std::vector< O > > > & getContent() const
int getNbNeighbours(const Vec &cell) const
Vec getIndexFromPosition(const Vec &v) const
double getCellSize() const
void insertPrecise(const O &obj)
void insert(V &&k, const O &o)
std::vector< std::pair< Vec, std::vector< O > > > & getOrderedVec()
general purpose 3D vector/point class.
static const int dimension
void iterateTo(const Vector3D &v, const std::function< void(const Vector3D &)> &fun, const double inc=1) const
helper method to iterates over a 3D rectangular cuboid bounded by two corner vectors
A simple vector class template.
const std::vector< T > & getUnderlyingVector() const
this file contains various miscellanious utility functions & helpers *
T * ptr(T &obj)
returns a pointer (transforms reference into pointer)
std::pair< bool, Vec > projectionIntriangle(const Vec &v0, const Vec &v1, const Vec &v2, const Vec &p, const double tolerance=0)
tests if the projection of a point along the normal of a triangle is inside said triangle
Vector3D Vec
alias for Vector3D
double closestDistToTriangleEdge(const Vec &v0, const Vec &v1, const Vec &v2, const Vec &p)
computes the smallest distance to a triangle edge from a given point
int abs(int x)
Computes the absolute value of an integer.
double cbrt(double x)
Computes the cube root of a number.
double floor(double x)
Computes the floor of a number.
double pow(double base, double exponent)
Computes the power of a number.