diff --git a/Framework/Geometry/src/RandomPoint.cpp b/Framework/Geometry/src/RandomPoint.cpp index 0b5040113fbe75b715e97798affe20bbffd19d5f..b6963147c0c382895cefb2e887bdb1e82ab80df8 100644 --- a/Framework/Geometry/src/RandomPoint.cpp +++ b/Framework/Geometry/src/RandomPoint.cpp @@ -25,12 +25,18 @@ namespace RandomPoint { Kernel::V3D localPointInCylinder(const Kernel::V3D &basis, const Kernel::V3D &alongAxis, double polarAngle, double radialLength) { - using boost::math::pow; - Mantid::Kernel::V3D basis2{1., 0., 0.}; - if (basis.X() != 0. && basis.Z() != 0) { - const auto inverseXZSumSq = 1. / (pow<2>(basis.X()) + pow<2>(basis.Z())); - basis2.setX(std::sqrt(1. - pow<2>(basis.X()) * inverseXZSumSq)); - basis2.setZ(basis.X() * std::sqrt(inverseXZSumSq)); + // Use basis to get a second perpendicular vector to define basis2 + Kernel::V3D basis2; + if (basis.X() == 0) { + basis2.setX(1.); + } else if (basis.Y() == 0) { + basis2.setY(1.); + } else if (basis.Z() == 0) { + basis2.setZ(1.); + } else { + basis2.setX(-basis.Y()); + basis2.setY(basis.X()); + basis2.normalize(); } const Kernel::V3D basis3{basis.cross_prod(basis2)}; const Kernel::V3D localPoint{ @@ -76,8 +82,7 @@ Kernel::V3D inCylinder(const detail::ShapeInfo &shapeInfo, const double r{geometry.radius * std::sqrt(r2)}; const double z{geometry.height * r3}; const Kernel::V3D alongAxis{geometry.axis * z}; - const Kernel::V3D &basis1{geometry.axis}; - auto localPoint = localPointInCylinder(basis1, alongAxis, polar, r); + auto localPoint = localPointInCylinder(geometry.axis, alongAxis, polar, r); return localPoint + geometry.centreOfBottomBase; } @@ -101,8 +106,7 @@ Kernel::V3D inHollowCylinder(const detail::ShapeInfo &shapeInfo, const double r{std::sqrt(c1 + (c2 - c1) * r2)}; const double z{geometry.height * r3}; const Kernel::V3D alongAxis{geometry.axis * z}; - const Kernel::V3D &basis1{geometry.axis}; - auto localPoint = localPointInCylinder(basis1, alongAxis, polar, r); + auto localPoint = localPointInCylinder(geometry.axis, alongAxis, polar, r); return localPoint + geometry.centreOfBottomBase; } diff --git a/Framework/Geometry/test/RandomPointTest.h b/Framework/Geometry/test/RandomPointTest.h index 0d8086931ae8edc4457215a2b8870bd2b874d2d8..1b870c8bf6b4f6d0a02d3f3408a5c0c6a6e910d2 100644 --- a/Framework/Geometry/test/RandomPointTest.h +++ b/Framework/Geometry/test/RandomPointTest.h @@ -285,10 +285,18 @@ public: constexpr V3D alongAxis{0., 0., 1.}; constexpr V3D basis{1., 1., 1.}; // X and Z elements are not 0 here - Mantid::Kernel::V3D basis2{1., 0., 0.}; - const auto inverseXZSumSq = 1. / (pow<2>(basis.X()) + pow<2>(basis.Z())); - basis2.setX(std::sqrt(1. - pow<2>(basis.X()) * inverseXZSumSq)); - basis2.setZ(basis.X() * std::sqrt(inverseXZSumSq)); + Mantid::Kernel::V3D basis2; + if (basis.X() == 0) { + basis2.setX(1.); + } else if (basis.Y() == 0) { + basis2.setY(1.); + } else if (basis.Z() == 0) { + basis2.setZ(1.); + } else { + basis2.setX(-basis.Y()); + basis2.setY(basis.X()); + basis2.normalize(); + } const Mantid::Kernel::V3D basis3{basis.cross_prod(basis2)}; auto localPoint =