From 8bad2f48f1f04ca62a4c196ca80f386e1fcc37ab Mon Sep 17 00:00:00 2001 From: Tobias Frisch <tfrisch@uni-koblenz.de> Date: Fri, 7 Oct 2022 11:36:55 +0200 Subject: [PATCH] Add cylinder class Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de> --- modules/geometry/CMakeLists.txt | 4 ++ .../include/vkcv/geometry/Circular.hpp | 34 ++++++++++++++++ .../include/vkcv/geometry/Cylinder.hpp | 40 +++++++++++++++++++ .../geometry/include/vkcv/geometry/Sphere.hpp | 8 +--- .../geometry/src/vkcv/geometry/Circular.cpp | 17 ++++++++ .../geometry/src/vkcv/geometry/Cylinder.cpp | 36 +++++++++++++++++ modules/geometry/src/vkcv/geometry/Sphere.cpp | 10 +---- 7 files changed, 134 insertions(+), 15 deletions(-) create mode 100644 modules/geometry/include/vkcv/geometry/Circular.hpp create mode 100644 modules/geometry/include/vkcv/geometry/Cylinder.hpp create mode 100644 modules/geometry/src/vkcv/geometry/Circular.cpp create mode 100644 modules/geometry/src/vkcv/geometry/Cylinder.cpp diff --git a/modules/geometry/CMakeLists.txt b/modules/geometry/CMakeLists.txt index 183b7f4d..2345bca1 100644 --- a/modules/geometry/CMakeLists.txt +++ b/modules/geometry/CMakeLists.txt @@ -13,10 +13,14 @@ set(vkcv_geometry_sources ${vkcv_geometry_source}/vkcv/geometry/Geometry.cpp ${vkcv_geometry_include}/vkcv/geometry/Volume.hpp ${vkcv_geometry_source}/vkcv/geometry/Volume.cpp + ${vkcv_geometry_include}/vkcv/geometry/Circular.hpp + ${vkcv_geometry_source}/vkcv/geometry/Circular.cpp ${vkcv_geometry_include}/vkcv/geometry/Sphere.hpp ${vkcv_geometry_source}/vkcv/geometry/Sphere.cpp ${vkcv_geometry_include}/vkcv/geometry/Cuboid.hpp ${vkcv_geometry_source}/vkcv/geometry/Cuboid.cpp + ${vkcv_geometry_include}/vkcv/geometry/Cylinder.hpp + ${vkcv_geometry_source}/vkcv/geometry/Cylinder.cpp ) # adding source files to the project diff --git a/modules/geometry/include/vkcv/geometry/Circular.hpp b/modules/geometry/include/vkcv/geometry/Circular.hpp new file mode 100644 index 00000000..273a6136 --- /dev/null +++ b/modules/geometry/include/vkcv/geometry/Circular.hpp @@ -0,0 +1,34 @@ +#pragma once + +namespace vkcv::geometry { + + /** + * @addtogroup vkcv_geometry + * @{ + */ + + class Circular { + private: + float m_radius; + + public: + explicit Circular(float radius); + + Circular(const Circular& other) = default; + Circular(Circular&& other) = default; + + ~Circular() = default; + + Circular& operator=(const Circular& other) = default; + Circular& operator=(Circular&& other) = default; + + [[nodiscard]] + float getRadius() const; + + void setRadius(float radius); + + }; + + /** @} */ + +} \ No newline at end of file diff --git a/modules/geometry/include/vkcv/geometry/Cylinder.hpp b/modules/geometry/include/vkcv/geometry/Cylinder.hpp new file mode 100644 index 00000000..a0a2037b --- /dev/null +++ b/modules/geometry/include/vkcv/geometry/Cylinder.hpp @@ -0,0 +1,40 @@ +#pragma once + +#include "Circular.hpp" +#include "Volume.hpp" + +namespace vkcv::geometry { + + /** + * @addtogroup vkcv_geometry + * @{ + */ + + class Cylinder : public Volume, public Circular { + private: + float m_height; + + public: + Cylinder(const glm::vec3& position, float height, float radius); + + Cylinder(const Cylinder& other) = default; + Cylinder(Cylinder&& other) = default; + + ~Cylinder() = default; + + Cylinder& operator=(const Cylinder& other) = default; + Cylinder& operator=(Cylinder&& other) = default; + + [[nodiscard]] + float getHeight() const; + + void setHeight(float height); + + [[nodiscard]] + float distanceTo(const glm::vec3& point) override; + + }; + + /** @} */ + +} \ No newline at end of file diff --git a/modules/geometry/include/vkcv/geometry/Sphere.hpp b/modules/geometry/include/vkcv/geometry/Sphere.hpp index 8370d503..cf99d078 100644 --- a/modules/geometry/include/vkcv/geometry/Sphere.hpp +++ b/modules/geometry/include/vkcv/geometry/Sphere.hpp @@ -1,5 +1,6 @@ #pragma once +#include "Circular.hpp" #include "Volume.hpp" namespace vkcv::geometry { @@ -9,7 +10,7 @@ namespace vkcv::geometry { * @{ */ - class Sphere : public Volume { + class Sphere : public Volume, public Circular { private: float m_radius; @@ -24,11 +25,6 @@ namespace vkcv::geometry { Sphere& operator=(const Sphere& other) = default; Sphere& operator=(Sphere&& other) = default; - [[nodiscard]] - float getRadius() const; - - void setRadius(float radius); - [[nodiscard]] float distanceTo(const glm::vec3& point) override; diff --git a/modules/geometry/src/vkcv/geometry/Circular.cpp b/modules/geometry/src/vkcv/geometry/Circular.cpp new file mode 100644 index 00000000..21990406 --- /dev/null +++ b/modules/geometry/src/vkcv/geometry/Circular.cpp @@ -0,0 +1,17 @@ + +#include "vkcv/geometry/Circular.hpp" + +namespace vkcv::geometry { + + Circular::Circular(float radius) + : m_radius(radius) {} + + float Circular::getRadius() const { + return m_radius; + } + + void Circular::setRadius(float radius) { + m_radius = radius; + } + +} diff --git a/modules/geometry/src/vkcv/geometry/Cylinder.cpp b/modules/geometry/src/vkcv/geometry/Cylinder.cpp new file mode 100644 index 00000000..11ba3f25 --- /dev/null +++ b/modules/geometry/src/vkcv/geometry/Cylinder.cpp @@ -0,0 +1,36 @@ + +#include "vkcv/geometry/Cylinder.hpp" + +namespace vkcv::geometry { + + Cylinder::Cylinder(const glm::vec3 &position, float height, float radius) + : Volume(position), Circular(radius), m_height(height) {} + + float Cylinder::getHeight() const { + return m_height; + } + + void Cylinder::setHeight(float height) { + m_height = height; + } + + float Cylinder::distanceTo(const glm::vec3 &point) { + const auto& position = getPosition(); + + const auto verticalDistance = glm::abs(position.y - point.y) - getHeight(); + const auto circularDistance = glm::distance( + glm::vec2(position.x, position.z), + glm::vec2(point.x, point.z) + ) - getRadius(); + + if (circularDistance <= 0.0f) { + return glm::max(verticalDistance, circularDistance); + } else + if (verticalDistance <= 0.0f) { + return circularDistance; + } else { + return glm::length(glm::vec2(verticalDistance, circularDistance)); + } + } + +} diff --git a/modules/geometry/src/vkcv/geometry/Sphere.cpp b/modules/geometry/src/vkcv/geometry/Sphere.cpp index 5b32f72d..a4635306 100644 --- a/modules/geometry/src/vkcv/geometry/Sphere.cpp +++ b/modules/geometry/src/vkcv/geometry/Sphere.cpp @@ -4,15 +4,7 @@ namespace vkcv::geometry { Sphere::Sphere(const glm::vec3& position, float radius) - : Volume(position), m_radius(radius) {} - - float Sphere::getRadius() const { - return m_radius; - } - - void Sphere::setRadius(float radius) { - m_radius = radius; - } + : Volume(position), Circular(radius) {} float Sphere::distanceTo(const glm::vec3 &point) { return glm::distance(getPosition(), point) - getRadius(); -- GitLab