diff --git a/course/.gitignore b/course/.gitignore new file mode 100644 index 0000000..046c078 --- /dev/null +++ b/course/.gitignore @@ -0,0 +1,2 @@ +/build +/.vscode diff --git a/course/.vscode/c_cpp_properties.json b/course/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..ee202d8 --- /dev/null +++ b/course/.vscode/c_cpp_properties.json @@ -0,0 +1,16 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/**" + ], + "defines": [], + "compilerPath": "/usr/bin/clang", + "cStandard": "c11", + "cppStandard": "c++17", + "intelliSenseMode": "clang-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/course/CMakeLists.txt b/course/CMakeLists.txt index 3c19060..04d589c 100644 --- a/course/CMakeLists.txt +++ b/course/CMakeLists.txt @@ -16,6 +16,7 @@ include_directories( # Library sources. set(LIBRARY_SOURCES src/foo.cc + src/Vector3.cc ) # Library creation. diff --git a/course/include/Vector3.h b/course/include/Vector3.h new file mode 100644 index 0000000..1d21c7b --- /dev/null +++ b/course/include/Vector3.h @@ -0,0 +1,67 @@ +#pragma once +#include +#include "math.h" + +namespace ekumen +{ + +class Vector3 +{ +public: + explicit Vector3(); + explicit Vector3(const double x, const double y, const double z); + Vector3(const std::initializer_list &list); + + double x() const {return values[0];} + double &x() {return values[0];} + + double y() const { return values[1]; } + double &y() {return values[1];} + + double z() const { return values[2]; } + double &z() {return values[2];} + + + + double norm() const; + double dot(const Vector3 &q) const; + Vector3 cross(const Vector3 &q) const; + //operator overload + const double& operator[](const int index) const; + double& operator[](const int index); + + + Vector3 &operator+=(const Vector3 q); + Vector3 &operator-=(const Vector3 q); + + + friend Vector3 operator*(const double &cte, const Vector3 &p); + friend Vector3 operator*(const Vector3 &p, const double &cte); + friend Vector3 operator*(const Vector3 &p, const Vector3 &q); + friend Vector3 operator/(const Vector3 &p, const Vector3 &q); + + friend bool operator==(const Vector3 &p, const Vector3 &q); + friend bool operator==(const Vector3 &p, const std::initializer_list &list); + + friend bool operator!=(const Vector3 &p, const Vector3 &q); + friend bool operator!=(const Vector3 &p, const std::initializer_list &list); + + friend std::ostream &operator<<(std::ostream &os, const Vector3 &p); + + + static const Vector3 kUnitX; + static const Vector3 kUnitY; + static const Vector3 kUnitZ; + static const Vector3 kZero; + +private: + + double *values = new double[3]; + +}; + +Vector3 operator+(Vector3 p, Vector3 q); +Vector3 operator-(Vector3 p, Vector3 q); + + +} // namespace ekumen diff --git a/course/include/isometry.h b/course/include/isometry.h new file mode 100644 index 0000000..3a3502e --- /dev/null +++ b/course/include/isometry.h @@ -0,0 +1,5 @@ +#pragma once +namespace cppcourse { + + +} // cppcourse diff --git a/course/src/Vector3.cc b/course/src/Vector3.cc new file mode 100644 index 0000000..e0bad76 --- /dev/null +++ b/course/src/Vector3.cc @@ -0,0 +1,156 @@ +#include "Vector3.h" + +namespace ekumen +{ + +Vector3::Vector3(const double x, const double y, const double z) +{ + values[0] = x; + values[1] = y; + values[2] = z; +} +Vector3::Vector3() +{ + values[0] = 0.; + values[1] = 0.; + values[2] = 0.; +} +Vector3::Vector3(const std::initializer_list &list){ + values[0] = *(list.begin() + 0); + values[1] = *(list.begin() + 1); + values[2] = *(list.begin() + 2); +} +double Vector3::norm() const +{ + return sqrt(dot(Vector3(x(), y(), z()))); +} + +double Vector3::dot(const Vector3 &q) const +{ + return ((values[0] * q.x()) + (values[1] * q.y()) + (values[2] * q.z())); +} + +Vector3 Vector3::cross(const Vector3 &q) const +{ + Vector3 r; + r.x() = values[1] * q.z() - values[2] * q.y(); + r.y() = values[2] * q.x() - values[0] * q.z(); + r.z() = values[0] * q.y() - values[1] * q.x(); + return (r); +} + +Vector3 &Vector3::operator+=(const Vector3 q){ + x() += q.x(); + y() += q.y(); + z() += q.z(); + return *this; +} + +Vector3 &Vector3::operator-=(const Vector3 q){ + x() -= q.x(); + y() -= q.y(); + z() -= q.z(); + return *this; +} + +Vector3 operator+(Vector3 p, Vector3 q) +{ + Vector3 r; + r.x() = p.x(); + r.y() = p.y(); + r.z() = p.z(); + return (r+=q); +} + +Vector3 operator-(Vector3 p, Vector3 q) +{ + Vector3 r; + r.x() = p.x(); + r.y() = p.y(); + r.z() = p.z(); + return (r-=q); +} + +Vector3 operator*(const double &cte, const Vector3 &p) +{ + Vector3 res(cte * p.x(), cte * p.y(), cte * p.z()); + return res; +} + +Vector3 operator*(const Vector3 &p, const double &cte) +{ + Vector3 res(cte * p.x(), cte * p.y(), cte * p.z()); + return res; +} + +Vector3 operator*(const Vector3 &p, const Vector3 &q) +{ + Vector3 res(p.x() * q.x(), p.y() * q.y(), p.z() * q.z()); + return res; +} + +Vector3 operator/(const Vector3 &p, const Vector3 &q) +{ + Vector3 res(p.x() / q.x(), p.y() / q.y(), p.z() / q.z()); + return res; +} + +bool operator==(const Vector3 &p, const Vector3 &q) +{ + bool res = (p.x() == q.x()) && (p.y() == q.y()) && (p.z() == q.z()); + return res; +} + +bool operator==(const Vector3 &p, const std::initializer_list &list){ + bool res = (p.x() == *(list.begin() + 0)) && (p.y() == *(list.begin() + 1)) && (p.z() == *(list.begin() + 2)); + return res; +} + +bool operator!=(const Vector3 &p, const Vector3 &q) +{ + + return (!(p == q)); +} + +bool operator!=(const Vector3 &p, const std::initializer_list &list){ + Vector3 q(*(list.begin() + 0),*(list.begin() + 1),*(list.begin() + 2)); +return (!(p == q)); + +} + +std::ostream &operator<<(std::ostream &os, const Vector3 &p) +{ + os << "(x: " << p.x() << ", y: " << p.y() << ", z: " << p.z() << ")"; + return os; +} + +const double &Vector3::operator[](const int index) const +{ + try + { + return values[index]; + } + catch (const std::exception &ex) + { + std::cerr << "Error occurred: " << ex.what() << std::endl; + } +} + +double &Vector3::operator[](const int index) +{ + try + { + return values[index]; + } + catch (const std::exception &ex) + { + std::cerr << "Error occurred: " << ex.what() << std::endl; + } +} + +const Vector3 Vector3::kUnitX = Vector3(1., 0., 0.); +const Vector3 Vector3::kUnitY = Vector3(0., 1., 0.); +const Vector3 Vector3::kUnitZ = Vector3(0., 0., 1.); +const Vector3 Vector3::kZero = Vector3(0., 0., 0.); + +} // namespace ekumen diff --git a/course/test/CMakeLists.txt b/course/test/CMakeLists.txt index 59f8ec6..395fb77 100644 --- a/course/test/CMakeLists.txt +++ b/course/test/CMakeLists.txt @@ -39,7 +39,7 @@ macro (cppcourse_build_tests) add_executable(${BINARY_NAME} ${GTEST_SOURCE_file}) add_dependencies(${BINARY_NAME} - foo + foo gtest gtest_main ) diff --git a/course/test/src/CMakeLists.txt b/course/test/src/CMakeLists.txt index 57f4acd..a7f926e 100644 --- a/course/test/src/CMakeLists.txt +++ b/course/test/src/CMakeLists.txt @@ -5,6 +5,7 @@ include_directories( # Test sources. set (GTEST_SOURCES + isometry_TEST.cc foo_TEST.cc ) diff --git a/course/test/src/isometry_TEST.cc b/course/test/src/isometry_TEST.cc index 974b169..53a5bc7 100644 --- a/course/test/src/isometry_TEST.cc +++ b/course/test/src/isometry_TEST.cc @@ -3,26 +3,27 @@ // needed to implement an isometry. // Consider including other header files if needed. -#include "isometry.h" - +//#include "isometry.h" +#include "Vector3.h" #include #include #include +#include #include "gtest/gtest.h" namespace ekumen { namespace math { +namespace cppcourse { namespace test { namespace { - GTEST_TEST(Vector3Test, Vector3Operations) { const double kTolerance{1e-12}; const Vector3 p{1., 2., 3.}; const Vector3 q{4., 5., 6.}; - EXPECT_EQ(p + q, {5., 7., 9.}); - EXPECT_EQ(p - q, {-3., -3., -3.}); + EXPECT_EQ(p + q, std::initializer_list({5., 7., 9.})); + EXPECT_EQ(p - q, std::initializer_list({-3., -3., -3.})); EXPECT_EQ(p * 2., Vector3(2., 4., 6)); EXPECT_EQ(2 * q, Vector3(8., 10., 12.)); EXPECT_EQ(p * q, Vector3(4., 10., 18.)); @@ -40,8 +41,8 @@ GTEST_TEST(Vector3Test, Vector3Operations) { EXPECT_EQ(ss.str(), "(x: 1, y: 2, z: 3)"); EXPECT_TRUE(Vector3::kUnitX == Vector3(1., 0., 0)); - EXPECT_TRUE(Vector3::kUnitX != {1., 1., 0}); - EXPECT_TRUE(Vector3::kUnitY == {0., 1., 0}); + EXPECT_TRUE(Vector3::kUnitX != std::initializer_list({1., 1., 0})); + EXPECT_TRUE(Vector3::kUnitY == std::initializer_list({0., 1., 0})); EXPECT_TRUE(Vector3::kUnitZ == Vector3::kUnitX.cross(Vector3::kUnitY)); EXPECT_NEAR(Vector3::kUnitX.dot(Vector3::kUnitZ), 0., kTolerance); @@ -53,6 +54,7 @@ GTEST_TEST(Vector3Test, Vector3Operations) { EXPECT_EQ(t, p); } +/* GTEST_TEST(Matrix3Test, Matrix3Operations) { const double kTolerance{1e-12}; Matrix3 m1{{1., 2., 3.}, {4., 5., 6.}, {7., 8., 9.}}; @@ -96,7 +98,9 @@ GTEST_TEST(Matrix3Test, Matrix3Operations) { ASSERT_TRUE(found); } } +*/ +/* GTEST_TEST(IsometryTest, IsometryOperations) { const double kTolerance{1e-12}; const Isometry t1 = Isometry::FromTranslation({1., 2., 3.}); @@ -129,9 +133,10 @@ GTEST_TEST(IsometryTest, IsometryOperations) { ss << t5; EXPECT_EQ(ss.str(), "[T: (x: 0, y: 0, z: 0), R:[[0.923879533, -0.382683432, 0], [0.382683432, 0.923879533, 0], [0, 0, 1]]]"); } - -} // namespace +*/ +} } // namespace test +} // namespace cppcourse } // namespace math } // namespace ekumen