#ifndef GAME_H #define GAME_H #include #include #include "input/Keys.h" #include "rendering/Renderer.h" struct Point { bool operator<(const Point& other) const; float distance(const Point& other) const; float x; float y; }; class Game final { public: Game(Keys& control, const char* file, bool steps); void tick(); void render(float lag, Renderer& renderer) const; bool isRunning() const; private: enum State { SPLIT, MERGE, FIND_LOWER_TANGENT, FIND_UPPER_TANGENT, FINALIZE_MERGE, END }; bool isLowerTangent(const std::vector& hull) const; bool isUpperTangent(const std::vector& hull) const; bool findLowerTangent(); bool findUpperTangent(); int findMaxX(const std::vector& hull) const; int findMinX(const std::vector& hull) const; float det(const Point& a, const Point& b, const Point& c) const; void split(); bool merge(); void finalizeMerge(); void next(); void renderGroup(Renderer& renderer, const std::vector& hull, uint color) const; void skip(); float normalizeX(float f) const; float normalizeY(float f) const; Keys& keys; int keyNext; std::vector data; std::vector convexHull; int active; std::deque> groups[2]; State state; std::vector hullA; std::vector hullB; int lowerIndexA; int lowerIndexB; int upperIndexA; int upperIndexB; float minX; float maxX; float minY; float maxY; }; #endif