/** * Return a random point in a generic shape limited by a bounding box. * @param object an object in which the point is generated * @param rng a random number generator * @param box a box restricting the point's volume * @param maxAttempts number of attempts to find a suitable point * @return a point or none if maxAttempts was exceeded */ boost::optional<Kernel::V3D> bounded(const IObject &object, Kernel::PseudoRandomNumberGenerator &rng, const BoundingBox &box, size_t maxAttempts) { boost::optional<Kernel::V3D> point{boost::none}; if (box.isNull()) { throw std::invalid_argument( "Invalid bounding box. Cannot generate random point."); } for (size_t attempts{0}; attempts < maxAttempts; ++attempts) { const double r1 = rng.nextValue(); const double r2 = rng.nextValue(); const double r3 = rng.nextValue(); auto pt = box.generatePointInside(r1, r2, r3); if (object.isValid(pt)) { point = pt; break; } }; return point; }