Collision Checker
obb.h
Go to the documentation of this file.
1 #ifndef CPP_COLLISION_INCLUDE_COLLISION_NARROWPHASE_DETAIL_OBB_H_
2 #define CPP_COLLISION_INCLUDE_COLLISION_NARROWPHASE_DETAIL_OBB_H_
3 
4 #include <Eigen/Dense>
5 
7 
8 namespace collision {
9 namespace detail {
10 class OBB {
11  public:
12  OBB(const Eigen::Matrix2d& local_axes, const Eigen::Vector2d& r,
13  const Eigen::Vector2d& center)
14  : local_axes_(local_axes), r_(r), center_(center) {
15  return;
16  }
17 
18  OBB(void) { return; }
19 
20  int set_local_axes(const Eigen::Matrix2d& local_axes) {
21  local_axes_ = local_axes;
22  return 0;
23  }
24 
25  int set_r(const Eigen::Vector2d& r) {
26  r_ = r;
27  return 0;
28  }
29 
30  int set_center(const Eigen::Vector2d& center) {
31  center_ = center;
32  return 0;
33  }
34 
35  Eigen::Matrix2d local_axes(void) const { return local_axes_; }
36 
37  Eigen::Vector2d r(void) const { return r_; }
38 
39  Eigen::Vector2d center(void) const { return center_; }
40 
41  Eigen::Vector2d local_x_axis() const { return local_axes_.col(0); }
42 
43  Eigen::Vector2d local_y_axis() const { return local_axes_.col(1); }
44 
45  AABB getAABB() const {
46  Eigen::Vector2d _v1 =
47  center() - r_x() * local_x_axis() + r_y() * local_y_axis();
48  Eigen::Vector2d _v2 =
49  center() + r_x() * local_x_axis() + r_y() * local_y_axis();
50  Eigen::Vector2d _v3 =
51  center() + r_x() * local_x_axis() - r_y() * local_y_axis();
52  Eigen::Vector2d _v4 =
53  center() - r_x() * local_x_axis() - r_y() * local_y_axis();
54 
55  AABB aabb;
56 
57  double min_x = std::min(_v1(0), _v2(0));
58  double tmp = std::min(_v3(0), _v4(0));
59  aabb.x_min = std::min(min_x, tmp);
60 
61  double min_y = std::min(_v1(1), _v2(1));
62  tmp = std::min(_v3(1), _v4(1));
63  aabb.y_min = std::min(min_y, tmp);
64 
65  double max_x = std::max(_v1(0), _v2(0));
66  tmp = std::max(_v3(0), _v4(0));
67  aabb.x_max = std::max(max_x, tmp);
68 
69  double max_y = std::max(_v1(1), _v2(1));
70  tmp = std::max(_v3(1), _v4(1));
71  aabb.y_max = std::max(max_y, tmp);
72 
73  return aabb;
74  }
75 
76  double r_x() const { return r_(0); }
77 
78  double r_y() const { return r_(1); }
79 
80  private:
81  Eigen::Matrix2d local_axes_;
82  Eigen::Vector2d r_;
83  Eigen::Vector2d center_;
84 };
85 } // namespace detail
86 }; // namespace collision
87 
88 #endif /* CPP_COLLISION_INCLUDE_COLLISION_NARROWPHASE_DETAIL_OBB_H_ */
double r_x() const
Definition: obb.h:76
double y_min
Definition: aabb.h:11
Eigen::Vector2d local_x_axis() const
Definition: obb.h:41
Eigen::Vector2d r(void) const
Definition: obb.h:37
int set_local_axes(const Eigen::Matrix2d &local_axes)
Definition: obb.h:20
Eigen::Vector2d center(void) const
Definition: obb.h:39
Eigen::Vector2d local_y_axis() const
Definition: obb.h:43
OBB(const Eigen::Matrix2d &local_axes, const Eigen::Vector2d &r, const Eigen::Vector2d &center)
Definition: obb.h:12
double r_y() const
Definition: obb.h:78
int set_center(const Eigen::Vector2d &center)
Definition: obb.h:30
int set_r(const Eigen::Vector2d &r)
Definition: obb.h:25
AABB getAABB() const
Definition: obb.h:45
Eigen::Matrix2d local_axes(void) const
Definition: obb.h:35
double x_max
Definition: aabb.h:10
double x_min
Definition: aabb.h:9
double y_max
Definition: aabb.h:12