|
1 #include "geometry.h" |
|
2 |
|
3 /** |
|
4 * @brief Computes a line from two points |
|
5 * @param point_1 |
|
6 * @param point_2 |
|
7 * @return line |
|
8 */ |
|
9 geom::Line geom::lineFromPoints(const glm::vec3& point_1, const glm::vec3 point_2) |
|
10 { |
|
11 return {point_2 - point_1, point_1}; |
|
12 } |
|
13 |
|
14 /** |
|
15 * @brief Computes line-plane intersection |
|
16 * @param line |
|
17 * @param plane |
|
18 * @return point of intersection. Does not return a value if the line is in parallel to the plane. |
|
19 */ |
|
20 std::optional<glm::vec3> geom::linePlaneIntersection(const geom::Line& line, const geom::Plane& plane) |
|
21 { |
|
22 const float denominator = glm::dot(line.direction, plane.normal); |
|
23 if (std::abs(denominator) < 1e-8f) |
|
24 { |
|
25 return {}; |
|
26 } |
|
27 else |
|
28 { |
|
29 const float d = glm::dot(plane.anchor - line.anchor, plane.normal) / denominator; |
|
30 return line.anchor + d * line.direction; |
|
31 } |
|
32 } |
|
33 |
|
34 /** |
|
35 * @brief Computes the plane of a triangle |
|
36 * @param triangle |
|
37 * @return plane |
|
38 */ |
|
39 geom::Plane geom::planeFromTriangle(const geom::Triangle& triangle) |
|
40 { |
|
41 return geom::Plane{triangle.points[0], normalVector(triangle)}; |
|
42 } |
|
43 |
|
44 /** |
|
45 * @brief Computes the normal vector of a triangle |
|
46 * @param triangle |
|
47 * @return normal vector |
|
48 */ |
|
49 glm::vec3 geom::normalVector(const geom::Triangle& triangle) |
|
50 { |
|
51 return glm::normalize( |
|
52 glm::cross( |
|
53 triangle.points[1] - triangle.points[0], |
|
54 triangle.points[2] - triangle.points[0])); |
|
55 } |