Helios++
Helios software for LiDAR simulations
Triangle.h
1 #pragma once
2 
3 #include "AABB.h"
4 #include "Primitive.h"
5 #include "Vertex.h"
6 #include <iostream>
7 
8 #include "Color4f.h"
9 
13 class Triangle : public Primitive {
14 private:
15  // *** SERIALIZATION *** //
16  // *********************** //
17  friend class boost::serialization::access;
24  template <typename Archive>
25  void serialize(Archive &ar, const unsigned int version) {
26  boost::serialization::void_cast_register<Triangle, Primitive>();
27  ar &boost::serialization::base_object<Primitive>(*this);
28  ar &faceNormal;
29  ar &e1 &e2 &v0;
30  ar &faceNormalSet;
31  ar &eps;
32  //ar &aabb; // Not needed because it is built on construction
33  //ar &verts; // Not needed because they are in save/load construct
34  }
35 
36 protected:
37  // *** ATTRIBUTES *** //
38  // ******************** //
42  glm::dvec3 faceNormal;
46  glm::dvec3 e1, e2, v0;
51  bool faceNormalSet = false;
55  double eps = 0.00001;
60  AABB *aabb = nullptr;
61 
62 public:
67 
68  // *** CONSTRUCTION / DESTRUCTION *** //
69  // ************************************ //
77  Triangle(Vertex v0, Vertex v1, Vertex v2);
78  ~Triangle() override { delete aabb; }
82  Primitive *clone() override;
86  void _clone(Primitive *p) override;
87 
88  // *** M E T H O D S *** //
89  // *********************** //
90  friend std::ostream &operator<<(std::ostream &out, Triangle *t);
94  AABB *getAABB() override;
98  glm::dvec3 getCentroid() override;
104  glm::dvec3 getFaceNormal();
108  size_t getNumVertices() override { return 3; }
112  Vertex *getVertices() override;
116  double getIncidenceAngle_rad(
117  const glm::dvec3 &rayOrigin,
118  const glm::dvec3 &rayDir,
119  const glm::dvec3 &intersectionPoint
120  ) override;
124  std::vector<double> getRayIntersection(
125  const glm::dvec3 &rayOrigin,
126  const glm::dvec3 &rayDir
127  ) override;
132  const glm::dvec3 &rayOrigin,
133  const glm::dvec3 &rayDir
134  ) override;
139  inline double dotProductNaive(const glm::dvec3 &v1, const glm::dvec3 &v3);
144  inline glm::dvec3 crossProductNaive(
145  const glm::dvec3 &v1,
146  const glm::dvec3 &v2
147  );
148 
152  void update() override;
153 
157  void buildAABB();
158 
163  std::string toString();
164 
169  void setAllVertexColors(Color4f color);
175 
180  double calcArea2D();
185  double calcArea3D();
186 
193  inline double euclideanDistance2D(
194  const glm::dvec3 &v1,
195  const glm::dvec3 &v2
196  );
197 };
Class representing an Axis Aligned Bounding Box (AABB)
Definition: AABB.h:10
Class representing a color with 4 float components: RGBA.
Definition: Color4f.h:10
Abstract class defining the common behavior for all primitives.
Definition: Primitive.h:24
Class representing triangle primitive.
Definition: Triangle.h:13
Vertex verts[3]
The 3 vertices defining the triangle.
Definition: Triangle.h:66
void setAllVertexNormalsFromFace()
Set all triangle vertices normals to the normal vector of triangle face.
Definition: Triangle.cpp:217
void _clone(Primitive *p) override
Definition: Triangle.cpp:31
Triangle(Vertex v0, Vertex v1, Vertex v2)
Triangle constructor.
Definition: Triangle.cpp:18
void serialize(Archive &ar, const unsigned int version)
Serialize a Triangle to a stream of bytes.
Definition: Triangle.h:25
glm::dvec3 faceNormal
Triangle face normal vector.
Definition: Triangle.h:42
std::vector< double > getRayIntersection(const glm::dvec3 &rayOrigin, const glm::dvec3 &rayDir) override
Definition: Triangle.cpp:96
void setAllVertexColors(Color4f color)
Set color for all triangle vertices.
Definition: Triangle.cpp:211
double getRayIntersectionDistance(const glm::dvec3 &rayOrigin, const glm::dvec3 &rayDir) override
Definition: Triangle.cpp:122
AABB * aabb
Axis aligned bounding box containing the triangle.
Definition: Triangle.h:60
glm::dvec3 e1
Precomputed vertex operations to speed-up ray intersection.
Definition: Triangle.h:46
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:74
AABB * getAABB() override
Definition: Triangle.cpp:47
void buildAABB()
Build the axis aligned bounding box containing the triangle.
Definition: Triangle.cpp:180
double getIncidenceAngle_rad(const glm::dvec3 &rayOrigin, const glm::dvec3 &rayDir, const glm::dvec3 &intersectionPoint) override
Definition: Triangle.cpp:65
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:81
glm::dvec3 getCentroid() override
Definition: Triangle.cpp:53
std::string toString()
Build a string representation of the triangle.
Definition: Triangle.cpp:200
Primitive * clone() override
Definition: Triangle.cpp:25
void update() override
Definition: Triangle.cpp:162
double eps
Decimal precision threshold for triangle computations.
Definition: Triangle.h:55
bool faceNormalSet
Flag to specify if face normal has been setted (true) or not (false)
Definition: Triangle.h:51
double calcArea3D()
Compute the 3D area of the triangle.
Definition: Triangle.cpp:230
size_t getNumVertices() override
Definition: Triangle.h:108
Vertex * getVertices() override
Definition: Triangle.cpp:160
glm::dvec3 getFaceNormal()
Obtain triangle face normal vector.
Definition: Triangle.cpp:57
double euclideanDistance2D(const glm::dvec3 &v1, const glm::dvec3 &v2)
Compute the 2D euclidean distance (XY) for given vertices.
Definition: Triangle.cpp:245
double calcArea2D()
Compute the 2D area of the triangle.
Definition: Triangle.cpp:223
Class representing a vertex.
Definition: Vertex.h:14