CSC3221_Programming_For_Games_Shapes / Project2 / Collision.cpp
Collision.cpp
Raw
#include "Collision.h"
#include <iostream>
#include <math.h> 

/*Default constructor*/
Collision::Collision(void) {
}

/*Destructor*/
Collision::~Collision(void) {
}

/*Square collision detection*/
bool Collision::isDetectCollision(const Square &squareToCompareOne, const Square &squareToCompareTwo) {
	return squareToCompareOne.getLeft() < squareToCompareTwo.getRight() && squareToCompareOne.getRight() > squareToCompareTwo.getLeft() &&
		squareToCompareOne.getBottom() < squareToCompareTwo.getTop() && squareToCompareOne.getTop() > squareToCompareTwo.getBottom();
}

/*Circle collision detection*/
bool Collision::isDetectCollision(const Circle &circleToCompareOne, const Circle &circleToCompareTwo) {
	float radius = circleToCompareOne.getRadius() + circleToCompareTwo.getRadius();
	float x = circleToCompareOne.getOriginPositionX() - circleToCompareTwo.getOriginPositionX();
	float y = circleToCompareOne.getOriginPositionY() - circleToCompareTwo.getOriginPositionY();
	return (x * x + y * y) <= (radius * radius);
}

/*Circle to squre && square to circle collision detection*/
bool Collision::isDetectCollision(const Circle &circle, const Square &square) {
	// 1) First calculate the absolute values of the x and y difference between the center of the circle and the center of the rectangle.
	float circleCalculateDistanceX = abs(circle.getLeft() - square.getLeft());
	float circleCalculateDistanceY = abs(circle.getBottom() - square.getBottom());

	// 2) Second eliminate the easy cases where the circle is far enough away from the rectangle (in either direction) that no intersection is possible.
	if (circleCalculateDistanceX > (square.getLength() / 2 + circle.getRadius())) { return false; }
	if (circleCalculateDistanceY > (square.getLength() / 2 + circle.getRadius())) { return false; }

	// 3) Third handle the easy cases where the circle is close enough to the rectangle (in either direction) that an intersection is guaranteed.
	if (circleCalculateDistanceX <= (square.getLength() / 2)) { return true; }
	if (circleCalculateDistanceY <= (square.getLength() / 2)) { return true; }

	// 4) Forth calculate the difficult case where the circle may intersect the corner of the rectangle.
	float cornerDistance_sq = pow(circleCalculateDistanceX - square.getLength() / 2, 2) +
		pow(circleCalculateDistanceY - square.getLength() / 2, 2);
	return (cornerDistance_sq <= pow(circle.getRadius(), 2));
}