Collision Checker
triangle.cc
Go to the documentation of this file.
1 #include <fcl/narrowphase/collision.h>
2 #include <fcl/narrowphase/collision_object.h>
5 
6 #include <fcl/geometry/bvh/BVH_model.h>
7 #include <math.h>
9 
11 
12 namespace collision {
13 
14 Triangle *Triangle::clone() const { return new Triangle(*this); }
15 
17  : Shape(copy), v1_(copy.v1()), v2_(copy.v2()), v3_(copy.v3()) {
18  center_ = copy.center();
19  radius_ = copy.radius();
20  segments_ = copy.segments();
21 }
22 
23 bool Triangle::rayTrace(const Eigen::Vector2d &point1,
24  const Eigen::Vector2d &point2,
25  std::vector<LineSegment> &intersect) const {
26  LineSegment obj_segment(point1, point2);
27 
28  std::vector<Eigen::Vector2d> inters1;
29  bool res = false;
30  for (auto &segm : segments_) {
31  res = segm.intersect(obj_segment, inters1) || res;
32  }
33  collision::raytrace::rayTracePostprocess(point1, point2, inters1, intersect,
34  this);
35 
36  return res;
37 }
38 
39 ShapeType Triangle::type() const { return type_; }
40 
41 void Triangle::print(std::ostringstream &stream) const {
42  stream << "Triangle: \nVertices:"
43  << "(" << v1_(0) << "|" << v1_(1) << "), "
44  << "(" << v2_(0) << "|" << v2_(1) << "), "
45  << "(" << v3_(0) << "|" << v3_(1) << "), "
46  << "\ncenter: "
47  << "(" << center_x() << "|" << center_y() << "), " << std::endl;
48 }
49 
50 fcl::CollisionGeometry<FCL_PRECISION> *Triangle::createFCLCollisionGeometry(
51  void) const {
52  fcl::BVHModel<fcl::AABB<FCL_PRECISION>> *model =
53  new fcl::BVHModel<fcl::AABB<FCL_PRECISION>>();
54  model->beginModel(1, 3);
55 
56  Eigen::Vector2d v2d = v1();
57  fcl::Vector3<FCL_PRECISION> v1(v2d[0], v2d[1], 0);
58  v2d = v2();
59  fcl::Vector3<FCL_PRECISION> v2(v2d[0], v2d[1], 0);
60  v2d = v3();
61  fcl::Vector3<FCL_PRECISION> v3(v2d[0], v2d[1], 0);
62 
63  model->addTriangle(v1, v2, v3);
64  model->endModel();
65  return model;
66 }
67 
68 fcl::CollisionObject<FCL_PRECISION> *Triangle::createFCLCollisionObject(
69  const std::shared_ptr<fcl::CollisionGeometry<FCL_PRECISION>> &col_geom)
70  const {
71  return new fcl::CollisionObject<FCL_PRECISION>(col_geom);
72 }
73 
74 Eigen::Vector2d Triangle::v1() const { return v1_; }
75 
76 Eigen::Vector2d Triangle::v2() const { return v2_; }
77 
78 Eigen::Vector2d Triangle::v3() const { return v3_; }
79 
80 Eigen::Vector2d Triangle::center() const { return center_; }
81 
82 Eigen::Vector2d Triangle::incenter() const { return incenter_; }
83 
84 double Triangle::incircle_radius() const { return incircle_radius_; }
85 
86 void Triangle::set_v1(const Eigen::Vector2d &_v1) {
87  v1_ = _v1;
89 }
90 
91 void Triangle::set_v2(const Eigen::Vector2d &_v2) {
92  v2_ = _v2;
94 }
95 
96 void Triangle::set_v3(const Eigen::Vector2d &_v3) {
97  v3_ = _v3;
99 }
100 
101 Eigen::Vector2d Triangle::compute_center() {
102  double x = (v1_(0) + v2_(0) + v3_(0)) / 3.0;
103  double y = (v1_(1) + v2_(1) + v3_(1)) / 3.0;
104  return Eigen::Vector2d(x, y);
105 }
106 
107 void Triangle::compute_incircle_radius_and_center() {
108  // length of triangle sides
109  double a = (v2_ - v1_).norm();
110  double b = (v3_ - v2_).norm();
111  double c = (v3_ - v1_).norm();
112  // half of perimeter
113  double p = 0.5 * (a + b + c);
114  // using Heron's Formula
115  double area = std::sqrt(p * (p - a) * (p - b) * (p - c));
116  // incenter
117  incenter_ = (b * v1_ + c * v2_ + a * v3_) / (2.0 * p);
118  // inradius
119  incircle_radius_ = area / p;
120 }
121 
122 #if ENABLE_SERIALIZER
123 
124 namespace serialize {
125 ICollisionObjectExport *exportObject(const collision::Triangle &);
126 }
127 
128 serialize::ICollisionObjectExport *Triangle::exportThis(void) const {
129  return serialize::exportObject(*this);
130 }
131 #endif
132 
133 } // namespace collision
std::vector< LineSegment > segments(void) const
Definition: triangle.h:68
Eigen::Vector2d v2() const
Definition: triangle.cc:76
double radius_
Definition: shape.h:73
double incircle_radius() const
Definition: triangle.cc:84
Triangle.
Definition: triangle.h:17
Triangle * clone() const
Definition: triangle.cc:14
double radius() const
Definition: triangle.h:55
bool rayTracePostprocess(const Eigen::Vector2d &point1, const Eigen::Vector2d &point2, std::vector< Eigen::Vector2d > inters1, std::vector< LineSegment > &intersect, const collision::CollisionObject *obj)
Eigen::Vector2d v1() const
Definition: triangle.cc:74
Eigen::Vector2d v3() const
Definition: triangle.cc:78
void set_v2(const Eigen::Vector2d &_v2)
Definition: triangle.cc:91
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Triangle(const Eigen::Vector2d &_v1=Eigen::Vector2d(0, 0), const Eigen::Vector2d &_v2=Eigen::Vector2d(0, 0), const Eigen::Vector2d &_v3=Eigen::Vector2d(0, 0))
Definition: triangle.h:21
void print(std::ostringstream &stream) const
Print all parameters of the shape.
Definition: triangle.cc:41
ShapeType
Definition: shape.h:13
void set_v1(const Eigen::Vector2d &_v1)
Definition: triangle.cc:86
Eigen::Vector2d center() const
Definition: triangle.cc:80
Base prototype for the shape of an obstacle.
Definition: shape.h:25
void set_v3(const Eigen::Vector2d &_v3)
Definition: triangle.cc:96
int serialize(const test::BroadphaseFailureCCObj &bf_object, std::ostream &output_stream, const char *format=SERIALIZER_DEFAULT_FORMAT)
ShapeType type() const
Get shape type.
Definition: triangle.cc:39
double center_x() const
Definition: shape.cc:18
Eigen::Vector2d incenter() const
Definition: triangle.cc:82
double center_y() const
Definition: shape.cc:20
Eigen::Vector2d center_
Definition: shape.h:72
bool rayTrace(const Eigen::Vector2d &point1, const Eigen::Vector2d &point2, std::vector< LineSegment > &intersect) const override
Definition: triangle.cc:23