Initial publish

Dependencies:   mbed

Fork of el17dg by Dmitrijs Griskovs

Committer:
Noximilien
Date:
Tue May 07 15:22:35 2019 +0000
Revision:
40:e3bbda7444fa
The Final, Submission Version. I have read and agreed to the academic integrity. SID:201160286

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Noximilien 40:e3bbda7444fa 1 #ifndef COLLISION_LIB_H
Noximilien 40:e3bbda7444fa 2 #define COLLISION_LIB_H
Noximilien 40:e3bbda7444fa 3
Noximilien 40:e3bbda7444fa 4 #include <math.h>
Noximilien 40:e3bbda7444fa 5
Noximilien 40:e3bbda7444fa 6 /**
Noximilien 40:e3bbda7444fa 7 * @struct Point
Noximilien 40:e3bbda7444fa 8 * @brief Position or vector on the screen. Supports basic vector arithmetics.
Noximilien 40:e3bbda7444fa 9 */
Noximilien 40:e3bbda7444fa 10 struct Point {
Noximilien 40:e3bbda7444fa 11 /*@{*/
Noximilien 40:e3bbda7444fa 12 int x; /**< the x position */
Noximilien 40:e3bbda7444fa 13 int y; /**< the y position */
Noximilien 40:e3bbda7444fa 14 /** Default constructor */
Noximilien 40:e3bbda7444fa 15 Point() : x(0), y(0) {}
Noximilien 40:e3bbda7444fa 16 /** Constructor with x and y parameters */
Noximilien 40:e3bbda7444fa 17 Point(int _x, int _y) : x(_x), y(_y) {}
Noximilien 40:e3bbda7444fa 18
Noximilien 40:e3bbda7444fa 19 /**
Noximilien 40:e3bbda7444fa 20 * @brief Vector addition.
Noximilien 40:e3bbda7444fa 21 */
Noximilien 40:e3bbda7444fa 22 Point operator+ (const Point& rhs) const {
Noximilien 40:e3bbda7444fa 23 Point result(x + rhs.x, y + rhs.y);
Noximilien 40:e3bbda7444fa 24 return result;
Noximilien 40:e3bbda7444fa 25 }
Noximilien 40:e3bbda7444fa 26
Noximilien 40:e3bbda7444fa 27 /**
Noximilien 40:e3bbda7444fa 28 * @brief Vector substraction.
Noximilien 40:e3bbda7444fa 29 */
Noximilien 40:e3bbda7444fa 30 Point operator- (const Point& rhs) const {
Noximilien 40:e3bbda7444fa 31 Point result(x - rhs.x, y - rhs.y);
Noximilien 40:e3bbda7444fa 32 return result;
Noximilien 40:e3bbda7444fa 33 }
Noximilien 40:e3bbda7444fa 34
Noximilien 40:e3bbda7444fa 35 /**
Noximilien 40:e3bbda7444fa 36 * @brief Length of vector squared.
Noximilien 40:e3bbda7444fa 37 */
Noximilien 40:e3bbda7444fa 38 int lengthSquared() {
Noximilien 40:e3bbda7444fa 39 return x * x + y * y;
Noximilien 40:e3bbda7444fa 40 }
Noximilien 40:e3bbda7444fa 41 };
Noximilien 40:e3bbda7444fa 42
Noximilien 40:e3bbda7444fa 43 /**
Noximilien 40:e3bbda7444fa 44 * CicleBounds Class
Noximilien 40:e3bbda7444fa 45 * @brief Class to define object's bounds as a circle with center(e.g. offset).
Noximilien 40:e3bbda7444fa 46 * @author Dmitrijs Griskovs
Noximilien 40:e3bbda7444fa 47 * @date 15/04/2019
Noximilien 40:e3bbda7444fa 48 */
Noximilien 40:e3bbda7444fa 49 class CircleBounds {
Noximilien 40:e3bbda7444fa 50 public:
Noximilien 40:e3bbda7444fa 51 /** Default constructor */
Noximilien 40:e3bbda7444fa 52 CircleBounds() {};
Noximilien 40:e3bbda7444fa 53 /** Constructor with center and radius parameters */
Noximilien 40:e3bbda7444fa 54 CircleBounds(Point _center, float _radius): center(_center), radius(_radius) {};
Noximilien 40:e3bbda7444fa 55 Point center;
Noximilien 40:e3bbda7444fa 56 float radius;
Noximilien 40:e3bbda7444fa 57 };
Noximilien 40:e3bbda7444fa 58
Noximilien 40:e3bbda7444fa 59 /**
Noximilien 40:e3bbda7444fa 60 * @brief Determines whether the two circles collide.
Noximilien 40:e3bbda7444fa 61 * @details the function takes in position and circle bounds (center and radius)
Noximilien 40:e3bbda7444fa 62 * of two objects and returns wether they collided.
Noximilien 40:e3bbda7444fa 63 *
Noximilien 40:e3bbda7444fa 64 * @param pos_a positon of x and y of the first object. (const Point&).
Noximilien 40:e3bbda7444fa 65 * @param bounds_a center point and radius of the first object. (const CircleBounds&).
Noximilien 40:e3bbda7444fa 66 * @param pos_b positon of x and y of the second object. (const Point&).
Noximilien 40:e3bbda7444fa 67 * @param bounds_b center point and radius of the second object. (const CircleBounds&).
Noximilien 40:e3bbda7444fa 68 * @return true if the two circles overlap.
Noximilien 40:e3bbda7444fa 69 */
Noximilien 40:e3bbda7444fa 70 inline bool circleCollideTwoObjects(
Noximilien 40:e3bbda7444fa 71 const Point& pos_a, const CircleBounds& bounds_a,
Noximilien 40:e3bbda7444fa 72 const Point& pos_b, const CircleBounds& bounds_b
Noximilien 40:e3bbda7444fa 73 ) {
Noximilien 40:e3bbda7444fa 74 Point center_a = pos_a + bounds_a.center;
Noximilien 40:e3bbda7444fa 75 Point center_b = pos_b + bounds_b.center;
Noximilien 40:e3bbda7444fa 76 Point difference = center_a - center_b;
Noximilien 40:e3bbda7444fa 77 return difference.lengthSquared() <= pow(bounds_a.radius + bounds_b.radius, 2);
Noximilien 40:e3bbda7444fa 78 }
Noximilien 40:e3bbda7444fa 79
Noximilien 40:e3bbda7444fa 80 #endif