Add function to calculate sphere normal vector on given point on the sphere.

This commit is contained in:
Godzil
2020-02-17 15:39:14 +00:00
parent 656ff52204
commit a8194169c5
5 changed files with 92 additions and 0 deletions

View File

@@ -105,4 +105,76 @@ TEST(SphereTest, Intersecting_a_translated_sphere_with_a_ray)
Intersect xs = s.intersect(r);
ASSERT_EQ(xs.count(), 0);
}
TEST(SphereTest, The_normal_on_a_sphere_at_a_point_on_the_X_axis)
{
Sphere s = Sphere();
Tuple n = s.normalAt(Point(1, 0, 0));
ASSERT_EQ(n, Vector(1, 0, 0));
}
TEST(SphereTest, The_normal_on_a_sphere_at_a_point_on_the_Y_axis)
{
Sphere s = Sphere();
Tuple n = s.normalAt(Point(0, 1, 0));
ASSERT_EQ(n, Vector(0, 1, 0));
}
TEST(SphereTest, The_normal_on_a_sphere_at_a_point_on_the_Z_axis)
{
Sphere s = Sphere();
Tuple n = s.normalAt(Point(0, 0, 1));
ASSERT_EQ(n, Vector(0, 0, 1));
}
TEST(SphereTest, The_normal_on_a_sphere_at_a_nonaxial_point)
{
Sphere s = Sphere();
Tuple n = s.normalAt(Point(sqrt(3)/3, sqrt(3)/3, sqrt(3)/3));
ASSERT_EQ(n, Vector(sqrt(3)/3, sqrt(3)/3, sqrt(3)/3));
}
TEST(SphereTest, The_normal_is_a_normalise_vector)
{
Sphere s = Sphere();
Tuple n = s.normalAt(Point(sqrt(3)/3, sqrt(3)/3, sqrt(3)/3));
ASSERT_EQ(n, n.normalise());
}
TEST(SphereTest, Computing_the_normal_on_a_translated_sphere)
{
Sphere s = Sphere();
s.setTransform(translation(0, 1, 0));
Tuple n = s.normalAt(Point(0, 1.70711, -0.70711));
set_equal_precision(0.0001);
ASSERT_EQ(n, Vector(0, 0.70711, -0.70711));
/* Revert to default */
set_equal_precision(FLT_EPSILON);
}
TEST(SphereTest, Computing_the_normal_on_a_tranformed_sphere)
{
Sphere s = Sphere();
s.setTransform(scaling(1, 0.5, 1) * rotation_z(M_PI / 5));
Tuple n = s.normalAt(Point(0, sqrt(2)/2, -sqrt(2)/2));
set_equal_precision(0.0001);
ASSERT_EQ(n, Vector(0, 0.97014, -0.24254));
/* Revert to default */
set_equal_precision(FLT_EPSILON);
}