Helios++
Helios software for LiDAR simulations
Triangle.h
1 #pragma once
2 
3 #include <iostream>
4 #include "Primitive.h"
5 #include "AABB.h"
6 #include "Vertex.h"
7 
8 #include "Color4f.h"
9 
13 class Triangle : public Primitive {
14  // *** SERIALIZATION *** //
15  // *********************** //
16  friend class boost::serialization::access;
17  template <typename Archive>
18  void serialize(Archive& ar, const unsigned int version)
19  {
20  boost::serialization::void_cast_register<Triangle, Primitive>();
21  ar & boost::serialization::base_object<Primitive>(*this);
22  ar & verts;
23  ar & faceNormal;
24  }
25 
26  // *** ATTRIBUTES *** //
27  // ******************** //
31  glm::dvec3 faceNormal;
35  glm::dvec3 e1, e2, v0;
40  bool faceNormalSet = false;
44  double eps = 0.00001;
49  AABB *aabb = nullptr;
50 public:
55 
56  // *** CONSTRUCTION / DESTRUCTION *** //
57  // ************************************ //
65  Triangle(Vertex v0, Vertex v1, Vertex v2);
66  ~Triangle() override{if(aabb!=nullptr) delete aabb;}
70  Primitive* clone() override;
74  void _clone(Primitive *p) override;
75 
76 
77 
78  // *** M E T H O D S *** //
79  // *********************** //
80  friend std::ostream& operator<<(std::ostream& out, Triangle* t);
84  AABB* getAABB() override;
88  glm::dvec3 getCentroid() override;
94  glm::dvec3 getFaceNormal();
98  size_t getNumVertices() override {return 3;}
102  Vertex* getVertices() override;
106  double getIncidenceAngle_rad(
107  const glm::dvec3& rayOrigin,
108  const glm::dvec3& rayDir,
109  const glm::dvec3& intersectionPoint
110  ) override;
114  std::vector<double> getRayIntersection(
115  const glm::dvec3& rayOrigin,
116  const glm::dvec3& rayDir
117  ) override;
122  const glm::dvec3& rayOrigin,
123  const glm::dvec3& rayDir
124  ) override;
129  inline double dotProductNaive(
130  const glm::dvec3& v1,
131  const glm::dvec3& v3
132  );
137  inline glm::dvec3 crossProductNaive(const glm::dvec3& v1, const glm::dvec3& v2);
138 
142  void update() override;
146  void buildAABB();
147 
152  std::string toString();
153 
158  void setAllVertexColors(Color4f color);
164 
169  double calcArea2D();
174  double calcArea3D();
175 
182  inline double euclideanDistance2D(
183  const glm::dvec3& v1,
184  const glm::dvec3& v2
185  );
186 };
glm::dvec3 getFaceNormal()
Obtain triangle face normal vector.
Definition: Triangle.cpp:56
std::vector< double > getRayIntersection(const glm::dvec3 &rayOrigin, const glm::dvec3 &rayDir) override
Definition: Triangle.cpp:85
void setAllVertexNormalsFromFace()
Set all triangle vertices normals to the normal vector of triangle face.
Definition: Triangle.cpp:225
double calcArea3D()
Compute the 3D area of the triangle.
Definition: Triangle.cpp:238
glm::dvec3 e1
Precomputed vertex operations to speed-up ray intersection.
Definition: Triangle.h:35
glm::dvec3 crossProductNaive(const glm::dvec3 &v1, const glm::dvec3 &v2)
Naive computation of cross product (faster due to the absence of integrity checks) ...
Definition: Triangle.cpp:77
glm::dvec3 faceNormal
Triangle face normal vector.
Definition: Triangle.h:31
Triangle(Vertex v0, Vertex v1, Vertex v2)
Triangle constructor.
Definition: Triangle.cpp:19
double dotProductNaive(const glm::dvec3 &v1, const glm::dvec3 &v3)
Naive computation of dot product (faster due to the absence of integrity checks)
Definition: Triangle.cpp:73
glm::dvec3 getCentroid() override
Definition: Triangle.cpp:52
void setAllVertexColors(Color4f color)
Set color for all triangle vertices.
Definition: Triangle.cpp:219
void buildAABB()
Build the axis aligned bounding box containing the triangle.
Definition: Triangle.cpp:179
Class representing a color with 4 float components: RGBA.
Definition: Color4f.h:6
size_t getNumVertices() override
Definition: Triangle.h:98
double getRayIntersectionDistance(const glm::dvec3 &rayOrigin, const glm::dvec3 &rayDir) override
Definition: Triangle.cpp:119
double getIncidenceAngle_rad(const glm::dvec3 &rayOrigin, const glm::dvec3 &rayDir, const glm::dvec3 &intersectionPoint) override
Definition: Triangle.cpp:64
double calcArea2D()
Compute the 2D area of the triangle.
Definition: Triangle.cpp:231
AABB * getAABB() override
Definition: Triangle.cpp:47
Vertex * getVertices() override
Definition: Triangle.cpp:157
Class representing an Axis Aligned Bounding Box (AABB)
Definition: AABB.h:10
Primitive * clone() override
Definition: Triangle.cpp:26
Class representing triangle primitive.
Definition: Triangle.h:13
void update() override
Definition: Triangle.cpp:161
std::string toString()
Build a string representation of the triangle.
Definition: Triangle.cpp:211
void _clone(Primitive *p) override
Definition: Triangle.cpp:32
AABB * aabb
Axis aligned bounding box containing the triangle.
Definition: Triangle.h:49
double euclideanDistance2D(const glm::dvec3 &v1, const glm::dvec3 &v2)
Compute the 2D euclidean distance (XY) for given vertices.
Definition: Triangle.cpp:245
Vertex verts[3]
The 3 vertices defining the triangle.
Definition: Triangle.h:54
Abstract class defining the common behavior for all primitives.
Definition: Primitive.h:20
double eps
Decimal precision threshold for triangle computations.
Definition: Triangle.h:44
Class representing a vertex.
Definition: Vertex.h:14
bool faceNormalSet
Flag to specify if face normal has been setted (true) or not (false)
Definition: Triangle.h:40