Collision Checker
polygon.cc
Go to the documentation of this file.
1 #include <fcl/geometry/bvh/BVH_model.h>
2 #include <fcl/narrowphase/collision.h>
3 #include <fcl/narrowphase/collision_object.h>
11 
13 
14 namespace collision {
15 
16 Polygon::Polygon(std::vector<Eigen::Vector2d> &vertices,
17  std::vector<std::vector<Eigen::Vector2d>> &hole_vertices,
18  std::vector<TriangleConstPtr> &mesh_triangles,
19  const Eigen::Vector2d &_center)
20  : Shape(_center) {
21  vertices_ = vertices;
22  hole_vertices_ = hole_vertices;
23  mesh_triangles_ = mesh_triangles;
25 }
26 #if ENABLE_TRIANGULATION
27 Polygon::Polygon(std::vector<Eigen::Vector2d> &vertices,
28  std::vector<std::vector<Eigen::Vector2d>> &hole_vertices, int triangulation_method,
29  triangulation::TriangulationQuality qual,
30  const Eigen::Vector2d &_center)
31  : Shape(_center) {
32  hole_vertices_ = hole_vertices;
33  vertices_ = vertices;
34  if (qual.bb_only) {
35  triangulation::do_triangulate_aabb(vertices, mesh_triangles_);
36  } else {
37  if (!qual.use_quality) {
38  triangulation::do_triangulate(vertices, mesh_triangles_, triangulation_method);
39  } else {
40  triangulation::do_triangulateQuality(vertices, mesh_triangles_, triangulation_method, qual);
41  }
42  }
44 }
45 /*
46 Polygon::Polygon(std::vector<Eigen::Vector2d> &vertices, int triangulation_method,
47  triangulation::TriangulationQuality qual,
48  const Eigen::Vector2d &_center)
49  : Shape(_center) {
50  vertices_ = vertices;
51  if (qual.bb_only) {
52  triangulation::do_triangulate_aabb(vertices, mesh_triangles_);
53  } else {
54  if (!qual.use_quality) {
55  triangulation::do_triangulate(vertices, mesh_triangles_, triangulation_method);
56  } else {
57  triangulation::do_triangulateQuality(vertices, mesh_triangles_, triangulation_method, qual);
58  }
59  }
60  invalidateCollisionEntityCache();
61 }
62 */
63 #endif
64 
65 bool Polygon::rayTrace(const Eigen::Vector2d &point1,
66  const Eigen::Vector2d &point2,
67  std::vector<LineSegment> &intersect) const {
68  LineSegment obj_segment(point1, point2);
69  bool res = false;
70  for (auto &tri : mesh_triangles_) {
71  std::vector<Eigen::Vector2d> inters1;
72  for (auto &segm : tri->segments()) {
73  res = segm.intersect(obj_segment, inters1) || res;
74  }
75  collision::raytrace::rayTracePostprocess(point1, point2, inters1, intersect,
76  tri.get());
77  }
78  return res;
79 }
80 
81 Polygon *Polygon::clone() const { return new Polygon(*this); }
82 
83 Polygon::Polygon(const Polygon &copy) : Shape(copy) {
84  center_ = copy.center(); // not needed? It is already set in Shape(copy)
85  radius_ = copy.radius();
86  vertices_ = copy.getVertices();
87  hole_vertices_ = copy.getHoleVertices();
88  mesh_triangles_ = copy.getTriangleMesh();
90 }
91 
92 ShapeType Polygon::type(void) const { return type_; }
93 
94 void Polygon::print(std::ostringstream &stream) const {}
95 
96 void Polygon::toString(std::ostringstream &stream) const {
97  stream << "Polygon "
98  << "triangles: ";
99  for (auto &tri : mesh_triangles_) {
100  tri->print(stream);
101  }
102  stream << "\\Polygon " << std::endl;
103 }
104 
105 bool Polygon::isWithin(const Polygon &poly2) const {
106  using namespace collision::solvers::solverBoost;
107  const BoostCollisionObject *this_boost =
109  const BoostCollisionObject *other_boost =
111  if (!this_boost || !other_boost) {
112  throw 0;
113  }
114  return boost_within(*(static_cast<const BoostPolygon *>(
115  this_boost->getCollisionObject_boost().get())),
116  *(static_cast<const BoostPolygon *>(
117  other_boost->getCollisionObject_boost().get())));
118 }
119 
120 fcl::CollisionGeometry<FCL_PRECISION> *Polygon::createFCLCollisionGeometry(
121  void) const {
122  fcl::BVHModel<fcl::AABB<FCL_PRECISION>> *model =
123  new fcl::BVHModel<fcl::AABB<FCL_PRECISION>>();
124  model->beginModel(mesh_triangles_.size(), mesh_triangles_.size() * 3);
125  fcl::Vector3<FCL_PRECISION> v3(0, 0, 0);
126  for (auto &tr : mesh_triangles_) {
127  Eigen::Vector2d v2d = tr->v1();
128  fcl::Vector3<FCL_PRECISION> v1(v2d[0], v2d[1], 0);
129  v2d = tr->v2();
130  fcl::Vector3<FCL_PRECISION> v2(v2d[0], v2d[1], 0);
131  v2d = tr->v3();
132  fcl::Vector3<FCL_PRECISION> v3(v2d[0], v2d[1], 0);
133  model->addTriangle(v1, v2, v3);
134  }
135  model->endModel();
136  return model;
137 }
138 fcl::CollisionObject<FCL_PRECISION> *Polygon::createFCLCollisionObject(
139  const std::shared_ptr<fcl::CollisionGeometry<FCL_PRECISION>> &col_geom)
140  const {
141  return new fcl::CollisionObject<FCL_PRECISION>(col_geom);
142 }
143 
145  int time_idx, CollisionObjectConstPtr shared_ptr_this) const {
146  return shared_ptr_this;
147 }
148 
149 std::vector<TriangleConstPtr> Polygon::getTriangleMesh() const {
150  return mesh_triangles_;
151 }
152 
153 std::vector<Eigen::Vector2d> Polygon::getVertices() const { return vertices_; }
154 
155 std::vector<std::vector<Eigen::Vector2d>> Polygon::getHoleVertices() const {
156  return hole_vertices_;
157 }
158 
159 #if ENABLE_SERIALIZER
160 
161 namespace serialize {
162 ICollisionObjectExport *exportObject(const collision::Polygon &);
163 }
164 
165 serialize::ICollisionObjectExport *Polygon::exportThis(void) const {
166  return serialize::exportObject(*this);
167 }
168 #endif
169 
170 } // namespace collision
std::shared_ptr< BoostObjectInternal > getCollisionObject_boost(void) const
std::vector< Eigen::Vector2d > getVertices() const
Definition: polygon.cc:153
double radius_
Definition: shape.h:73
bool rayTrace(const Eigen::Vector2d &point1, const Eigen::Vector2d &point2, std::vector< LineSegment > &intersect) const override
Definition: polygon.cc:65
std::vector< TriangleConstPtr > getTriangleMesh() const
Definition: polygon.cc:149
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Polygon(std::vector< Eigen::Vector2d > &vertices, std::vector< std::vector< Eigen::Vector2d >> &hole_vertices, std::vector< TriangleConstPtr > &mesh_triangles, const Eigen::Vector2d &_center=Eigen::Vector2d(0, 0))
Definition: polygon.cc:16
ShapeType type(void) const
Get shape type.
Definition: polygon.cc:92
virtual void toString(std::ostringstream &stream) const
Definition: polygon.cc:96
bool rayTracePostprocess(const Eigen::Vector2d &point1, const Eigen::Vector2d &point2, std::vector< Eigen::Vector2d > inters1, std::vector< LineSegment > &intersect, const collision::CollisionObject *obj)
std::shared_ptr< const CollisionObject > CollisionObjectConstPtr
std::vector< std::vector< Eigen::Vector2d > > getHoleVertices() const
Definition: polygon.cc:155
const BoostCollisionObject * get_boost_object_ptr(const CollisionObject *obj)
Definition: boost_helpers.h:10
Polygon * clone() const
Definition: polygon.cc:81
Shape(const Shape &copy)
Definition: shape.cc:7
double radius() const
Get radius.
Definition: shape.cc:27
virtual void print(std::ostringstream &stream) const
Print all parameters of the shape.
Definition: polygon.cc:94
ShapeType
Definition: shape.h:13
virtual CollisionObjectConstPtr timeSlice(int time_idx, CollisionObjectConstPtr shared_ptr_this) const
Definition: polygon.cc:144
Base prototype for the shape of an obstacle.
Definition: shape.h:25
int serialize(const test::BroadphaseFailureCCObj &bf_object, std::ostream &output_stream, const char *format=SERIALIZER_DEFAULT_FORMAT)
bool isWithin(const Polygon &poly2) const
Definition: polygon.cc:105
Eigen::Vector2d center_
Definition: shape.h:72
Polygon contains Triangles and Vertices.
Definition: polygon.h:29
bool boost_within(const BoostPolygon &polyg1, const BoostPolygon &polyg2)
Returns true if the BoostPolygon polyg1 is completely contained within the other BoostPolygon object ...
Eigen::Vector2d center() const
Get geometric center of shape.
Definition: shape.cc:16
BoostPolygon allows to use boost.Geometry functions for Polygon objects.