From b3490b146ea7cc6ea4168d2c57c80617691fb729 Mon Sep 17 00:00:00 2001 From: NADAL Jean-Baptiste Date: Thu, 21 Mar 2024 19:10:01 +0100 Subject: [PATCH] [FEAT] Add cone --- README.md | 2 +- data/chapter_13.png | Bin 0 -> 88979 bytes raytracing/CMakeLists.txt | 1 + raytracing/include/raytracing.h | 1 + raytracing/src/shapes/cone.cpp | 210 +++++++++++++++++++++++++++++ raytracing/src/shapes/cone.h | 66 +++++++++ raytracing/src/shapes/cylinder.cpp | 7 +- tests/13_cylinders.cpp | 171 ++++++++++++++++++++++- 8 files changed, 453 insertions(+), 5 deletions(-) create mode 100644 data/chapter_13.png create mode 100644 raytracing/src/shapes/cone.cpp create mode 100644 raytracing/src/shapes/cone.h diff --git a/README.md b/README.md index eb03d70..fbdbe6a 100644 --- a/README.md +++ b/README.md @@ -33,4 +33,4 @@ The Web Site of the book: http://raytracerchallenge.com/ | Chapiter 12 | Chapiter 13 | Chapiter 14 | |:------------------------: | :---------------------------: | :----------------------------: | -|![12](data/chapter_12.png) | | | +|![12](data/chapter_12.png) | ![13](data/chapter_13.png) | | diff --git a/data/chapter_13.png b/data/chapter_13.png new file mode 100644 index 0000000000000000000000000000000000000000..fafb5e4bc3db1c44b47f6a2d187a982e480228ba GIT binary patch literal 88979 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 literal 0 HcmV?d00001 diff --git a/raytracing/CMakeLists.txt b/raytracing/CMakeLists.txt index 00e3d5b..8695024 100644 --- a/raytracing/CMakeLists.txt +++ b/raytracing/CMakeLists.txt @@ -34,6 +34,7 @@ add_library(raytracing src/renderer/ray.cpp src/renderer/world.cpp + src/shapes/cone.cpp src/shapes/cube.cpp src/shapes/cylinder.cpp src/shapes/plane.cpp diff --git a/raytracing/include/raytracing.h b/raytracing/include/raytracing.h index 957a28d..3aad06c 100644 --- a/raytracing/include/raytracing.h +++ b/raytracing/include/raytracing.h @@ -46,6 +46,7 @@ #include "renderer/ray.h" #include "renderer/world.h" +#include "shapes/cone.h" #include "shapes/cube.h" #include "shapes/cylinder.h" #include "shapes/plane.h" diff --git a/raytracing/src/shapes/cone.cpp b/raytracing/src/shapes/cone.cpp new file mode 100644 index 0000000..bec5de7 --- /dev/null +++ b/raytracing/src/shapes/cone.cpp @@ -0,0 +1,210 @@ +/*! + * cone.cpp + * + * Copyright (c) 2024, NADAL Jean-Baptiste. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * @Author: NADAL Jean-Baptiste + * @Date: 21/03/2024 + * + */ + +// This is an independent project of an individual developer. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++, C#, and Java: http://www.viva64.com + +/* ------------------------------------------------------------------------- */ + +#include + +#include "core/common.h" +#include "core/intersections.h" + +#include "cone.h" + +using namespace Raytracer; + +/* ------------------------------------------------------------------------- */ + +Intersections Cone::local_intersect(const Ray &a_ray) +{ + double the_a, the_b, the_c, the_discriminant; + double the_t0, the_t1; + double the_y0, the_y1; + Intersections the_intersections; + const Tuple &the_ray_direction = a_ray.direction(); + const Tuple &the_ray_origin = a_ray.origin(); + + the_a = std::pow(the_ray_direction.x(), 2) - std::pow(the_ray_direction.y(), 2) + std::pow(the_ray_direction.z(), 2); + the_b = 2 * the_ray_origin.x() * the_ray_direction.x() - + 2 * the_ray_origin.y() * the_ray_direction.y() + + 2 * the_ray_origin.z() * the_ray_direction.z(); + the_c = std::pow(the_ray_origin.x(), 2) - std::pow(the_ray_origin.y(), 2) + std::pow(the_ray_origin.z(), 2); + + if (double_equal(the_a, 0) && !double_equal(the_b, 0)) + { + double the_t = -the_c / (2 * the_b); + the_intersections.add(Intersection(the_t, this)); + } + + // Ray is parallel to the y axis + if (double_equal(the_a, 0) == false) + { + the_discriminant = std::pow(the_b, 2) - 4 * the_a * the_c; + + if (the_discriminant < 0) + { + return the_intersections; + } + + the_t0 = (-the_b - std::sqrt(the_discriminant)) / (2 * the_a); + the_t1 = (-the_b + std::sqrt(the_discriminant)) / (2 * the_a); + if (the_t0 > the_t1) + { + std::swap(the_t0, the_t1); + } + + the_y0 = the_ray_origin.y() + the_t0 * the_ray_direction.y(); + if ((m_minimum < the_y0) && (the_y0 < m_maximum)) + { + the_intersections.add(Intersection(the_t0, this)); + } + + the_y1 = the_ray_origin.y() + the_t1 * the_ray_direction.y(); + if ((m_minimum < the_y1) && (the_y1 < m_maximum)) + { + the_intersections.add(Intersection(the_t1, this)); + } + } + + // Caps + intersect_caps(a_ray, the_intersections); + + return the_intersections; +} + +/* ------------------------------------------------------------------------- */ + +Tuple Cone::local_normal_at(const Tuple &a_local_point) const +{ + + double the_distance, the_y; + // Compute the square of the distance from the y axis + the_distance = std::pow(a_local_point.x(), 2) + std::pow(a_local_point.z(), 2); + if ((the_distance < 1) && (a_local_point.y() >= m_maximum - kEpsilon)) + { + return Tuple::Vector(0, 1, 0); + } + else if ((the_distance < 1) && (a_local_point.y() <= m_minimum + kEpsilon)) + { + return Tuple::Vector(0, -1, 0); + } + + the_y = sqrt(the_distance); + if (a_local_point.y() > 0) + { + the_y = -the_y; + } + + return Tuple::Vector(a_local_point.x(), the_y, a_local_point.z()); +} + +/* ------------------------------------------------------------------------- */ + +double Cone::minimum(void) +{ + return m_minimum; +} + +/* ------------------------------------------------------------------------- */ + +void Cone::set_minimum(double a_value) +{ + m_minimum = a_value; +} + +/* ------------------------------------------------------------------------- */ + +double Cone::maximum(void) +{ + return m_maximum; +} + +/* ------------------------------------------------------------------------- */ + +void Cone::set_maximum(double a_value) +{ + m_maximum = a_value; +} + +/* ------------------------------------------------------------------------- */ + +bool Cone::closed(void) +{ + return m_closed; +} + +/* ------------------------------------------------------------------------- */ + +void Cone::set_closed(bool a_state) +{ + m_closed = a_state; +} + +/* ------------------------------------------------------------------------- */ + +bool Cone::check_cap(const Ray &a_ray, double a_distance_t, double an_y) +{ + double the_x, the_z; + + const Tuple &the_ray_direction = a_ray.direction(); + const Tuple &the_ray_origin = a_ray.origin(); + + the_x = the_ray_origin.x() + a_distance_t * the_ray_direction.x(); + the_z = the_ray_origin.z() + a_distance_t * the_ray_direction.z(); + + return (std::pow(the_x, 2) + std::pow(the_z, 2)) <= std::pow(an_y, 2); +} + +/* ------------------------------------------------------------------------- */ + +void Cone::intersect_caps(const Ray &a_ray, Intersections &an_xs) +{ + double the_distance_t; + const Tuple &the_ray_direction = a_ray.direction(); + + // Caps only matter if the cylinder is closed. and might possibility be intersected the ray. + if ((m_closed == false) or (double_equal(the_ray_direction.y(), 0))) + { + return; + } + + // Check for an intersection with the lower end cap by intersecting + // the ray with the plane at y = cyl.minimum + the_distance_t = (m_minimum - a_ray.origin().y()) / the_ray_direction.y(); + if (check_cap(a_ray, the_distance_t, m_minimum)) + { + an_xs.add(Intersection(the_distance_t, this)); + } + + // Check for an intersection with the upper end cap by intersecting + // the ray with the plane at y = cyl.maximum + the_distance_t = (m_maximum - a_ray.origin().y()) / the_ray_direction.y(); + if (check_cap(a_ray, the_distance_t, m_maximum)) + { + an_xs.add(Intersection(the_distance_t, this)); + } +} diff --git a/raytracing/src/shapes/cone.h b/raytracing/src/shapes/cone.h new file mode 100644 index 0000000..79df2b8 --- /dev/null +++ b/raytracing/src/shapes/cone.h @@ -0,0 +1,66 @@ +/*! + * cone.h + * + * Copyright (c) 2024, NADAL Jean-Baptiste. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * @Author: NADAL Jean-Baptiste + * @Date: 21/03/2024 + * + */ + +#ifndef _RAYTRACER_CONE_H +#define _RAYTRACER_CONE_H + +/* ------------------------------------------------------------------------- */ + +#include + +#include "shapes/shape.h" + +/* ------------------------------------------------------------------------- */ + +namespace Raytracer +{ + class Cone : public Shape + { + public: + Cone(void) = default; + Intersections local_intersect(const Ray &a_ray) override; + Tuple local_normal_at(const Tuple &a_local_point) const override; + + double minimum(void); + void set_minimum(double a_value); + + double maximum(void); + void set_maximum(double a_value); + + bool closed(void); + void set_closed(bool a_state); + + private: + bool check_cap(const Ray &a_ray, double a_distance_t, double an_y); + void intersect_caps(const Ray &a_ray, Intersections &an_xs); + + private: + double m_minimum = -std::numeric_limits::infinity(); + double m_maximum = std::numeric_limits::infinity(); + bool m_closed = false; + }; +}; // namespace Raytracer + +#endif // _RAYTRACER_CONE_H diff --git a/raytracing/src/shapes/cylinder.cpp b/raytracing/src/shapes/cylinder.cpp index f11dd5c..33df27f 100644 --- a/raytracing/src/shapes/cylinder.cpp +++ b/raytracing/src/shapes/cylinder.cpp @@ -173,16 +173,17 @@ bool Cylinder::check_cap(const Ray &a_ray, double a_distance_t) void Cylinder::intersect_caps(const Ray &a_ray, Intersections &an_xs) { double the_distance_t; + const Tuple &the_ray_direction = a_ray.direction(); // Caps only matter if the cylinder is closed. and might possibility be intersected the ray. - if ((m_closed == false) or (double_equal(a_ray.direction().y(), 0))) + if ((m_closed == false) or (double_equal(the_ray_direction.y(), 0))) { return; } // Check for an intersection with the lower end cap by intersecting // the ray with the plane at y = cyl.minimum - the_distance_t = (m_minimum - a_ray.origin().y()) / a_ray.direction().y(); + the_distance_t = (m_minimum - a_ray.origin().y()) / the_ray_direction.y(); if (check_cap(a_ray, the_distance_t)) { an_xs.add(Intersection(the_distance_t, this)); @@ -190,7 +191,7 @@ void Cylinder::intersect_caps(const Ray &a_ray, Intersections &an_xs) // Check for an intersection with the upper end cap by intersecting // the ray with the plane at y = cyl.maximum - the_distance_t = (m_maximum - a_ray.origin().y()) / a_ray.direction().y(); + the_distance_t = (m_maximum - a_ray.origin().y()) / the_ray_direction.y(); if (check_cap(a_ray, the_distance_t)) { an_xs.add(Intersection(the_distance_t, this)); diff --git a/tests/13_cylinders.cpp b/tests/13_cylinders.cpp index b53e09d..a82bfef 100644 --- a/tests/13_cylinders.cpp +++ b/tests/13_cylinders.cpp @@ -63,6 +63,16 @@ public: /* ------------------------------------------------------------------------- */ +class ConeTestConstrained +{ +public: + Tuple origin; + Tuple direction; + uint16_t count; +}; + +/* ------------------------------------------------------------------------- */ + SCENARIO("A Ray misses a cylinder", "[features/cylinders.feature]") { // | origin | direction | @@ -163,7 +173,7 @@ SCENARIO("Normal vector on a cylinder", "[features/cylinders.feature]") Cylinder cyl; WHEN("n <- local_normal_at(cyl,)") { - for (int i = 0; i < 3; i++) + for (int i = 0; i < 4; i++) { Tuple p = the_test[i].point; Tuple normal = cyl.local_normal_at(p); @@ -362,3 +372,162 @@ SCENARIO("The normal vector on the cylinder's end caps", "[features/cylinders.fe } } } + +/* ------------------------------------------------------------------------- */ + +SCENARIO("Intersecting a cone with a ray", "[features/cones.feature]") +{ + // | origin | direction | t0 | t1 | + // | point(0, 0, -5) | vector(0, 0, 1) | 5 | 5 | + // | point(0, 0, -5) | vector(1, 1, 1) | 8.66025 | 8.66025 | + // | point(1, 1, -5) | vector(-0.5, -1, 1) | 4.55006 | 49.44994 | + CylinderTestIntersect the_test[] = { + {Tuple::Point(0, 0, -5), Tuple::Vector(0, 0, 1), 5, 5}, + {Tuple::Point(0, 0, -5), Tuple::Vector(1, 1, 1), 8.66025, 8.66025}, + {Tuple::Point(1, 1, -5), Tuple::Vector(-0.5, -1, 1), 4.55006, 49.44994} + }; + GIVEN("shape <- cone()") + { + Cone shape; + AND_GIVEN("direction <- normalize()") + { + AND_GIVEN("r <- ray(, direction)") + { + WHEN("xs <- local_intersect(shape, r)") + { + for (int i = 0; i < 5; i++) + { + Tuple direction = the_test[i].direction.normalize(); + Ray r(the_test[i].origin, direction); + Intersections xs = shape.local_intersect(r); + THEN("xs.count = 2") + { + REQUIRE(xs.count() == 2); + } + AND_THEN("xs[0].t = ") + { + REQUIRE(xs[0].distance_t() == the_test[i].t0); + } + AND_THEN("xs[1].t = ") + { + REQUIRE(xs[1].distance_t() == the_test[i].t1); + } + } + } + } + } + } +} + +/* ------------------------------------------------------------------------- */ + +SCENARIO("Intersecting a cone with a ray parallel ton one of its halves", "[features/cones.feature]") +{ + GIVEN("shape <- cone()") + { + Cone shape; + AND_GIVEN("direction <- normalize(vector(0, 1, 1))") + { + Tuple direction = Tuple::Vector(0, 1, 1).normalize(); + AND_GIVEN("r <- ray(point(0, 0, -1), direction)") + { + Ray r(Tuple::Point(0, 0, -1), direction); + WHEN("xs <- local_intersect(shape, r)") + { + Intersections xs = shape.local_intersect(r); + THEN("xs.count = 1") + { + REQUIRE(xs.count() == 1); + } + AND_THEN("xs[0].t = 0.35355") + { + REQUIRE(double_equal(xs[0].distance_t(), 0.35355)); + } + } + } + } + } +} + +/* ------------------------------------------------------------------------- */ + +SCENARIO("Intersecting a cone's end caps", "[features/cones.feature]") +{ + // | origin | direction | count | + // | point(0, 0, -5) | vector(0, 1, 0) | 0 | + // | point(0, 0, -0.25) | vector(0, 1, 1) | 2 | + // | point(0, 0, -0.25) | vector(0, 1, 0) | 4 | + + ConeTestConstrained the_test[] = { + {Tuple::Point(0, 0, -5), Tuple::Vector(0, 1, 0), 0}, + {Tuple::Point(0, 0, -0.25), Tuple::Vector(0, 1, 1), 2}, + {Tuple::Point(0, 0, -0.25), Tuple::Vector(0, 1, 0), 4} + }; + GIVEN("shape <- cone()") + { + Cone shape; + AND_GIVEN("shape.minimum <- 0.5") + { + shape.set_minimum(0.5); + AND_GIVEN("shape.maximum <- 0.5") + { + shape.set_maximum(0.5); + AND_GIVEN("shape.closed <- true") + { + shape.set_closed(true); + AND_GIVEN("direction <- normalize()") + { + AND_GIVEN("r <- ray(, direction)") + { + WHEN("xs <- local_intersect(shape,r)") + { + for (int i = 0; i < 5; i++) + { + Tuple direction = the_test[i].direction.normalize(); + Ray r(the_test[i].origin, direction); + Intersections xs = shape.local_intersect(r); + THEN("xs.count = ") + { + REQUIRE(xs.count() == the_test[i].count); + } + } + } + } + } + } + } + } + } +} + +/* ------------------------------------------------------------------------- */ + +SCENARIO("Computing the normal vector on a cone", "[features/cones.feature]") +{ + // | point | normal | + // | point(0, 0, 0) | vector(0, 0, 0) | + // | point(1, 1, 1) | vector(1, -sqrt(2), 1) | + // | point(-1, -1, 0) | vector(-1, 1, 0) | + CylinderTestNormal the_test[] = { + { Tuple::Point(0, 0, 0), Tuple::Vector(0, 0, 0)}, + { Tuple::Point(1, 1, 1), Tuple::Vector(1, -sqrt(2), 1)}, + {Tuple::Point(-1, -1, 0), Tuple::Vector(-1, 1, 0)} + }; + + GIVEN("shape <- cone()") + { + Cone shape; + WHEN("n <- local_normal_at(shape, )") + { + for (int i = 0; i < 3; i++) + { + Tuple p = the_test[i].point; + Tuple normal = shape.local_normal_at(p); + THEN("n = ") + { + REQUIRE(normal == the_test[i].normal); + } + } + } + } +}