diff --git a/Coordinate.cpp b/Coordinate.cpp index 0c65c92..d8b1f26 100644 --- a/Coordinate.cpp +++ b/Coordinate.cpp @@ -1,11 +1,11 @@ #include "Coordinate.h" Coordinate::Coordinate() { - x = 0; - y = 0; + x = 0; + y = 0; } Coordinate::Coordinate(const double X, const double Y) { - x = X; - y = Y; + x = X; + y = Y; } \ No newline at end of file diff --git a/Coordinate.h b/Coordinate.h index 278c4dc..684e29d 100644 --- a/Coordinate.h +++ b/Coordinate.h @@ -1,12 +1,12 @@ #ifndef COORDINATE_H #define COORDINATE_H class Coordinate { - public: - Coordinate(); - Coordinate(const double X, const double Y); - - double x; - double y; + public: + Coordinate(); + Coordinate(const double X, const double Y); + + double x; + double y; }; #endif // COORDINATE_H diff --git a/EquilateralTriangle.cpp b/EquilateralTriangle.cpp index c77340f..52a66a0 100644 --- a/EquilateralTriangle.cpp +++ b/EquilateralTriangle.cpp @@ -1,12 +1,14 @@ #include "EquilateralTriangle.h" + #include "GeometryUtils.h" bool EquilateralTriangle::validate() { - double sideOne = calculate_distance(mVertices[0], mVertices[1]); - double sideTwo = calculate_distance(mVertices[1], mVertices[2]); - double sideThree = calculate_distance(mVertices[2], mVertices[0]); + double sideOne = calculate_distance(mVertices[0], mVertices[1]); + double sideTwo = calculate_distance(mVertices[1], mVertices[2]); + double sideThree = calculate_distance(mVertices[2], mVertices[0]); - // Equilateral triangles must (a) Be a triangle and (b) Have three equal sides - return lengths_make_triangle(sideOne, sideTwo, sideThree) - && (double_eq(sideOne, sideTwo) && double_eq(sideTwo, sideThree)); + // Equilateral triangles must (a) Be a triangle and (b) Have three equal + // sides + return lengths_make_triangle(sideOne, sideTwo, sideThree) && + (double_eq(sideOne, sideTwo) && double_eq(sideTwo, sideThree)); } \ No newline at end of file diff --git a/EquilateralTriangle.h b/EquilateralTriangle.h index ae4820c..8e5b2ea 100644 --- a/EquilateralTriangle.h +++ b/EquilateralTriangle.h @@ -2,8 +2,8 @@ #define EQUILATERAL_TRIANGLE_H #include "Triangle.h" class EquilateralTriangle : public ATriangle { - public: - bool validate() override; + public: + bool validate() override; }; #endif // EQUILATERAL_TRIANGLE_H diff --git a/GeometryUtils.cpp b/GeometryUtils.cpp index 868f89a..86e5acb 100644 --- a/GeometryUtils.cpp +++ b/GeometryUtils.cpp @@ -1,34 +1,33 @@ -#include - #include "GeometryUtils.h" -const double EPSILON = std::numeric_limits::epsilon(); +#include + +const double EPSILON = 1e-7; bool double_eq(double first, double second) { - if (std::abs(first - second) <= EPSILON) { - return true; - } else { - return false; - } + if (std::abs(first - second) <= EPSILON) { + return true; + } else { + return false; + } } -double calculate_distance(Coordinate& firstPoint, Coordinate& secondPoint) { - return std::sqrt( - std::pow(secondPoint.x - firstPoint.x, 2) - + std::pow(secondPoint.y - firstPoint.y, 2) - ); +double calculate_distance(Coordinate &firstPoint, Coordinate &secondPoint) { + return std::sqrt(std::pow(secondPoint.x - firstPoint.x, 2) + + std::pow(secondPoint.y - firstPoint.y, 2)); } bool lengths_make_triangle(double sideOne, double sideTwo, double sideThree) { - // Not a triangle if one of the side lengths is 0 - if (sideOne <= EPSILON || sideTwo <= EPSILON || sideThree <= EPSILON) { - return false; - } + // Not a triangle if one of the side lengths is 0 + if (sideOne <= 0 || sideTwo <= 0 || sideThree <= 0) { + return false; + } - // Not a triangle if the sum of any two side lengths >= the third length - if (sideOne + sideTwo <= sideThree || sideTwo + sideThree <= sideOne || sideThree + sideOne <= sideTwo) { - return false; - } + // Not a triangle if the sum of any two side lengths >= the third length + if (sideOne + sideTwo <= sideThree || sideTwo + sideThree <= sideOne || + sideThree + sideOne <= sideTwo) { + return false; + } - return true; + return true; } \ No newline at end of file diff --git a/GeometryUtils.h b/GeometryUtils.h index e0c93e7..2dd27aa 100644 --- a/GeometryUtils.h +++ b/GeometryUtils.h @@ -1,11 +1,13 @@ #ifndef GEOMETRY_UTILS_H #define GEOMETRY_UTILS_H #include "Coordinate.h" + #include /** - * @brief Compares two doubles to see if they are equal, within the system epsilon range - * + * @brief Compares two doubles to see if they are equal, within the system + * epsilon range + * * @param first The first value to compare * @param second The second value to compare * @return true The values are equal @@ -15,20 +17,21 @@ bool double_eq(double first, double second); /** * @brief Calculates the distance between two coordinate points - * + * * @param firstPoint The first coordinate point to calculate the distance of * @param secondPoint The second coordinate point to compare the first to * @return double The pythagorean distance between the two points */ -double calculate_distance(Coordinate& firstPoint, Coordinate& secondPoint); +double calculate_distance(Coordinate &firstPoint, Coordinate &secondPoint); /** - * @brief Returns true if all of the side lengths in the specified array make a triangle - * + * @brief Returns true if all of the side lengths in the specified array make a + * triangle + * * @param sideOne The first side to check for "triangle-ness" * @param sideTwo The second side to check for "triangle-ness" * @param sideThree The third side to check for "triangle-ness" - * + * * @return true The side lengths do make a geometrically sound triangle * @return false The side lengths do not make a geometrically sound triangle */ diff --git a/IsoscelesTriangle.cpp b/IsoscelesTriangle.cpp index e3bebf5..61fd1e6 100644 --- a/IsoscelesTriangle.cpp +++ b/IsoscelesTriangle.cpp @@ -1,12 +1,15 @@ #include "IsoscelesTriangle.h" + #include "GeometryUtils.h" bool IsoscelesTriangle::validate() { - double sideOne = calculate_distance(mVertices[0], mVertices[1]); - double sideTwo = calculate_distance(mVertices[1], mVertices[2]); - double sideThree = calculate_distance(mVertices[2], mVertices[0]); + double sideOne = calculate_distance(mVertices[0], mVertices[1]); + double sideTwo = calculate_distance(mVertices[1], mVertices[2]); + double sideThree = calculate_distance(mVertices[2], mVertices[0]); - // Isosceles triangles must (a) Be a triangle and (b) Have two sides that equal each other - return lengths_make_triangle(sideOne, sideTwo, sideThree) - && (double_eq(sideOne, sideTwo) || double_eq(sideTwo, sideThree) || double_eq(sideThree, sideOne)); + // Isosceles triangles must (a) Be a triangle and (b) Have two sides that + // equal each other + return lengths_make_triangle(sideOne, sideTwo, sideThree) && + (double_eq(sideOne, sideTwo) || double_eq(sideTwo, sideThree) || + double_eq(sideThree, sideOne)); } \ No newline at end of file diff --git a/IsoscelesTriangle.h b/IsoscelesTriangle.h index 3467a2c..bbbf327 100644 --- a/IsoscelesTriangle.h +++ b/IsoscelesTriangle.h @@ -2,8 +2,8 @@ #define ISOSCELES_TRIANGLE_H #include "Triangle.h" class IsoscelesTriangle : public ATriangle { - public: - bool validate() override; + public: + bool validate() override; }; #endif // ISOSCELES_TRIANGLE_H diff --git a/Makefile b/Makefile index ca84894..636b80c 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ SRC_FILES = main.cpp Coordinate.cpp Triangle.cpp Polygon.cpp ScaleneTriangle.cpp # Tyler's custom makefile extensions for CSCI200 (anyone can use these if they want) .DEFAULT_GOAL := all # Necessary so `make` doesn't run the "pack" target, as it is declared before "all" -.PHONY: pack clean-run c run fmt +.PHONY: pack clean-run c run fmt r ## Adds only the necessary files for build into a .tar.gz file, named appropriately ARCHIVED_FILES = Makefile $(SRC_FILES) $(SRC_FILES:.cpp=.h) $(SRC_FILES:.cpp=.hpp) @@ -25,6 +25,7 @@ c: clean ## Simply builds and then executes the program run: all ./$(TARGET) +r: run ## Formats all cpp, h, and hpp files with clang-format, using my personal clang-format config fmt: @@ -43,7 +44,7 @@ setup: setupsrc depend # NO EDITS NEEDED BELOW THIS LINE -CXX = g++ +CXX ?= g++ CXXFLAGS = -O2 CXXFLAGS_DEBUG = -g CXXFLAGS_WARN = -Wall -Wextra -Wunreachable-code -Wshadow -Wpedantic @@ -106,7 +107,7 @@ main.o: main.cpp Coordinate.h EquilateralTriangle.h Triangle.h Polygon.h \ IsoscelesTriangle.h Rhombus.h Quadrilateral.h ScaleneTriangle.h Coordinate.o: Coordinate.cpp Coordinate.h Triangle.o: Triangle.cpp Triangle.h Polygon.h Coordinate.h -Polygon.o: Polygon.cpp Coordinate.h Polygon.h +Polygon.o: Polygon.cpp Polygon.h Coordinate.h ScaleneTriangle.o: ScaleneTriangle.cpp ScaleneTriangle.h Triangle.h \ Polygon.h Coordinate.h GeometryUtils.h GeometryUtils.o: GeometryUtils.cpp GeometryUtils.h Coordinate.h diff --git a/Polygon.cpp b/Polygon.cpp index 51a7616..ee99b48 100644 --- a/Polygon.cpp +++ b/Polygon.cpp @@ -1,33 +1,30 @@ +#include "Polygon.h" + +#include "Coordinate.h" + #include #include -#include "Coordinate.h" -#include "Polygon.h" - APolygon::APolygon() { - _color = sf::Color::White; - mNumVertices = 0; - mVertices = nullptr; + _color = sf::Color::White; + mNumVertices = 0; + mVertices = nullptr; } -APolygon::~APolygon() { - delete[] mVertices; -} +APolygon::~APolygon() { delete[] mVertices; } -void APolygon::setColor(const sf::Color COLOR) { - _color = COLOR; -} +void APolygon::setColor(const sf::Color COLOR) { _color = COLOR; } -void APolygon::draw(sf::RenderTarget& window) { - sf::ConvexShape shape(mNumVertices); - for (int i = 0; i < mNumVertices; i++) { - shape.setPoint(i, sf::Vector2f(mVertices[i].x, mVertices[i].y)); - } - shape.setFillColor(_color); +void APolygon::draw(sf::RenderTarget &window) { + sf::ConvexShape shape(mNumVertices); + for (int i = 0; i < mNumVertices; i++) { + shape.setPoint(i, sf::Vector2f(mVertices[i].x, mVertices[i].y)); + } + shape.setFillColor(_color); - window.draw(shape); + window.draw(shape); } void APolygon::setCoordinate(const int IDX, const Coordinate COORD) { - mVertices[IDX] = COORD; + mVertices[IDX] = COORD; } diff --git a/Polygon.h b/Polygon.h index d5be762..d787846 100644 --- a/Polygon.h +++ b/Polygon.h @@ -1,51 +1,54 @@ #ifndef POLYGON_H #define POLYGON_H -#include - #include "Coordinate.h" -class APolygon { - public: - /** - * @brief Construct a new Polygon object, with a white color and 0 vertices - */ - APolygon(); - /** - * @brief Destroy the APolygon object - */ - virtual ~APolygon(); +#include - /** - * @brief Sets the color of this polygon - * - * @param COLOR The color to change the polygon to - */ - void setColor(const sf::Color COLOR); - /** - * @brief Draws this polygon to a SFML render target - * - * @param window The render target to draw the polygon on - */ - void draw(sf::RenderTarget& window); - /** - * @brief Sets the coordinate point at a specific vertex of this polygon - * - * @param IDX The index of the vertex to change - * @param COORD The coordinate location to set the vertex to - */ - void setCoordinate(const int IDX, const Coordinate COORD); - /** - * @brief Returns if the created polygon is valid or not - * - * @return true All of the vertices of the polygon line up with the current polygon type - * @return false The vertices are invalid for the current polygon type - */ - virtual bool validate() = 0; - protected: - short mNumVertices; - Coordinate* mVertices; - private: - sf::Color _color; +class APolygon { + public: + /** + * @brief Construct a new Polygon object, with a white color and 0 vertices + */ + APolygon(); + /** + * @brief Destroy the APolygon object + */ + virtual ~APolygon(); + + /** + * @brief Sets the color of this polygon + * + * @param COLOR The color to change the polygon to + */ + void setColor(const sf::Color COLOR); + /** + * @brief Draws this polygon to a SFML render target + * + * @param window The render target to draw the polygon on + */ + void draw(sf::RenderTarget &window); + /** + * @brief Sets the coordinate point at a specific vertex of this polygon + * + * @param IDX The index of the vertex to change + * @param COORD The coordinate location to set the vertex to + */ + void setCoordinate(const int IDX, const Coordinate COORD); + /** + * @brief Returns if the created polygon is valid or not + * + * @return true All of the vertices of the polygon line up with the current + * polygon type + * @return false The vertices are invalid for the current polygon type + */ + virtual bool validate() = 0; + + protected: + short mNumVertices; + Coordinate *mVertices; + + private: + sf::Color _color; }; #endif // POLYGON_H diff --git a/Quadrilateral.cpp b/Quadrilateral.cpp index d4e2aaa..2ad4532 100644 --- a/Quadrilateral.cpp +++ b/Quadrilateral.cpp @@ -1,7 +1,8 @@ #include "Quadrilateral.h" + #include "Coordinate.h" AQuadrilateral::AQuadrilateral() { - mNumVertices = 4; - mVertices = new Coordinate[4]; + mNumVertices = 4; + mVertices = new Coordinate[4]; } \ No newline at end of file diff --git a/Quadrilateral.h b/Quadrilateral.h index c7f2eeb..178445e 100644 --- a/Quadrilateral.h +++ b/Quadrilateral.h @@ -2,8 +2,8 @@ #define QUADRILATERAL_H #include "Polygon.h" class AQuadrilateral : public APolygon { - public: - AQuadrilateral(); + public: + AQuadrilateral(); }; #endif // QUADRILATERAL_H diff --git a/Rhombus.cpp b/Rhombus.cpp index fef4399..291c85c 100644 --- a/Rhombus.cpp +++ b/Rhombus.cpp @@ -1,26 +1,28 @@ #include "Rhombus.h" + #include "GeometryUtils.h" #include "IsoscelesTriangle.h" bool Rhombus::validate() { - double sideOne = calculate_distance(mVertices[0], mVertices[1]); - double sideTwo = calculate_distance(mVertices[1], mVertices[2]); - double sideThree = calculate_distance(mVertices[2], mVertices[3]); - double sideFour = calculate_distance(mVertices[3], mVertices[0]); + double sideOne = calculate_distance(mVertices[0], mVertices[1]); + double sideTwo = calculate_distance(mVertices[1], mVertices[2]); + double sideThree = calculate_distance(mVertices[2], mVertices[3]); + double sideFour = calculate_distance(mVertices[3], mVertices[0]); - IsoscelesTriangle firstTriangle; - firstTriangle.setCoordinate(0, mVertices[0]); - firstTriangle.setCoordinate(1, mVertices[1]); - firstTriangle.setCoordinate(2, mVertices[2]); + IsoscelesTriangle firstTriangle; + firstTriangle.setCoordinate(0, mVertices[0]); + firstTriangle.setCoordinate(1, mVertices[1]); + firstTriangle.setCoordinate(2, mVertices[2]); - IsoscelesTriangle secondTriangle; - secondTriangle.setCoordinate(0, mVertices[0]); - secondTriangle.setCoordinate(1, mVertices[2]); - secondTriangle.setCoordinate(2, mVertices[3]); + IsoscelesTriangle secondTriangle; + secondTriangle.setCoordinate(0, mVertices[0]); + secondTriangle.setCoordinate(1, mVertices[2]); + secondTriangle.setCoordinate(2, mVertices[3]); - // A valid rhombus must (a) Have vertices (0, 1, 2) make a valid isosceles triangle, - // (b) Have vertices (0, 2, 3) make a valid isosceles triangle, and (c) Have all - // sides of equal length - return firstTriangle.validate() && secondTriangle.validate() - && (double_eq(sideOne, sideTwo) && double_eq(sideTwo, sideThree) && double_eq(sideThree, sideFour)); + // A valid rhombus must (a) Have vertices (0, 1, 2) make a valid isosceles + // triangle, (b) Have vertices (0, 2, 3) make a valid isosceles triangle, + // and (c) Have all sides of equal length + return firstTriangle.validate() && secondTriangle.validate() && + (double_eq(sideOne, sideTwo) && double_eq(sideTwo, sideThree) && + double_eq(sideThree, sideFour)); } \ No newline at end of file diff --git a/Rhombus.h b/Rhombus.h index 926f127..81c49f6 100644 --- a/Rhombus.h +++ b/Rhombus.h @@ -2,8 +2,8 @@ #define RHOMBUS_H #include "Quadrilateral.h" class Rhombus : public AQuadrilateral { - public: - bool validate() override; + public: + bool validate() override; }; #endif // RHOMBUS_H diff --git a/ScaleneTriangle.cpp b/ScaleneTriangle.cpp index e0740e4..ec969be 100644 --- a/ScaleneTriangle.cpp +++ b/ScaleneTriangle.cpp @@ -1,12 +1,15 @@ #include "ScaleneTriangle.h" + #include "GeometryUtils.h" bool ScaleneTriangle::validate() { - double sideOne = calculate_distance(mVertices[0], mVertices[1]); - double sideTwo = calculate_distance(mVertices[1], mVertices[2]); - double sideThree = calculate_distance(mVertices[2], mVertices[0]); + double sideOne = calculate_distance(mVertices[0], mVertices[1]); + double sideTwo = calculate_distance(mVertices[1], mVertices[2]); + double sideThree = calculate_distance(mVertices[2], mVertices[0]); - // Scalene triangles must (a) Be a triangle and (b) Have no sides that equal each other - return lengths_make_triangle(sideOne, sideTwo, sideThree) - && (!double_eq(sideOne, sideTwo) && !double_eq(sideTwo, sideThree) && !double_eq(sideThree, sideOne)); + // Scalene triangles must (a) Be a triangle and (b) Have no sides that equal + // each other + return lengths_make_triangle(sideOne, sideTwo, sideThree) && + (!double_eq(sideOne, sideTwo) && !double_eq(sideTwo, sideThree) && + !double_eq(sideThree, sideOne)); } \ No newline at end of file diff --git a/ScaleneTriangle.h b/ScaleneTriangle.h index fb6b190..f9b6123 100644 --- a/ScaleneTriangle.h +++ b/ScaleneTriangle.h @@ -2,8 +2,8 @@ #define SCALENE_TRIANGLE_H #include "Triangle.h" class ScaleneTriangle : public ATriangle { - public: - bool validate() override; + public: + bool validate() override; }; #endif // SCALENE_TRIANGLE_H diff --git a/Triangle.cpp b/Triangle.cpp index 616fa7e..b3ffd3c 100644 --- a/Triangle.cpp +++ b/Triangle.cpp @@ -1,6 +1,6 @@ #include "Triangle.h" ATriangle::ATriangle() { - mNumVertices = 3; - mVertices = new Coordinate[3]; + mNumVertices = 3; + mVertices = new Coordinate[3]; } \ No newline at end of file diff --git a/Triangle.h b/Triangle.h index 0eb0536..7f919cc 100644 --- a/Triangle.h +++ b/Triangle.h @@ -2,8 +2,8 @@ #define TRIANGLE_H #include "Polygon.h" class ATriangle : public APolygon { - public: - ATriangle(); + public: + ATriangle(); }; #endif // TRIANGLE_H diff --git a/main.cpp b/main.cpp index b05d4f7..d575d8d 100644 --- a/main.cpp +++ b/main.cpp @@ -14,6 +14,7 @@ #include #include +#include #include @@ -32,10 +33,10 @@ int main(void) { return 1; } - std::vector polygonList; - APolygon *currentPolygon; + std::vector> polygonList; + std::unique_ptr currentPolygon; char type; - double x1, y1, x2, y2, x3, y3, x4, y4; + double x1, y1, x2, y2, x3, y3, x4 = -1, y4 = -1; int r, g, b; while (true) { @@ -51,16 +52,16 @@ int main(void) { switch (type) { case 'S': - currentPolygon = new ScaleneTriangle; + currentPolygon = std::make_unique(); break; case 'I': - currentPolygon = new IsoscelesTriangle; + currentPolygon = std::make_unique(); break; case 'E': - currentPolygon = new EquilateralTriangle; + currentPolygon = std::make_unique(); break; case 'R': - currentPolygon = new Rhombus; + currentPolygon = std::make_unique(); break; default: std::cout << "polygon is invalid - \"" << type << " " << x1 @@ -80,16 +81,21 @@ int main(void) { if (!currentPolygon->validate()) { std::cout << "polygon is invalid - \"" << type << " " << x1 << " " - << y1 << " " << x2 << " " << y2 << " " << x3 << " " << y3 - << " " << x4 << " " << y4 << " " << r << " " << g << " " - << b << "\"" << std::endl; + << y1 << " " << x2 << " " << y2 << " " << x3 << " " << y3; + if (x4 != -1) { + std::cout << " " << x4 << " " << y4; + } + std::cout << " " << r << " " << g << " " << b << "\"" << std::endl; } else { polygonList.push_back(currentPolygon); } }; // Start SFML Rendering logic - sf::RenderWindow window( sf::VideoMode(640, 640), ":3" ); + sf::RenderWindow window( + sf::VideoMode(640, 640), ":3", + sf::Style::Titlebar | sf::Style::Close // Disable window resize + ); window.setVerticalSyncEnabled(true); sf::Event event;