diff options
feat(Week09): Add solutions
2 files changed, 91 insertions, 0 deletions
| -rw-r--r-- | Week09/Exercise04/Rover.cpp | 64 | ||||
| -rw-r--r-- | Week09/Exercise04/Rover.h | 27 |
diff --git a/Week09/Exercise04/Rover.cpp b/Week09/Exercise04/Rover.cpp new file mode 100644 index 0000000..dc311c7 --- /dev/null +++ b/Week09/Exercise04/Rover.cpp @@ -0,0 +1,64 @@ +#include "Rover.h" +#include <cmath> + +// Използваме полярни координати, за да опишем посоките. +// С други думи, използваме ъгъл, такъв че (1,0) е на 0 градуса (радиана), +// (0,1) е на 90 градуса, (-1,0) е на 180 градуса и (0,-1) е на 270 градуса. +// Така ако знаем посоката напред, посоката на ляво е на 90 градуса обратно +// на часовниковата стрелка от ъгъла, който описва посоката "напред". +// Аналогично, посоката на ляво е на 90 градуса по часовниковата стрелка от +// ъгъла, който описва посоката "напред". + +void Rover::moveDistByAngle(double dist, double angle) { + // https://en.wikipedia.org/wiki/Polar_coordinate_system#Converting_between_polar_and_Cartesian_coordinates + this->x += dist * cos(angle); + this->y += dist * sin(angle); +} + +Rover::Rover() { + x = y = 0; + forward = M_PI_2; +} + +Rover& operator<(double dist, Rover& rover) { + rover.moveDistByAngle(dist, rover.forward + M_PI_2); + return rover; +} + +Rover& Rover::operator>(double dist) { + this->moveDistByAngle(dist, this->forward - M_PI_2); + return *this; +} + +Rover& Rover::operator^(double dist) { + this->moveDistByAngle(dist, this->forward); + return *this; +} + +Rover& operator<<(double degrees, Rover& rover) { + rover.forward += degrees / 180.0 * M_PI; + return rover; +} + +Rover& Rover::operator>>(double degrees) { + this->forward -= degrees / 180.0 * M_PI; + return *this; +} + +std::ostream& operator<<(std::ostream& ostr, const Rover& rover) { + double forwardUnitX = cos(rover.forward), forwardUnitY = sin(rover.forward); + ostr << "Rover at (" << rover.x << ',' << rover.y + << "), looking direction (" << forwardUnitX << ',' << forwardUnitY << ')' + << std::endl; + return ostr; +} + +std::istream& operator>>(std::istream& istr, Rover& rover) { + // Очакваме координат, който описва посоката "напред" + // Например (0,1) + double forwardUnitX, forwardUnitY; + istr >> rover.x >> rover.y >> forwardUnitX >> forwardUnitY; + // https://en.wikipedia.org/wiki/Polar_coordinate_system#Converting_between_polar_and_Cartesian_coordinates + rover.forward = atan2(forwardUnitY, forwardUnitX); + return istr; +} diff --git a/Week09/Exercise04/Rover.h b/Week09/Exercise04/Rover.h new file mode 100644 index 0000000..4286f06 --- /dev/null +++ b/Week09/Exercise04/Rover.h @@ -0,0 +1,27 @@ +#ifndef _ROVER +#define _ROVER + +#include <ostream> +#include <istream> + +class Rover { + double x; + double y; + double forward; + + void moveDistByAngle(double dist, double angle); + +public: + Rover(); + + friend Rover& operator<(double dist, Rover& rover); + Rover& operator>(double dist); + Rover& operator^(double dist); + friend Rover& operator<<(double degrees, Rover& rover); + Rover& operator>>(double degrees); + + friend std::ostream& operator<<(std::ostream& ostr, const Rover& rover); + friend std::istream& operator>>(std::istream& istr, Rover& rover); +}; + +#endif /* _ROVER */ |
