[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)
|
void Tuple::set_at_index(uint8_t an_index, double a_value)
|
||||||
{
|
{
|
||||||
if (an_index == 0)
|
if (an_index == 0)
|
||||||
|
|||||||
@@ -87,6 +87,8 @@ namespace Raytracer
|
|||||||
double dot(const Tuple &a_tuple);
|
double dot(const Tuple &a_tuple);
|
||||||
Tuple cross(const Tuple &a_tuple);
|
Tuple cross(const Tuple &a_tuple);
|
||||||
|
|
||||||
|
Tuple reflect(const Tuple &a_normal);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void set_at_index(uint8_t an_index, double a_value);
|
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