33 auto constexpr le = std::less_equal<double>();
34 auto constexpr ge = std::greater_equal<double>();
35 auto constexpr lt = std::less<double>();
36 auto constexpr gt = std::greater<double>();
44 auto const a_dot_bxc = m_a * bxc;
45 auto const b_dot_axc = m_b * axc;
46 auto const c_dot_axb = m_c * axb;
48 auto const dpos =
pos - m_pos;
54 [
this, &vec, &dist,
a = bxc / a_dot_bxc,
b = axc / b_dot_axc,
55 c = axb / c_dot_axb](
auto const op1,
auto const op2,
auto const op3,
62 if (op1(A, 0) and op2(B, 0) and op3(C, 0)) {
64 dist = m_direction * vec.
norm();
71 corner(le, le, le, dpos) ||
73 corner(ge, le, le, dpos - m_a) ||
75 corner(le, ge, le, dpos - m_b) ||
77 corner(le, le, ge, dpos - m_c) ||
79 corner(ge, ge, le, dpos - m_a - m_b) ||
81 corner(ge, le, ge, dpos - m_a - m_c) ||
83 corner(le, ge, ge, dpos - m_b - m_c) ||
85 corner(ge, ge, ge, dpos - m_a - m_b - m_c))
88 auto const edge = [
this, &vec, &dist](
auto const op1,
auto const op2,
91 double const dir1_dot_axis1,
93 double const dir2_dot_axis2,
95 auto const A = (d * axis1) / dir1_dot_axis1;
96 auto const B = (d * axis2) / dir2_dot_axis2;
97 if (op1(A, 0) and op2(B, 0)) {
98 auto const tmp = (d * shape_edge) / shape_edge.norm2();
99 vec = d - shape_edge * tmp;
100 dist = m_direction * vec.
norm();
107 edge(le, le, dpos, axc, b_dot_axc, axb, c_dot_axb, m_a) ||
109 edge(le, le, dpos, bxc, a_dot_bxc, axb, c_dot_axb, m_b) ||
111 edge(le, le, dpos, bxc, a_dot_bxc, axc, b_dot_axc, m_c) ||
113 edge(ge, le, dpos - m_a, bxc, a_dot_bxc, axb, c_dot_axb, m_b) ||
115 edge(ge, le, dpos - m_a, bxc, a_dot_bxc, axc, b_dot_axc, m_c) ||
117 edge(le, ge, dpos - m_b - m_c, bxc, a_dot_bxc, axc, b_dot_axc, m_c) ||
119 edge(le, ge, dpos - m_b - m_c, bxc, a_dot_bxc, axb, c_dot_axb, m_b) ||
121 edge(ge, ge, dpos - m_b - m_c, axc, b_dot_axc, axb, c_dot_axb, m_a) ||
123 edge(ge, le, dpos - m_a - m_b, axc, b_dot_axc, axb, c_dot_axb, m_a) ||
125 edge(ge, ge, dpos - m_a - m_b, bxc, a_dot_bxc, axc, b_dot_axc, m_c) ||
127 edge(le, ge, dpos - m_a - m_c, axc, b_dot_axc, axb, c_dot_axb, m_a) ||
129 edge(ge, ge, dpos - m_a - m_c, bxc, a_dot_bxc, axb, c_dot_axb, m_b))
132 auto const face_outside = [
this, &vec, &dist](
auto const op1,
auto const op2,
135 double const dir_dot_axis,
137 auto d = distance * axis;
138 if (op1(dir_dot_axis, 0)) {
142 auto const tmp = axis.norm();
144 dist = d * m_direction;
145 if (op2(dir_dot_axis, 0)) {
148 vec = (sign * d / tmp) * axis;
155 face_outside(gt, lt, dpos, axb, c_dot_axb, -1) ||
157 face_outside(gt, gt, dpos, axc, b_dot_axc, +1) ||
159 face_outside(gt, lt, dpos, bxc, a_dot_bxc, -1) ||
161 face_outside(lt, lt, dpos - m_a - m_b - m_c, axb, c_dot_axb, +1) ||
163 face_outside(lt, gt, dpos - m_a - m_b - m_c, axc, b_dot_axc, -1) ||
165 face_outside(lt, lt, dpos - m_a - m_b - m_c, bxc, a_dot_bxc, +1))
174 if (c_dot_axb > 0.0) {
177 auto const tmp = axb.
norm();
179 dist = d * m_direction;
180 if (c_dot_axb < 0.0) {
183 vec = (-d / tmp) * axb;
186 auto const face_inside = [
this, &vec, &dist](
auto const op1,
auto const op2,
189 double const dir_dot_axis,
191 auto d = distance * axis;
192 if (op1(dir_dot_axis, 0)) {
195 auto const tmp = axis.
norm();
197 if (std::abs(d) < std::abs(dist)) {
198 dist = d * m_direction;
199 if (op2(dir_dot_axis, 0)) {
202 vec = (sign * d / tmp) * axis;
207 face_inside(gt, gt, dpos, axc, b_dot_axc, +1);
209 face_inside(gt, lt, dpos, bxc, a_dot_bxc, -1);
211 face_inside(lt, lt, dpos - m_a - m_b - m_c, axb, c_dot_axb, +1);
213 face_inside(lt, gt, dpos - m_a - m_b - m_c, axc, b_dot_axc, -1);
215 face_inside(lt, lt, dpos - m_a - m_b - m_c, bxc, a_dot_bxc, +1);