1#ifndef GYM_PCB_UNIFORMGRID25_H
2#define GYM_PCB_UNIFORMGRID25_H
5#include "Math/IPoint3.hpp"
6#include "UserSettings.hpp"
11 const Real EdgeLen, EdgeLen05, EdgeLenRcp;
13 UniformGrid25(Real edgeLen) : EdgeLen(edgeLen), EdgeLen05(edgeLen * 0.5), EdgeLenRcp(1.0 / EdgeLen) { }
16 uint getSize(uint d)
const { assert(d < 3);
return mSize[d]; }
17 const Bbox_2& getBbox()
const {
return mBbox; }
19 Real XCoord(
int x)
const {
return x * EdgeLen + mBbox.xmin(); }
20 Real YCoord(
int y)
const {
return y * EdgeLen + mBbox.ymin(); }
21 Point_2 Coords(
const IPoint_2 &v)
const {
return Coords(v.x, v.y); }
22 Point_2 Coords(
int x,
int y)
const {
return Point_2(XCoord(x), YCoord(y)); }
24 Point_25 Coords(
int x,
int y, uint z)
const { assert(z < mSize[2]);
return Point_25(XCoord(x), YCoord(y), z); }
26 Vector_2 MidPointOffset()
const {
return Vector_2(EdgeLen05, EdgeLen05); }
27 Real MidPointX(
int x)
const {
return XCoord(x) + MidPointOffset().x(); }
28 Real MidPointY(
int y)
const {
return YCoord(y) + MidPointOffset().y(); }
29 Point_2 MidPoint(
const IPoint_2 &v)
const {
return MidPoint(v.x, v.y); }
30 Point_2 MidPoint(
int x,
int y)
const {
return Coords(x,y) + MidPointOffset(); }
31 Point_25 MidPoint(
const IPoint_3 &v)
const {
return Coords(v) + MidPointOffset(); }
33 IVector_2 HIndices(
const Point_2 &v)
const {
return IVector_2(XIndex(v.x()), YIndex(v.y())); }
34 int XIndex(Real x, Real ex = 0.0)
const;
35 int YIndex(Real y, Real ey = 0.0)
const;
36 uint XIndexBounded(Real x, Real ex = 0.0)
const;
37 uint YIndexBounded(Real y, Real ey = 0.0)
const;
38 uint LinearIndex(uint z, uint y, uint x)
const {
return z * mStrideZ + y * mStrideY + x; }
39 uint LinearIndex(
const Point_25 &v)
const {
return LinearIndex(XIndexBounded(v.x()), YIndexBounded(v.y()), 0); }
40 IBox_3 getBox(
const Bbox_2&, uint z0 = 0, uint z1 = std::numeric_limits<uint>::max())
const;
42 Real XfIndex(Real x, Real ex = 0.0)
const;
43 Real YfIndex(Real y, Real ey = 0.0)
const;
45 uint getNumPoints2D()
const {
return mSize[0] * mSize[1]; }
46 uint getNumPoints3D()
const {
return mNumPoints3D; }
48 bool inside(
const IPoint_3 &v)
const {
return inside(v.x, v.y, v.z); }
49 bool inside(uint x, uint y, uint z)
const;
60 void calcNumPoints3D();
63inline Real UniformGrid25::XfIndex(Real x, Real ex)
const
65 return (x + ex - mBbox.xmin()) * EdgeLenRcp;
67inline Real UniformGrid25::YfIndex(Real y, Real ey)
const
69 return (y + ey - mBbox.ymin()) * EdgeLenRcp;
72inline int UniformGrid25::XIndex(Real x, Real ex)
const
74 return int(XfIndex(x, ex));
76inline int UniformGrid25::YIndex(Real y, Real ey)
const
78 return int(YfIndex(y, ey));
80inline uint UniformGrid25::XIndexBounded(Real x, Real ex)
const
82 return std::max(0, std::min(XIndex(x, ex),
int(mSize[0] - 1)));
84inline uint UniformGrid25::YIndexBounded(Real y, Real ey)
const
86 return std::max(0, std::min(YIndex(y, ey),
int(mSize[1] - 1)));
88inline bool UniformGrid25::inside(uint x, uint y, uint z)
const
90 return (x < mSize[0]) && (y < mSize[1]) && (z < mSize[2]);
95 return Point_25(std::floor(v.x() - mBbox.xmin()) + EdgeLen05 + mBbox.xmin(),
96 std::floor(v.y() - mBbox.ymin()) + EdgeLen05 + mBbox.ymin(),
100inline void UniformGrid25::calcNumPoints3D()
102 uint64_t N = (uint64_t(mSize[0]) * mSize[1]) * mSize[2];
103 if (N > UserSettings::get().MaxGridCells || N > std::numeric_limits<uint>::max())
104 throw std::runtime_error(
"grid is too large, reduce the resolution");
108inline IBox_3 UniformGrid25::getBox(
const Bbox_2 &bbox, uint z0, uint z1)
const
110 return IBox_3(IPoint_3(XIndexBounded(bbox.xmin()), YIndexBounded(bbox.ymin()), std::min(z0, mSize[2] - 1)),
111 IPoint_3(XIndexBounded(bbox.xmax()), YIndexBounded(bbox.ymax()), std::min(z1, mSize[2] - 1)));
Definition IPoint2.hpp:37
Definition IPoint3.hpp:36
Definition IPoint2.hpp:10
Definition Geometry.hpp:131
Definition IPoint3.hpp:60