[FEAT] RAY: Add transform method

This commit is contained in:
NADAL Jean-Baptiste
2024-02-12 18:24:38 +01:00
parent 8c8e378ebd
commit 768838670f
5 changed files with 43 additions and 9 deletions

View File

@@ -34,13 +34,7 @@ using namespace Raytracer;
/* ------------------------------------------------------------------------- */
Intersections::Intersections(void)
{
}
/* ------------------------------------------------------------------------- */
Intersections::Intersections(const std::initializer_list<Intersection> a_list)
Intersections::Intersections(const std::initializer_list<Intersection> &a_list)
{
m_data.reserve(a_list.size());

View File

@@ -41,8 +41,8 @@ namespace Raytracer
class Intersections
{
public:
Intersections(void);
Intersections(const std::initializer_list<Intersection> a_list);
Intersections(void) = default;
Intersections(const std::initializer_list<Intersection> &a_list);
Intersections(Intersections &an_intersections);
Intersection &operator[](uint8_t an_index);

View File

@@ -84,3 +84,15 @@ Intersections Ray::intersect(Sphere a_sphere)
return the_intersections;
}
/* ------------------------------------------------------------------------- */
Ray Ray::transform(const Matrix &a_matrix)
{
Ray the_output_ray;
the_output_ray.m_origin = a_matrix * m_origin;
the_output_ray.m_direction = a_matrix * m_direction;
return the_output_ray;
}

View File

@@ -31,6 +31,7 @@
#include <vector>
#include "intersections.h"
#include "matrix.h"
#include "sphere.h"
#include "tuple.h"
@@ -41,6 +42,7 @@ namespace Raytracer
class Ray
{
public:
Ray(void) = default;
Ray(Tuple an_origin, Tuple a_direction);
const Tuple &origin(void) const;
@@ -49,6 +51,8 @@ namespace Raytracer
Tuple position(double a_distance);
Intersections intersect(Sphere a_sphere);
Ray transform(const Matrix &a_matrix);
private:
Tuple m_origin;
Tuple m_direction;

View File

@@ -227,3 +227,27 @@ TEST_CASE("[05][Rays] The hit is always the lowest nonnegative intersection", "[
REQUIRE(i == i4);
}
/* ------------------------------------------------------------------------- */
TEST_CASE("[05][Rays] Translating a ray", "[Rays]")
{
Ray r(Tuple::Point(1, 2, 3), Tuple::Vector(0, 1, 0));
Matrix m = Matrix::translation(3, 4, 5);
Ray r2 = r.transform(m);
REQUIRE(r2.origin() == Tuple::Point(4, 6, 8));
REQUIRE(r2.direction() == Tuple::Vector(0, 1, 0));
}
/* ------------------------------------------------------------------------- */
TEST_CASE("[05][Rays] Scaling a ray", "[Rays]")
{
Ray r(Tuple::Point(1, 2, 3), Tuple::Vector(0, 1, 0));
Matrix m = Matrix::scaling(2, 3, 4);
Ray r2 = r.transform(m);
REQUIRE(r2.origin() == Tuple::Point(2, 6, 12));
REQUIRE(r2.direction() == Tuple::Vector(0, 3, 0));
}