Collision Checker
sat2d_checks.cc
Go to the documentation of this file.
2 
3 namespace collision {
4 namespace detail {
5 namespace sat2dChecks {
6 inline bool overlaps1Way(const Triangle_SAT2D& tri, const OBB_SAT2D& other) {
7  for (int c1 = 0; c1 < 3; c1++) {
8  double t = other.corner.col(0).dot(tri.axes.col(c1));
9 
10  double min_t = t;
11  double max_t = t;
12 
13  for (int c2 = 1; c2 < 4; ++c2) {
14  t = other.corner.col(c2).dot(tri.axes.col(c1));
15 
16  if (t < min_t) {
17  min_t = t;
18  } else if (t > max_t) {
19  max_t = t;
20  }
21  }
22 
23  if ((min_t > 1 + tri.origin[c1]) || (max_t < tri.origin[c1])) {
24  return false;
25  }
26  }
27 
28  return true;
29 }
30 
31 inline bool overlaps1Way(const OBB_SAT2D& obb, const Triangle_SAT2D& other) {
32  for (int c1 = 0; c1 < 2; c1++) {
33  double t = other.corner.col(0).dot(obb.axes.col(c1));
34 
35  double min_t = t;
36  double max_t = t;
37 
38  for (int c2 = 1; c2 < 3; ++c2) {
39  t = other.corner.col(c2).dot(obb.axes.col(c1));
40 
41  if (t < min_t) {
42  min_t = t;
43  } else if (t > max_t) {
44  max_t = t;
45  }
46  }
47 
48  if ((min_t > 1 + obb.origin[c1]) || (max_t < obb.origin[c1])) {
49  return false;
50  }
51  }
52 
53  return true;
54 }
55 
56 bool overlaps(const Triangle_SAT2D& tri, const OBB_SAT2D& obb) {
57  return tri.bValid && overlaps1Way(obb, tri) && overlaps1Way(tri, obb);
58 }
59 
60 } // namespace sat2dChecks
61 int Triangle_SAT2D::opposite_vert[3] = {2, 1, 0};
62 
63 int Triangle_SAT2D::origin_vert[3] = {0, 0, 1};
64 
65 } // namespace detail
66 } // namespace collision
Eigen::Matrix< double, 2, 4 > corner
Definition: obb_sat2d.h:66
bool overlaps1Way(const Triangle_SAT2D &tri, const OBB_SAT2D &other)
Definition: sat2d_checks.cc:6
Eigen::Matrix2d axes
Definition: obb_sat2d.h:68
Eigen::Matrix< double, 2, 3 > corner
Eigen::Matrix< double, 2, 3 > axes
bool overlaps(const Triangle_SAT2D &tri, const OBB_SAT2D &obb)
Definition: sat2d_checks.cc:56