28 lowerLeftCorner_m(
std::numeric_limits<double>::
max()),
29 upperRightCorner_m(
std::numeric_limits<double>::lowest())
35 for (
const Vector_t& position : positions) {
44 for (
unsigned int d = 0; d < 3; ++ d) {
52 for (
unsigned int d = 0; d < 3; ++ d) {
61 std::optional<Vector_t> result = std::nullopt;
62 double minDistance = std::numeric_limits<double>::max();
65 for (
unsigned int d = 0; d < 3; ++ d) {
69 double tau =
dot(p0 - position,
sign * normal) /
dot(direction,
sign * normal);
73 Vector_t pointOnPlane = position + tau * direction;
74 Vector_t relativeP = pointOnPlane - p0;
76 for (
unsigned int i = 1; i < 3; ++ i) {
77 unsigned int idx = (d + i) % 3;
78 if (relativeP[idx] < 0 ||
79 relativeP[idx] > dimensions[idx]) {
86 if (distance < minDistance) {
87 minDistance = distance;
88 result = pointOnPlane;
94 normal =
Vector_t({normal[2], normal[0], normal[1]});
104 for (
unsigned int d = 0; d < 3; ++ d) {
105 if (relPosition[d] < 0 || relPosition[d] > dimensions[d])
return false;
112 int prePrecision = output.precision();
113 output << std::setprecision(8);
114 output <<
"Bounding box\n"
117 output.precision(prePrecision);
double dot(const Vector3D &lhs, const Vector3D &rhs)
Vector dot product.
T euclidean_norm(const Vector< T > &)
Euclidean norm.
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
void print(std::ostream &output) const
static BoundingBox getBoundingBox(const std::vector< Vector_t > &positions)
bool isInside(const Vector_t &position) const
Vector_t lowerLeftCorner_m
Vector_t upperRightCorner_m
std::optional< Vector_t > getIntersectionPoint(const Vector_t &position, const Vector_t &direction) const
void enlargeToContainBoundingBox(const BoundingBox &boundingBox)
void enlargeToContainPosition(const Vector_t &position)
Vektor< double, 3 > Vector_t