Initial publish
Dependencies: mbed
Fork of el17dg by
collision_lib/collision_lib.h@40:e3bbda7444fa, 2019-05-07 (annotated)
- 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?
User | Revision | Line number | New 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 |