[FEAT] add tuple reflect
This commit is contained in:
@@ -331,6 +331,13 @@ Tuple Tuple::cross(const Tuple &a_tuple)
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
Tuple Tuple::reflect(const Tuple &a_normal)
|
||||
{
|
||||
return *this - a_normal * 2 * dot(a_normal);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
void Tuple::set_at_index(uint8_t an_index, double a_value)
|
||||
{
|
||||
if (an_index == 0)
|
||||
|
||||
@@ -87,6 +87,8 @@ namespace Raytracer
|
||||
double dot(const Tuple &a_tuple);
|
||||
Tuple cross(const Tuple &a_tuple);
|
||||
|
||||
Tuple reflect(const Tuple &a_normal);
|
||||
|
||||
private:
|
||||
void set_at_index(uint8_t an_index, double a_value);
|
||||
|
||||
|
||||
@@ -168,3 +168,47 @@ SCENARIO("Computing the normal on a transformed sphere", "[features/spheres.feat
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
SCENARIO("Reflecting a vector approaching at 45°", "[features/tuples.feature]")
|
||||
{
|
||||
GIVEN("v <-vector(1, -1, 0)")
|
||||
{
|
||||
Tuple v = Tuple::Vector(1, -1, 0);
|
||||
AND_GIVEN("n <-vector(0, 1, 0)")
|
||||
{
|
||||
Tuple n = Tuple::Vector(0, 1, 0);
|
||||
WHEN("r <- reflect(v,n)")
|
||||
{
|
||||
Tuple r = v.reflect(n);
|
||||
THEN("r = vector(1,1,0)")
|
||||
{
|
||||
REQUIRE(r == Tuple::Vector(1, 1, 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
SCENARIO("Reflecting a vector off a slanted surface", "[features/tuples.feature]")
|
||||
{
|
||||
GIVEN("v <-vector(0, -1, 0)")
|
||||
{
|
||||
Tuple v = Tuple::Vector(0, -1, 0);
|
||||
AND_GIVEN("n <-vector(sqrt(2)/2, sqrt(2)/2, 0)")
|
||||
{
|
||||
Tuple n = Tuple::Vector(sqrt(2) / 2, sqrt(2) / 2, 0);
|
||||
WHEN("r <- reflect(v,n)")
|
||||
{
|
||||
Tuple r = v.reflect(n);
|
||||
THEN("r = vector(1,0,0)")
|
||||
{
|
||||
REQUIRE(r == Tuple::Vector(1, 0, 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user