Initial publish

Dependencies:   mbed

Fork of el17dg by Dmitrijs Griskovs

collision_lib/collision_lib.h

Committer:
Noximilien
Date:
2019-05-07
Revision:
40:e3bbda7444fa

File content as of revision 40:e3bbda7444fa:

#ifndef COLLISION_LIB_H
#define COLLISION_LIB_H

#include <math.h>

/**
 * @struct Point
 * @brief Position or vector on the screen. Supports basic vector arithmetics.
 */
struct Point {
    /*@{*/
    int x; /**< the x position */
    int y; /**< the y position */
    /** Default constructor */
    Point() : x(0), y(0) {}
    /** Constructor with x and y parameters */
    Point(int _x, int _y) : x(_x), y(_y) {}
    
    /** 
     * @brief Vector addition. 
     */
    Point operator+ (const Point& rhs) const {
        Point result(x + rhs.x, y + rhs.y);
        return result;
    }

    /** 
     * @brief Vector substraction. 
     */
    Point operator- (const Point& rhs) const {
        Point result(x - rhs.x, y - rhs.y);
        return result;
    }
    
    /** 
     * @brief Length of vector squared. 
     */
    int lengthSquared() {
        return x * x + y * y;
    }
};

/** 
 * CicleBounds Class
 * @brief Class to define object's bounds as a circle with center(e.g. offset).
 * @author Dmitrijs Griskovs
 * @date 15/04/2019
 */
class CircleBounds {
public:
    /** Default constructor */
    CircleBounds() {};
    /** Constructor with center and radius parameters */
    CircleBounds(Point _center, float _radius): center(_center), radius(_radius) {};
    Point center;
    float radius;
};

/** 
 * @brief Determines whether the two circles collide.
 * @details the function takes in position and circle bounds (center and radius)
 * of two objects and returns wether they collided.
 *
 * @param pos_a positon of x and y of the first object. (const Point&).
 * @param bounds_a center point and radius of the first object. (const CircleBounds&).
 * @param pos_b positon of x and y of the second object. (const Point&).
 * @param bounds_b center point and radius of the second object. (const CircleBounds&).
 * @return true if the two circles overlap.
 */
inline bool circleCollideTwoObjects(
    const Point& pos_a, const CircleBounds& bounds_a, 
    const Point& pos_b, const CircleBounds& bounds_b
) {
    Point center_a = pos_a + bounds_a.center;
    Point center_b = pos_b + bounds_b.center;
    Point difference = center_a - center_b;
    return difference.lengthSquared() <= pow(bounds_a.radius + bounds_b.radius, 2);
}

#endif