@@ -59,6 +59,21 @@ namespace ticcd {
59
59
(p4e - p4).lpNorm <Eigen::Infinity>()});
60
60
}
61
61
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
+
62
77
Array3 compute_face_vertex_tolerances (
63
78
const Vector3 &vs,
64
79
const Vector3 &f0s,
@@ -87,9 +102,9 @@ namespace ticcd {
87
102
3 * max_linf_4 (p000, p100, p110, p010, p001, p101, p111, p011);
88
103
89
104
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));
93
108
}
94
109
95
110
Array3 compute_edge_edge_tolerances (
@@ -121,9 +136,9 @@ namespace ticcd {
121
136
3 * max_linf_4 (p000, p100, p110, p010, p001, p101, p111, p011);
122
137
123
138
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));
127
142
}
128
143
129
144
bool edgeEdgeCCD (
0 commit comments