1 #include <fcl/math/bv/OBB.h> 13 namespace geometry_queries {
15 fcl::OBB<FCL_PRECISION>* fcl_obb) {
16 fcl_obb->axis = fcl::Matrix3<FCL_PRECISION>::Zero();
17 fcl_obb->To = fcl::Vector3<FCL_PRECISION>::Zero();
18 fcl_obb->extent = fcl::Vector3<FCL_PRECISION>::Zero();
20 fcl_obb->To.topRows(2) = obb->
center().cast<
double>();
22 if (obb->
r_x() > obb->
r_y())
27 fcl_obb->axis(2, 2) = 1;
29 fcl_obb->extent(0) = obb->
r_x();
30 fcl_obb->extent(1) = obb->
r_y();
35 fcl_obb->axis(2, 2) = 1;
36 fcl_obb->extent(0) = obb->
r_x();
37 fcl_obb->extent(1) = obb->
r_y();
44 fcl_obb->axis = fcl::Matrix3<FCL_PRECISION>::Zero();
45 fcl_obb->To = fcl::Vector3<FCL_PRECISION>::Zero();
46 fcl_obb->extent = fcl::Vector3<FCL_PRECISION>::Zero();
47 fcl_obb->To.topRows(2) = obb->
center().cast<
double>();
49 if (obb->
r_x() > obb->
r_y())
54 fcl_obb->axis(2, 2) = 1;
56 fcl_obb->extent(0) = obb->
r_x();
57 fcl_obb->extent(1) = obb->
r_y();
62 fcl_obb->axis(2, 2) = 1;
63 fcl_obb->extent(0) = obb->
r_x();
64 fcl_obb->extent(1) = obb->
r_y();
74 fcl::OBB<FCL_PRECISION> this_obb;
75 fcl::OBB<FCL_PRECISION> other_obb;
80 fcl::OBB<FCL_PRECISION> merged_obb = this_obb + other_obb;
82 Eigen::Matrix2d local_ax;
84 local_ax = merged_obb.axis.block<2, 2>(0, 0).cast<double>();
85 double rx = merged_obb.extent(0);
86 double ry = merged_obb.extent(1);
87 Eigen::Vector2d cent = merged_obb.To.topRows(2).cast<
double>();
94 bool cmpd(
double A,
double B,
double epsilon = 1e-7)
96 return (fabs(A - B) < epsilon);
106 ret->addToGroup(std::static_pointer_cast<const collision::Shape>(first->shared_from_this()));
107 ret->addToGroup(std::static_pointer_cast<const collision::Shape>(second->shared_from_this()));
110 ret->addToGroup(rect);
119 fcl::OBB<FCL_PRECISION> this_obb;
120 fcl::OBB<FCL_PRECISION> other_obb;
125 fcl::OBB<FCL_PRECISION> merged_obb = this_obb + other_obb;
127 Eigen::Matrix2d local_ax;
129 local_ax = merged_obb.axis.block<2, 2>(0, 0).cast<double>();
130 Eigen::Vector2d r(merged_obb.extent(0), merged_obb.extent(1));
132 Eigen::Vector2d cent = merged_obb.To.topRows(2).cast<
double>();
134 return OBB(local_ax, r, cent);
138 return std::make_shared<const RectangleOBB>(aabb->
r_x(), aabb->
r_y(), 0,
146 namespace geometry_queries {
155 static_cast<const RectangleAABB*>(first));
156 first = old_rect1.get();
160 static_cast<const RectangleAABB*>(second));
161 second = old_rect2.get();
164 static_cast<const RectangleOBB*>(first),
165 static_cast<const RectangleOBB*>(second));
171 static_cast<const RectangleOBB*>(first),
172 static_cast<const RectangleOBB*>(second));
179 static_cast<const Sphere*>(first),
180 static_cast<const Sphere*>(second),sg_merge_res);
213 Eigen::Matrix2d local_axes;
215 Eigen::Vector2d v = pt2 - pt1;
217 Eigen::Vector2d center = (pt1 + pt2) / 2;
219 double length = v.norm();
221 if (length < 1e-10)
return 0;
225 local_axes.col(0) = v;
226 local_axes.col(1) = Eigen::Vector2d(-v(1), v(0));
227 return std::make_shared<const RectangleOBB>(length / 2, rect_width / 2,
234 for (
auto vert = verts.begin(); vert < verts.end() - 1; vert++) {
237 if (rect_new) sg_rects_ptr->
addToGroup(rect_new);
239 if (verts.size() > 1) {
241 *(verts.end() - 1), *(verts.begin()), rect_width);
242 if (rect_new) sg_rects_ptr->
addToGroup(rect_new);
Eigen::Vector2d local_y_axis() const
int boost_polygon_enclosure(const ShapeGroup &sg, const RectangleOBB &obb, bool &res)
bool cmpd(double A, double B, double epsilon=1e-7)
RectangleOBBConstPtr obb_from_aabb(const RectangleAABB *aabb)
Eigen::Vector2d local_x_axis() const
OBB merge_obbs(const OBB &obb1, const OBB &obb2)
ShapeGroup can contain simple shapes.
RectangleOBBConstPtr ccd_merge_entities(const RectangleOBB *first, const RectangleOBB *second)
RectangleOBBConstPtr create_rectangle_obb_from_points(Eigen::Vector2d pt1, Eigen::Vector2d pt2, double rect_width)
std::shared_ptr< const RectangleOBB > RectangleOBBConstPtr
int create_rectangles_obb_from_vertex_list(std::vector< Eigen::Vector2d > &verts, collision::ShapeGroup *sg_rects_ptr, double rect_width)
std::shared_ptr< const CollisionObject > CollisionObjectConstPtr
Eigen::Vector2d center(void) const
Eigen::Vector2d local_y_axis() const
std::shared_ptr< ShapeGroup > ShapeGroupPtr
virtual CollisionObjectType getCollisionObjectType() const
std::size_t test_polygon_enclosure(const ShapeGroup &sg_polygons, const RectangleOBB &obb, bool &res)
Base class for CollisionObjects and some of their groups.
void addToGroup(ShapeConstPtr shape)
Adds a simple shape to the ShapeGroup.
Eigen::Vector2d local_x_axis() const
Eigen::Vector2d center() const
Get geometric center of shape.
int fillFclOBBHelper(const RectangleOBB *obb, fcl::OBB< FCL_PRECISION > *fcl_obb)