1 #ifndef RECTANGLE_OBB_H_ 2 #define RECTANGLE_OBB_H_ 21 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
44 const Eigen::Vector2d &_v2,
45 const Eigen::Vector2d &_v3,
46 const Eigen::Vector2d &_v4)
const {
47 double min_x = std::min(_v1(0), _v2(0));
48 double tmp = std::min(_v3(0), _v4(0));
49 fast_aabb_.
x_min = std::min(min_x, tmp);
51 double min_y = std::min(_v1(1), _v2(1));
52 tmp = std::min(_v3(1), _v4(1));
53 fast_aabb_.
y_min = std::min(min_y, tmp);
55 double max_x = std::max(_v1(0), _v2(0));
56 tmp = std::max(_v3(0), _v4(0));
57 fast_aabb_.
x_max = std::max(max_x, tmp);
59 double max_y = std::max(_v1(1), _v2(1));
60 tmp = std::max(_v3(1), _v4(1));
61 fast_aabb_.
y_max = std::max(max_y, tmp);
63 is_fastAABB_cached_ =
true;
67 double min_x = std::min(segments_[0].point1().x, segments_[1].point1().x);
68 double tmp = std::min(segments_[2].point1().x, segments_[3].point1().x);
69 fast_aabb_.
x_min = std::min(min_x, tmp);
71 double min_y = std::min(segments_[0].point1().y, segments_[1].point1().y);
72 tmp = std::min(segments_[2].point1().y, segments_[3].point1().y);
73 fast_aabb_.
y_min = std::min(min_y, tmp);
75 double max_x = std::max(segments_[0].point1().x, segments_[1].point1().x);
76 tmp = std::max(segments_[2].point1().x, segments_[3].point1().x);
77 fast_aabb_.
x_max = std::max(max_x, tmp);
79 double max_y = std::max(segments_[0].point1().y, segments_[1].point1().y);
80 tmp = std::max(segments_[2].point1().y, segments_[3].point1().y);
81 fast_aabb_.
y_max = std::max(max_y, tmp);
83 is_fastAABB_cached_ =
true;
89 RectangleOBB(
double _r_x,
double _r_y, Eigen::Matrix2d _local_axes,
90 const Eigen::Vector2d &_center = Eigen::Vector2d(0, 0))
92 local_axes_(_local_axes),
94 is_fastAABB_cached_(false),
95 cached_orientation_(0),
96 is_orientation_cached_(false) {
101 const Eigen::Vector2d &_center = Eigen::Vector2d(0, 0))
104 is_fastAABB_cached_(false),
105 cached_orientation_(angle),
106 is_orientation_cached_(true) {
107 local_axes_ << cos(angle), -sin(angle), sin(angle), cos(angle);
113 :
Shape(copy), is_fastAABB_cached_(false) {
119 cached_orientation_ = copy.cached_orientation_;
120 is_orientation_cached_ = copy.is_orientation_cached_;
126 if (!is_fastAABB_cached_) {
136 bool rayTrace(
const Eigen::Vector2d &point1,
const Eigen::Vector2d &point2,
137 std::vector<LineSegment> &intersect)
const override;
141 #if ENABLE_SERIALIZER 147 void print(std::ostringstream &stream)
const;
150 void)
const override;
160 Eigen::Vector2d
r()
const;
161 double r(
int i)
const;
178 std::vector<LineSegment>
segments(
void)
const {
return segments_; };
189 Eigen::Matrix2d local_axes_;
194 std::vector<LineSegment> segments_;
198 mutable bool is_fastAABB_cached_;
200 mutable AABB fast_aabb_;
202 mutable double cached_orientation_;
203 mutable bool is_orientation_cached_;
205 void compute_orientation(
void)
const;
Eigen::Vector2d local_y_axis() const
void set_local_x_axis(const Eigen::Vector2d &x_axis)
ShapeType type() const
Get shape type.
double orientation() const
fcl::CollisionObject< FCL_PRECISION > * createFCLCollisionObject(const std::shared_ptr< fcl::CollisionGeometry< FCL_PRECISION >> &) const override
double squareDisToPoint(const Eigen::Vector2d &p) const
RectangleOBB(double _r_x, double _r_y, double angle, const Eigen::Vector2d &_center=Eigen::Vector2d(0, 0))
EIGEN_MAKE_ALIGNED_OPERATOR_NEW void set_up_segments(void)
fcl::CollisionGeometry< FCL_PRECISION > * createFCLCollisionGeometry(void) const override
void set_r_y(double _r_y)
RectangleOBB(const detail::OBB &obb)
void compute_fastAABB(void) const
virtual CollisionObjectType getCollisionObjectType() const
Eigen::Vector2d r() const
double radius() const
Get radius.
void set_local_y_axis(const Eigen::Vector2d &y_axis)
void set_r_x(double _r_x)
Base prototype for the shape of an obstacle.
virtual RectangleOBB * clone() const
AABB getAABB_fast(void) const
void print(std::ostringstream &stream) const
Print all parameters of the shape.
RectangleOBB(double _r_x, double _r_y, Eigen::Matrix2d _local_axes, const Eigen::Vector2d &_center=Eigen::Vector2d(0, 0))
RectangleOBB(const RectangleOBB ©)
std::vector< LineSegment > segments(void) const
Eigen::Vector2d local_x_axis() const
void compute_fastAABB(const Eigen::Vector2d &_v1, const Eigen::Vector2d &_v2, const Eigen::Vector2d &_v3, const Eigen::Vector2d &_v4) const
Eigen::Matrix2d local_axes() const
Eigen::Vector2d center() const
Get geometric center of shape.
bool rayTrace(const Eigen::Vector2d &point1, const Eigen::Vector2d &point2, std::vector< LineSegment > &intersect) const override