[FEAT] Add scaling
This commit is contained in:
@@ -326,6 +326,20 @@ Matrix Matrix::translation(double an_x, double an_y, double an_z)
|
|||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
Matrix Matrix::scaling(double an_x, double an_y, double an_z)
|
||||||
|
{
|
||||||
|
Matrix the_scaling = {
|
||||||
|
{an_x, 0, 0, 0},
|
||||||
|
{ 0, an_y, 0, 0},
|
||||||
|
{ 0, 0, an_z, 0},
|
||||||
|
{ 0, 0, 0, 1}
|
||||||
|
};
|
||||||
|
|
||||||
|
return the_scaling;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
bool Matrix::validate_dimensions(const std::initializer_list<std::initializer_list<double>> &a_values) const
|
bool Matrix::validate_dimensions(const std::initializer_list<std::initializer_list<double>> &a_values) const
|
||||||
{
|
{
|
||||||
for (const auto &the_row : a_values)
|
for (const auto &the_row : a_values)
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ namespace Raytracer
|
|||||||
|
|
||||||
static Matrix identity(void);
|
static Matrix identity(void);
|
||||||
static Matrix translation(double an_x, double an_y, double an_z);
|
static Matrix translation(double an_x, double an_y, double an_z);
|
||||||
|
static Matrix scaling(double an_x, double an_y, double an_z);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool validate_dimensions(const std::initializer_list<std::initializer_list<double>> &a_values) const;
|
bool validate_dimensions(const std::initializer_list<std::initializer_list<double>> &a_values) const;
|
||||||
|
|||||||
@@ -61,3 +61,44 @@ TEST_CASE("[04][TRANSFORMATION] Translation does not affect vectors", "[Matrix]"
|
|||||||
|
|
||||||
REQUIRE(transform * v == v);
|
REQUIRE(transform * v == v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
TEST_CASE("[04][TRANSFORMATION] A scaling matrix applied to a point", "[Matrix]")
|
||||||
|
{
|
||||||
|
Matrix transform = Matrix::scaling(2, 3, 4);
|
||||||
|
Tuple p = Tuple::Point(-4, 6, 8);
|
||||||
|
|
||||||
|
REQUIRE(transform * p == Tuple::Point(-8, 18, 32));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
TEST_CASE("[04][TRANSFORMATION] A scaling matrix applied to a vector", "[Matrix]")
|
||||||
|
{
|
||||||
|
Matrix transform = Matrix::scaling(2, 3, 4);
|
||||||
|
Tuple v = Tuple::Vector(-4, 6, 8);
|
||||||
|
|
||||||
|
REQUIRE(transform * v == Tuple::Vector(-8, 18, 32));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
TEST_CASE("[04][TRANSFORMATION] Multiplying by the inverse of a scaling matrix", "[Matrix]")
|
||||||
|
{
|
||||||
|
Matrix transform = Matrix::scaling(2, 3, 4);
|
||||||
|
Matrix inv = transform.inverse();
|
||||||
|
Tuple v = Tuple::Vector(-4, 6, 8);
|
||||||
|
|
||||||
|
REQUIRE(inv * v == Tuple::Vector(-2, 2, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
TEST_CASE("[04][TRANSFORMATION] Reflection is scaling by a negative value", "[Matrix]")
|
||||||
|
{
|
||||||
|
Matrix transform = Matrix::scaling(-1, 1, 1);
|
||||||
|
Tuple p = Tuple::Point(2, 3, 4);
|
||||||
|
|
||||||
|
REQUIRE(transform * p == Tuple::Point(-2, 3, 4));
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user