Add function to calculate sphere normal vector on given point on the sphere.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user