@@ -59,6 +59,21 @@ namespace ticcd {
5959 (p4e - p4).lpNorm <Eigen::Infinity>()});
6060 }
6161
62+ // / @brief Clamp a/b to [-∞, max_val]
63+ // / @param a numerator
64+ // / @param b denominator
65+ // / @param max_val
66+ // / @return a/b if b != 0, max_val if b == 0
67+ inline Scalar
68+ clamp_div (const Scalar a, const Scalar b, const Scalar max_val)
69+ {
70+ if (b == 0 ) {
71+ return max_val;
72+ } else {
73+ return std::min (a / b, max_val);
74+ }
75+ }
76+
6277 Array3 compute_face_vertex_tolerances (
6378 const Vector3 &vs,
6479 const Vector3 &f0s,
@@ -87,9 +102,9 @@ namespace ticcd {
87102 3 * max_linf_4 (p000, p100, p110, p010, p001, p101, p111, p011);
88103
89104 return Array3 (
90- std::min (distance_tolerance / dl, CCD_MAX_TIME_TOL),
91- std::min (distance_tolerance / edge0_length, CCD_MAX_COORD_TOL),
92- std::min (distance_tolerance / edge1_length, CCD_MAX_COORD_TOL));
105+ clamp_div (distance_tolerance, dl, CCD_MAX_TIME_TOL),
106+ clamp_div (distance_tolerance, edge0_length, CCD_MAX_COORD_TOL),
107+ clamp_div (distance_tolerance, edge1_length, CCD_MAX_COORD_TOL));
93108 }
94109
95110 Array3 compute_edge_edge_tolerances (
@@ -121,9 +136,9 @@ namespace ticcd {
121136 3 * max_linf_4 (p000, p100, p110, p010, p001, p101, p111, p011);
122137
123138 return Array3 (
124- std::min (distance_tolerance / dl, CCD_MAX_TIME_TOL),
125- std::min (distance_tolerance / edge0_length, CCD_MAX_COORD_TOL),
126- std::min (distance_tolerance / edge1_length, CCD_MAX_COORD_TOL));
139+ clamp_div (distance_tolerance, dl, CCD_MAX_TIME_TOL),
140+ clamp_div (distance_tolerance, edge0_length, CCD_MAX_COORD_TOL),
141+ clamp_div (distance_tolerance, edge1_length, CCD_MAX_COORD_TOL));
127142 }
128143
129144 bool edgeEdgeCCD (
0 commit comments