27 #ifndef CDPL_MATH_REGULARSPATIALGRID_HPP
28 #define CDPL_MATH_REGULARSPATIALGRID_HPP
30 #include <type_traits>
51 template <
typename MatrixType>
59 static void init(MatrixType& mtx)
72 static bool invert(
const MatrixType& mtx,
M& inv_mtx)
85 template <
typename V,
typename R>
103 template <
typename T>
111 template <
typename T>
125 template <typename T, typename C = typename TypeTraits<T>::RealType,
typename GD =
Grid<T>,
typename XF =
CMatrix<C, 4, 4> >
160 typedef typename std::conditional<std::is_const<GD>::value,
161 typename GD::ConstReference,
206 xStep(xs), yStep(ys), zStep(zs)
221 data(data), xStep(xs), yStep(ys), zStep(zs)
233 xStep(
s), yStep(
s), zStep(
s)
246 data(data), xStep(
s), yStep(
s), zStep(
s)
258 data(usg.data), xStep(usg.xStep), yStep(usg.yStep), zStep(usg.zStep),
259 xform(usg.xform), invXform(usg.invXform) {}
266 data(std::move(usg.data)), xStep(usg.xStep), yStep(usg.yStep), zStep(usg.zStep),
267 xform(usg.xform), invXform(usg.invXform) {}
303 return data(i, j, k);
315 return data(i, j, k);
324 return data.getSize();
333 return data.getSize1();
342 return data.getSize2();
351 return data.getSize3();
360 return data.getMaxSize();
369 return data.getMaxSize1();
378 return data.getMaxSize2();
387 return data.getMaxSize3();
450 return ((data.getSize1() <= 1 ?
SizeType(0) : (data.getSize1() - 1)) * xStep);
459 return ((data.getSize2() <= 1 ?
SizeType(0) : (data.getSize2() - 1)) * yStep);
468 return ((data.getSize3() <= 1 ?
SizeType(0) : (data.getSize3() - 1)) * zStep);
477 template <
typename V>
496 template <
typename V>
507 coords[0] = world_coords(0);
508 coords[1] = world_coords(1);
509 coords[2] = world_coords(2);
524 template <
typename V>
539 template <
typename V1,
typename V2>
544 transformToLocalCoordinates(world_coords, tmp_local_coords);
546 local_coords[0] = tmp_local_coords[0];
547 local_coords[1] = tmp_local_coords[1];
548 local_coords[2] = tmp_local_coords[2];
557 template <
typename V>
562 transformToLocalCoordinates(pos, local_coords);
573 template <
typename V>
604 template <
typename V1,
typename V2>
609 transformToLocalCoordinates(pos, local_coords);
621 template <
typename V1,
typename V2>
628 indices[0] =
SSizeType(std::floor(x / xStep));
629 indices[1] =
SSizeType(std::floor(y / yStep));
630 indices[2] =
SSizeType(std::floor(z / zStep));
639 return data.isEmpty();
675 template <
typename T1>
679 #ifdef CDPL_MATH_CHECKS_DISABLE
696 invXform = usg.invXform;
710 data = std::move(usg.data);
712 invXform = usg.invXform;
725 template <
typename E>
738 template <
typename E>
751 template <
typename E>
764 template <
typename T1>
777 template <
typename T1>
790 template <
typename E>
803 template <
typename E>
816 template <
typename E>
830 xform.swap(usg.xform);
831 invXform.swap(usg.invXform);
832 std::swap(xStep, usg.xStep);
833 std::swap(yStep, usg.yStep);
834 std::swap(zStep, usg.zStep);
866 data.resize(
m, n, o, preserve, v);
870 template <
typename V1,
typename V2>
871 void transformToLocalCoordinates(
const V1& coords,
V2& local_coords)
const
875 world_coords(0) = coords[0];
876 world_coords(1) = coords[1];
877 world_coords(2) = coords[2];
904 template <
typename T,
typename C,
typename GD,
typename XF,
typename V>
909 typedef typename GridType::CoordinatesValueType CoordinatesValueType;
910 typedef typename GridType::SSizeType SSizeType;
911 typedef typename GridType::ValueType ValueType;
914 return CoordinatesValueType();
916 CoordinatesValueType loc_pos[3];
930 CoordinatesValueType xyz0[3];
934 SSizeType inds_p1[3];
936 inds_p1[0] = inds[0] + 1;
937 inds_p1[1] = inds[1] + 1;
938 inds_p1[2] = inds[2] + 1;
940 inds[0] = std::max(SSizeType(0), inds[0]);
941 inds[1] = std::max(SSizeType(0), inds[1]);
942 inds[2] = std::max(SSizeType(0), inds[2]);
944 inds[0] = std::min(SSizeType(grid.
getSize1() - 1), inds[0]);
945 inds[1] = std::min(SSizeType(grid.
getSize2() - 1), inds[1]);
946 inds[2] = std::min(SSizeType(grid.
getSize3() - 1), inds[2]);
948 inds_p1[0] = std::max(SSizeType(0), inds_p1[0]);
949 inds_p1[1] = std::max(SSizeType(0), inds_p1[1]);
950 inds_p1[2] = std::max(SSizeType(0), inds_p1[2]);
952 inds_p1[0] = std::min(SSizeType(grid.
getSize1() - 1), inds_p1[0]);
953 inds_p1[1] = std::min(SSizeType(grid.
getSize2() - 1), inds_p1[1]);
954 inds_p1[2] = std::min(SSizeType(grid.
getSize3() - 1), inds_p1[2]);
956 CoordinatesValueType xd = (loc_pos[0] - xyz0[0]) / grid.
getXStepSize();
957 CoordinatesValueType yd = (loc_pos[1] - xyz0[1]) / grid.
getYStepSize();
958 CoordinatesValueType zd = (loc_pos[2] - xyz0[2]) / grid.
getZStepSize();
960 ValueType c00 = grid(inds[0], inds[1], inds[2]) * (1 - xd) + grid(inds_p1[0], inds[1], inds[2]) * xd;
961 ValueType c01 = grid(inds[0], inds[1], inds_p1[2]) * (1 - xd) + grid(inds_p1[0], inds[1], inds_p1[2]) * xd;
962 ValueType c10 = grid(inds[0], inds_p1[1], inds[2]) * (1 - xd) + grid(inds_p1[0], inds_p1[1], inds[2]) * xd;
963 ValueType c11 = grid(inds[0], inds_p1[1], inds_p1[2]) * (1 - xd) + grid(inds_p1[0], inds_p1[1], inds_p1[2]) * xd;
965 ValueType c0 = c00 * (1 - yd) + c10 * yd;
966 ValueType c1 = c01 * (1 - yd) + c11 * yd;
968 ValueType c = c0 * (1 - zd) + c1 * zd;
Definition of exception classes.
#define CDPL_MATH_CHECK(expr, msg, e)
Throws the exception e with message msg when the boolean expression expr evaluates to false.
Definition: Check.hpp:47
Definition of various grid expression types and operations.
Definition of grid data types.
Definition of matrix data types.
Definition of type traits.
Definition of vector data types.
Thrown to indicate that some requested calculation has failed.
Definition: Base/Exceptions.hpp:230
Variable-size matrix with fixed upper dimension M×N backed by a stack-allocated array.
Definition: Matrix.hpp:1601
Fixed-size dense matrix of dimension M×N backed by a stack-allocated array.
Definition: Matrix.hpp:2180
Fixed-size vector of dimension N backed by a C-array (no dynamic allocation).
Definition: Vector.hpp:2047
CRTP base class of all grid expression types.
Definition: Expression.hpp:188
Dynamically-sized dense 3D grid with configurable underlying storage.
Definition: Math/Grid.hpp:401
Constant identity-matrix expression (1 on the diagonal, 0 elsewhere).
Definition: Matrix.hpp:3082
3D grid data structure combining a Math::Grid data store with a coordinate-system transformation that...
Definition: RegularSpatialGrid.hpp:127
GD::ConstReference ConstReference
Constant grid cell reference type.
Definition: RegularSpatialGrid.hpp:167
SizeType getMaxSize3() const
Returns the maximum size of the grid along the third dimension.
Definition: RegularSpatialGrid.hpp:385
bool containsPoint(const V &pos) const
Tells whether the world-space point pos lies within the grid bounds.
Definition: RegularSpatialGrid.hpp:558
CoordinatesValueType getZStepSize() const
Returns the per-cell step size along the z-axis.
Definition: RegularSpatialGrid.hpp:412
XF CoordinatesTransformType
The coordinate transformation type mapping cell indices to world coordinates.
Definition: RegularSpatialGrid.hpp:150
RegularSpatialGrid & operator=(const RegularSpatialGrid &usg)
Copy-assigns from usg.
Definition: RegularSpatialGrid.hpp:692
SizeType getMaxSize2() const
Returns the maximum size of the grid along the second dimension.
Definition: RegularSpatialGrid.hpp:376
void setCoordinatesTransform(const T1 &xform)
Sets the cell-index to world-coordinate transformation to xform and caches its inverse.
Definition: RegularSpatialGrid.hpp:676
void setYStepSize(const CoordinatesValueType &ys)
Sets the per-cell step size along the y-axis to ys.
Definition: RegularSpatialGrid.hpp:430
bool isEmpty() const
Tells whether the grid is empty (zero cells along any dimension).
Definition: RegularSpatialGrid.hpp:637
RegularSpatialGrid(const RegularSpatialGrid &usg)
Constructs a copy of the RegularSpatialGrid instance usg.
Definition: RegularSpatialGrid.hpp:257
void setZStepSize(const CoordinatesValueType &zs)
Sets the per-cell step size along the z-axis to zs.
Definition: RegularSpatialGrid.hpp:439
RegularSpatialGrid & operator=(RegularSpatialGrid &&usg)
Move-assigns from usg.
Definition: RegularSpatialGrid.hpp:708
std::enable_if< IsScalar< T >::value, RegularSpatialGrid >::type & operator*=(const T1 &t)
Multiplies every cell by the scalar t.
Definition: RegularSpatialGrid.hpp:765
RegularSpatialGrid(const GridDataType &data, const CoordinatesValueType &xs, const CoordinatesValueType &ys, const CoordinatesValueType &zs)
Constructs the grid with anisotropic per-axis step sizes initialized to the supplied grid data.
Definition: RegularSpatialGrid.hpp:220
T ValueType
The grid cell value type.
Definition: RegularSpatialGrid.hpp:135
std::conditional< std::is_const< GD >::value, typename GD::ConstReference, typename GD::Reference >::type Reference
Mutable grid cell reference type (degrades to ConstReference when the data container is const).
Definition: RegularSpatialGrid.hpp:162
RegularSpatialGrid(const CoordinatesValueType &xs, const CoordinatesValueType &ys, const CoordinatesValueType &zs)
Constructs an empty grid with anisotropic per-axis step sizes.
Definition: RegularSpatialGrid.hpp:205
const SelfType ConstClosureType
Constant closure type used when this grid appears inside another expression.
Definition: RegularSpatialGrid.hpp:192
CoordinatesTransformType::MatrixTemporaryType InvCoordinatesTransformType
The inverse coordinate transformation type.
Definition: RegularSpatialGrid.hpp:155
ConstReference operator()(SizeType i, SizeType j, SizeType k) const
Returns a const reference to the cell at the (i, j, k) position.
Definition: RegularSpatialGrid.hpp:313
RegularSpatialGrid & minusAssign(const GridExpression< E > &e)
Subtracts the grid expression e from the underlying grid data without intermediate temporary.
Definition: RegularSpatialGrid.hpp:817
std::shared_ptr< SelfType > SharedPointer
A reference-counted smart pointer [SHPTR] for dynamically allocated RegularSpatialGrid instances.
Definition: RegularSpatialGrid.hpp:197
std::enable_if< IsScalar< T >::value, RegularSpatialGrid >::type & operator/=(const T1 &t)
Divides every cell by the scalar t.
Definition: RegularSpatialGrid.hpp:778
CoordinatesValueType getYExtent() const
Returns the spatial extent of the grid along the y-axis.
Definition: RegularSpatialGrid.hpp:457
GD::DifferenceType DifferenceType
The signed difference type used by the grid data container.
Definition: RegularSpatialGrid.hpp:182
void clear(const ValueType &v=ValueType())
Sets every cell of the grid to the value v.
Definition: RegularSpatialGrid.hpp:851
SizeType getSize() const
Returns the total number of cells of the grid.
Definition: RegularSpatialGrid.hpp:322
std::ptrdiff_t SSizeType
A signed size type used for offset arithmetic.
Definition: RegularSpatialGrid.hpp:177
SizeType getMaxSize1() const
Returns the maximum size of the grid along the first dimension.
Definition: RegularSpatialGrid.hpp:367
void setXStepSize(const CoordinatesValueType &xs)
Sets the per-cell step size along the x-axis to xs.
Definition: RegularSpatialGrid.hpp:421
RegularSpatialGrid(const CoordinatesValueType &s)
Constructs an empty grid with isotropic step size s on all three axes.
Definition: RegularSpatialGrid.hpp:232
RegularSpatialGrid & operator+=(const GridExpression< E > &e)
Adds the grid expression e cell-wise to the underlying grid data.
Definition: RegularSpatialGrid.hpp:739
friend void swap(RegularSpatialGrid &usg1, RegularSpatialGrid &usg2)
ADL-enabled free-function form of swap().
Definition: RegularSpatialGrid.hpp:842
GD::SizeType SizeType
The unsigned size type used by the grid data container.
Definition: RegularSpatialGrid.hpp:172
SizeType getSize3() const
Returns the size of the grid along the third dimension.
Definition: RegularSpatialGrid.hpp:349
SizeType getSize1() const
Returns the size of the grid along the first dimension.
Definition: RegularSpatialGrid.hpp:331
Reference operator()(SizeType i, SizeType j, SizeType k)
Returns a mutable reference to the cell at the (i, j, k) position.
Definition: RegularSpatialGrid.hpp:301
CoordinatesValueType getXStepSize() const
Returns the per-cell step size along the x-axis.
Definition: RegularSpatialGrid.hpp:394
RegularSpatialGrid & operator-=(const GridExpression< E > &e)
Subtracts the grid expression e cell-wise from the underlying grid data.
Definition: RegularSpatialGrid.hpp:752
RegularSpatialGrid(RegularSpatialGrid &&usg)
Move-constructs the grid by moving usg.
Definition: RegularSpatialGrid.hpp:265
const CoordinatesTransformType & getCoordinatesTransform() const
Returns the coordinate transformation mapping cell-index coordinates to world coordinates.
Definition: RegularSpatialGrid.hpp:664
SizeType getSize2() const
Returns the size of the grid along the second dimension.
Definition: RegularSpatialGrid.hpp:340
CoordinatesValueType getYStepSize() const
Returns the per-cell step size along the y-axis.
Definition: RegularSpatialGrid.hpp:403
CoordinatesValueType getXExtent() const
Returns the spatial extent of the grid along the x-axis ( for non-empty grids).
Definition: RegularSpatialGrid.hpp:448
void getLocalCoordinates(SSizeType i, SSizeType j, SSizeType k, V &coords) const
Writes the local-space 3D position of the cell at (i, j, k) into coords.
Definition: RegularSpatialGrid.hpp:525
void getContainingCell(const V1 &pos, V2 &indices) const
Writes the (i, j, k) cell indices of the cell containing the world-space point pos into indices.
Definition: RegularSpatialGrid.hpp:605
SelfType ClosureType
Closure type used when this grid appears inside another expression.
Definition: RegularSpatialGrid.hpp:187
RegularSpatialGrid & assign(const GridExpression< E > &e)
Assigns the grid expression e to the underlying grid data without intermediate temporary.
Definition: RegularSpatialGrid.hpp:791
GD GridDataType
The underlying grid data container type.
Definition: RegularSpatialGrid.hpp:145
ConstReference operator()(SizeType i) const
Returns a const reference to the cell at the linear index i.
Definition: RegularSpatialGrid.hpp:289
RegularSpatialGrid & operator=(const GridExpression< E > &e)
Assigns the grid expression e to the underlying grid data (the spatial parameters are left unchanged)...
Definition: RegularSpatialGrid.hpp:726
RegularSpatialGrid & plusAssign(const GridExpression< E > &e)
Adds the grid expression e to the underlying grid data without intermediate temporary.
Definition: RegularSpatialGrid.hpp:804
const GridDataType & getData() const
Returns a const reference to the underlying grid data container.
Definition: RegularSpatialGrid.hpp:646
RegularSpatialGrid(const GridDataType &data, const CoordinatesValueType &s)
Constructs the grid with isotropic step size s and the supplied grid data.
Definition: RegularSpatialGrid.hpp:245
void resize(SizeType m, SizeType n, SizeType o, bool preserve=true, const ValueType &v=ValueType())
Resizes the grid to m×n×o cells.
Definition: RegularSpatialGrid.hpp:864
bool containsLocalPoint(const V &pos) const
Tells whether the local-space point pos lies within the grid bounds.
Definition: RegularSpatialGrid.hpp:574
C CoordinatesValueType
The coordinate (real) value type used in the world frame.
Definition: RegularSpatialGrid.hpp:140
CoordinatesValueType getZExtent() const
Returns the spatial extent of the grid along the z-axis.
Definition: RegularSpatialGrid.hpp:466
void getCoordinates(SizeType i, V &coords) const
Writes the world-space 3D position of the cell with linear index i into coords.
Definition: RegularSpatialGrid.hpp:478
GridDataType & getData()
Returns a mutable reference to the underlying grid data container.
Definition: RegularSpatialGrid.hpp:655
void getLocalContainingCell(const V1 &pos, V2 &indices) const
Writes the (i, j, k) cell indices of the cell containing the local-space point pos into indices.
Definition: RegularSpatialGrid.hpp:622
void getCoordinates(SSizeType i, SSizeType j, SSizeType k, V &coords) const
Writes the world-space 3D position of the cell at (i, j, k) into coords.
Definition: RegularSpatialGrid.hpp:497
Reference operator()(SizeType i)
Returns a mutable reference to the cell at the linear index i.
Definition: RegularSpatialGrid.hpp:279
SizeType getMaxSize() const
Returns the maximum total number of cells the grid can hold.
Definition: RegularSpatialGrid.hpp:358
virtual ~RegularSpatialGrid()
Virtual destructor.
Definition: RegularSpatialGrid.hpp:272
void getLocalCoordinates(const V1 &world_coords, V2 &local_coords) const
Transforms the world-space point world_coords into the grid's local coordinate frame and stores the r...
Definition: RegularSpatialGrid.hpp:540
void swap(RegularSpatialGrid &usg)
Swaps the contents of this grid with those of usg.
Definition: RegularSpatialGrid.hpp:827
constexpr unsigned int R
Specifies that the atom has R configuration.
Definition: AtomConfiguration.hpp:58
constexpr unsigned int M
Generic type that covers any element that is a metal.
Definition: AtomType.hpp:657
constexpr unsigned int V
Specifies Vanadium.
Definition: AtomType.hpp:177
constexpr unsigned int T
Specifies Hydrogen (Tritium).
Definition: AtomType.hpp:67
constexpr unsigned int C
Specifies Carbon.
Definition: AtomType.hpp:92
constexpr unsigned int r
Specifies that the stereocenter has r configuration.
Definition: CIPDescriptor.hpp:76
constexpr unsigned int s
Specifies that the stereocenter has s configuration.
Definition: CIPDescriptor.hpp:81
constexpr unsigned int m
Specifies that the stereocenter has m configuration.
Definition: CIPDescriptor.hpp:116
RegularSpatialGrid< double > DRegularSpatialGrid
Unbounded dense regular grid storing floating-point values of type double.
Definition: RegularSpatialGrid.hpp:981
Matrix1VectorBinaryTraits< E1, E2, MatrixVectorProduct< E1, E2 > >::ResultType prod(const MatrixExpression< E1 > &e1, const VectorExpression< E2 > &e2)
Returns the matrix-vector product as a vector expression (named-function form of operator*).
Definition: MatrixExpression.hpp:1731
RegularSpatialGrid< float > FRegularSpatialGrid
Unbounded dense regular grid storing floating-point values of type float.
Definition: RegularSpatialGrid.hpp:976
bool invert(const MatrixExpression< E > &e, MatrixContainer< C > &c)
Computes the inverse of the matrix expression e and stores it in c.
Definition: Matrix.hpp:3370
T interpolateTrilinear(const RegularSpatialGrid< T, C, GD, XF > &grid, const V &pos, bool local_pos)
Returns the trilinearly-interpolated value of grid at pos.
Definition: RegularSpatialGrid.hpp:905
void transform(VectorArray< CVector< T, Dim > > &va, const CMatrix< T1, Dim, Dim > &xform)
Transforms each -dimensional vector in the array with the -dimensional square matrix xform.
Definition: VectorArrayFunctions.hpp:54
The namespace of the Chemical Data Processing Library.