37 #ifndef COAL_CONTACT_PATCH_SOLVER_HXX
38 #define COAL_CONTACT_PATCH_SOLVER_HXX
75 template <
typename ShapeType1,
typename ShapeType2>
85 contact_patch.
points().clear();
110 this->
reset(s1, tf1, s2, tf2, contact_patch);
126 this->support_set_shape2.size() <= 1) {
132 const CoalScalar eps = Eigen::NumTraits<CoalScalar>::dummy_precision();
136 (this->support_set_shape2.size() == 2)) {
141 const Vec2s& a = pts1[0];
142 const Vec2s& b = pts1[1];
145 const Vec2s& c = pts2[0];
146 const Vec2s& d = pts2[1];
149 (b(0) - a(0)) * (d(1) - c(1)) >= (b(1) - a(1)) * (d(0) - c(0));
150 if ((std::abs(det) > eps) || ((c - d).squaredNorm() < eps) ||
151 ((b - a).squaredNorm() < eps)) {
156 const Vec2s cd = (d - c);
158 Polygon& patch = contact_patch.
points();
162 t1 = (t1 >= l) ? 1.0 : ((t1 <= 0) ? 0.0 : (t1 / l));
163 const Vec2s p1 = c + t1 * cd;
164 patch.emplace_back(p1);
168 t2 = (t2 >= l) ? 1.0 : ((t2 <= 0) ? 0.0 : (t2 / l));
169 const Vec2s p2 = c + t2 * cd;
170 if ((p1 - p2).squaredNorm() >= eps) {
171 patch.emplace_back(p2);
191 const size_t max_result_size =
197 const Polygon* clipper_ptr =
nullptr;
198 Polygon* current_ptr =
nullptr;
211 const Polygon& clipper = *(clipper_ptr);
212 const size_t clipper_size = clipper.size();
213 for (
size_t i = 0; i < clipper_size; ++i) {
217 Polygon* tmp_ptr = previous_ptr;
218 previous_ptr = current_ptr;
219 current_ptr = tmp_ptr;
221 const Polygon& previous = *(previous_ptr);
222 Polygon& current = *(current_ptr);
225 const Vec2s& a = clipper[i];
226 const Vec2s& b = clipper[(i + 1) % clipper_size];
227 const Vec2s ab = b - a;
229 if (previous.size() == 2) {
233 const Vec2s& p1 = previous[0];
234 const Vec2s& p2 = previous[1];
236 const Vec2s ap1 = p1 - a;
237 const Vec2s ap2 = p2 - a;
239 const CoalScalar det1 = ab(0) * ap1(1) - ab(1) * ap1(0);
240 const CoalScalar det2 = ab(0) * ap2(1) - ab(1) * ap2(0);
242 if (det1 < 0 && det2 < 0) {
248 if (det1 >= 0 && det2 >= 0) {
260 current.emplace_back(p1);
261 current.emplace_back(p);
266 current.emplace_back(p1);
272 current.emplace_back(p2);
273 current.emplace_back(p);
278 current.emplace_back(p2);
287 this->added_to_patch.end(),
290 const size_t previous_size = previous.size();
291 for (
size_t j = 0; j < previous_size; ++j) {
292 const Vec2s& p1 = previous[j];
293 const Vec2s& p2 = previous[(j + 1) % previous_size];
295 const Vec2s ap1 = p1 - a;
296 const Vec2s ap2 = p2 - a;
298 const CoalScalar det1 = ab(0) * ap1(1) - ab(1) * ap1(0);
299 const CoalScalar det2 = ab(0) * ap2(1) - ab(1) * ap2(0);
301 if (det1 < 0 && det2 < 0) {
306 if (det1 >= 0 && det2 >= 0) {
310 current.emplace_back(p1);
320 current.emplace_back(p1);
324 current.emplace_back(p);
328 current.emplace_back(p1);
335 current.emplace_back(p);
338 current.emplace_back(p2);
347 if (current.size() <= 1) {
355 this->
getResult(contact, current_ptr, contact_patch);
362 if (result_ptr->size() <= 1) {
373 template <
typename ShapeType1,
typename ShapeType2>
376 const ShapeType2& shape2,
411 const Vec2s ab = b - a;
412 const Vec2s n(-ab(1), ab(0));
414 if (std::abs(denominator) < std::numeric_limits<double>::epsilon()) {
419 alpha = std::min<double>(1.0, std::max<CoalScalar>(0.0, alpha));
420 return alpha * c + (1 - alpha) * d;
Main namespace.
Definition: broadphase_bruteforce.h:44
Eigen::Matrix< CoalScalar, 2, 1 > Vec2s
Definition: data_types.h:78
void constructContactPatchFrameFromContact(const Contact &contact, ContactPatch &contact_patch)
Construct a frame from a Contact's position and normal. Because both Contact's position and normal ar...
Definition: collision_data.h:704
double CoalScalar
Definition: data_types.h:76
Definition: geometric_shapes_traits.h:55