9#include "MantidKernel/DllConfig.h"
27template <
class T>
class Matrix;
35class MANTID_KERNEL_DLL
V3D final {
37 constexpr V3D() noexcept : m_pt({{0., 0., 0.}}) {}
38 constexpr V3D(
double xx,
double yy,
double zz) noexcept : m_pt({{xx, yy, zz}}) {}
44 operator std::vector<double>()
const {
return std::vector<double>(m_pt.cbegin(), m_pt.cend()); }
50 std::size_t
size() const noexcept {
return m_pt.size(); }
58 return V3D(m_pt[0] + v.m_pt[0], m_pt[1] + v.m_pt[1], m_pt[2] + v.m_pt[2]);
67 return V3D(m_pt[0] - v.m_pt[0], m_pt[1] - v.m_pt[1], m_pt[2] - v.m_pt[2]);
76 return V3D(m_pt[0] * v.m_pt[0], m_pt[1] * v.m_pt[1], m_pt[2] * v.m_pt[2]);
85 return V3D(m_pt[0] / v.m_pt[0], m_pt[1] / v.m_pt[1], m_pt[2] / v.m_pt[2]);
94 for (
size_t i = 0; i < m_pt.size(); ++i) {
106 for (
size_t i = 0; i < m_pt.size(); ++i) {
107 m_pt[i] -= v.
m_pt[i];
118 for (
size_t i = 0; i < m_pt.size(); ++i) {
119 m_pt[i] *= v.
m_pt[i];
130 for (
size_t i = 0; i < m_pt.size(); ++i) {
131 m_pt[i] /= v.
m_pt[i];
141 constexpr V3D operator*(
const double D)
const noexcept {
return V3D(m_pt[0] * D, m_pt[1] * D, m_pt[2] * D); }
148 constexpr V3D operator/(
const double D)
const noexcept {
return V3D(m_pt[0] / D, m_pt[1] / D, m_pt[2] / D); }
156 std::for_each(m_pt.begin(), m_pt.end(), [D](
auto &pt) { pt *= D; });
167 std::for_each(m_pt.begin(), m_pt.end(), [D](
auto &pt) { pt /= D; });
175 constexpr V3D operator-() const noexcept {
return V3D(-m_pt[0], -m_pt[1], -m_pt[2]); }
183 return !(std::abs(m_pt[0] - v.m_pt[0]) >
Tolerance || std::abs(m_pt[1] - v.m_pt[1]) >
Tolerance ||
184 std::abs(m_pt[2] - v.m_pt[2]) >
Tolerance);
198 if (m_pt[0] != V.m_pt[0])
199 return m_pt[0] < V.m_pt[0];
200 if (m_pt[1] != V.m_pt[1])
201 return m_pt[1] < V.m_pt[1];
202 return m_pt[2] < V.m_pt[2];
214 void operator()(
const double xx,
const double yy,
const double zz)
noexcept { m_pt = {{xx, yy, zz}}; }
218 void spherical(
const double R,
const double theta,
const double phi)
noexcept;
219 void spherical_rad(
const double R,
const double polar,
const double azimuth)
noexcept;
220 void azimuth_polar_SNS(
const double R,
const double azimuth,
const double polar)
noexcept;
225 void setX(
const double xx)
noexcept { m_pt[0] = xx; }
231 void setY(
const double yy)
noexcept { m_pt[1] = yy; }
237 void setZ(
const double zz)
noexcept { m_pt[2] = zz; }
239 constexpr double X() const noexcept {
return m_pt[0]; }
240 constexpr double Y() const noexcept {
return m_pt[1]; }
241 constexpr double Z() const noexcept {
return m_pt[2]; }
249 assert(
index < m_pt.size());
259 assert(
index < m_pt.size());
263 void getSpherical(
double &R,
double &theta,
double &phi)
const noexcept;
267 void round() noexcept;
270 double norm() const noexcept {
return sqrt(norm2()); }
272 constexpr double norm2() const noexcept {
return m_pt[0] * m_pt[0] + m_pt[1] * m_pt[1] + m_pt[2] * m_pt[2]; }
275 double toMillerIndexes(
double eps = 1.e-3);
282 return m_pt[0] * v.m_pt[0] + m_pt[1] * v.m_pt[1] + m_pt[2] * v.m_pt[2];
286 return V3D(m_pt[1] * v.m_pt[2] - m_pt[2] * v.m_pt[1], m_pt[2] * v.m_pt[0] - m_pt[0] * v.m_pt[2],
287 m_pt[0] * v.m_pt[1] - m_pt[1] * v.m_pt[0]);
294 double distance(
const V3D &v)
const noexcept {
return (*
this - v).norm(); }
296 double zenith(
const V3D &)
const noexcept;
298 double angle(
const V3D &)
const;
300 double cosAngle(
const V3D &)
const;
302 V3D directionAngles(
bool inDegrees =
true)
const;
304 int maxCoeff()
const;
306 V3D absoluteValue()
const;
308 double hklError()
const;
311 static std::vector<V3D> makeVectorsOrthogonal(
const std::vector<V3D> &vectors);
314 void printSelf(std::ostream &)
const;
315 void readPrinted(std::istream &);
316 void read(std::istream &);
317 void write(std::ostream &)
const;
319 void fromString(
const std::string &str);
322 double volume() const noexcept {
return std::abs(m_pt[0] * m_pt[1] * m_pt[2]); }
324 int reBase(
const V3D &,
const V3D &,
const V3D &)
noexcept;
326 int masterDir(
const double Tol = 1e-3) const noexcept;
328 bool nullVector(const
double tolerance = 1e-3) const noexcept;
329 bool unitVector(const
double tolerance = Kernel::Tolerance) const noexcept;
330 bool coLinear(const
V3D &, const
V3D &) const noexcept;
332 void saveNexus(Nexus::File *file, const
std::
string &
name) const;
333 void loadNexus(Nexus::File *file, const
std::
string &
name);
338 static
bool isnan(
V3D const &
vec) {
return (std::isnan(
vec.X()) || std::isnan(
vec.Y()) || std::isnan(
vec.Z())); }
345MANTID_KERNEL_DLL std::ostream &
operator<<(std::ostream &,
const V3D &);
346MANTID_KERNEL_DLL std::istream &
operator>>(std::istream &,
V3D &);
const std::vector< double > & rhs
std::map< DeltaEMode::Type, std::string > index
std::vector< T > const * vec
double distance(const V3D &v) const noexcept
Calculates the distance between two vectors.
constexpr bool operator<(const V3D &V) const noexcept
compare
void operator()(const double xx, const double yy, const double zz) noexcept
Sets the vector position from a triplet of doubles x,y,z.
std::array< double, 3 > m_pt
std::size_t size() const noexcept
Number of components in V3D.
constexpr V3D operator*(const double D) const noexcept
Scalar product.
constexpr V3D operator/(const V3D &v) const noexcept
Inner division.
V3D & operator*=(const double D) noexcept
Scalar product.
constexpr double operator[](const size_t index) const noexcept
Returns the axis value based in the index provided.
constexpr double scalar_prod(const V3D &v) const noexcept
Calculates the cross product.
V3D & operator*=(const V3D &v) noexcept
Self-Inner product.
constexpr double X() const noexcept
Get x.
V3D & operator/=(const V3D &v) noexcept
Self-Inner division.
double normalize()
Make a normalized vector (return norm value)
constexpr V3D cross_prod(const V3D &v) const noexcept
Cross product (this * argument)
constexpr V3D operator-() const noexcept
Negation.
constexpr double Y() const noexcept
Get y.
void setZ(const double zz) noexcept
Set is z position.
V3D & operator+=(const V3D &v) noexcept
Self-Addition operator.
constexpr double norm2() const noexcept
Vector length squared.
double volume() const noexcept
Calculate the volume of a cube X*Y*Z.
constexpr bool operator>(const V3D &rhs) const noexcept
Comparison operator greater than.
double & operator[](const size_t index) noexcept
Returns the axis value based in the index provided.
void setX(const double xx) noexcept
Set is x position.
constexpr V3D operator*(const V3D &v) const noexcept
Inner product.
V3D & operator-=(const V3D &v) noexcept
Self-Subtraction operator.
bool operator==(const V3D &v) const noexcept
Equals operator with tolerance factor.
constexpr V3D operator-(const V3D &v) const noexcept
Subtraction operator.
void setY(const double yy) noexcept
Set is y position.
constexpr double Z() const noexcept
Get z.
constexpr V3D operator/(const double D) const noexcept
Scalar divsion.
constexpr V3D(double xx, double yy, double zz) noexcept
V3D & operator/=(const double D) noexcept
Scalar division.
bool operator!=(const V3D &other) const noexcept
Not equals operator with tolerance factor.
constexpr V3D operator+(const V3D &v) const noexcept
Addtion operator.
MANTID_KERNEL_DLL std::ostream & operator<<(std::ostream &, CPUTimer &)
Convenience function to provide for easier debug printing.
MANTID_KERNEL_DLL std::istream & operator>>(std::istream &, Interpolation &)
Reads in parameter value.
std::string toString(const T &value)
Convert values to strings.
constexpr double Tolerance
Standard tolerance value.
MANTID_KERNEL_DLL V3D normalize(V3D v)
Normalizes a V3D.
Header for a base Nexus::Exception.
Helper class which provides the Collimation Length for SANS instruments.
constexpr bool operator==(const wide_integer< Bits, Signed > &lhs, const wide_integer< Bits2, Signed2 > &rhs)