관리 메뉴

JIE0025

[ C++ ] 충돌 알고리즘 본문

기타 학습/Language

[ C++ ] 충돌 알고리즘

Kangjieun11 2022. 5. 20. 17:31
728x90

 

두 캐릭터의 충돌 여부는 피타고라스의 정리를 이용해서 간단하게 구현할 수 있다!

 

두 캐릭터가 원이라는 가정하에 

현재 위치 x, y와 원의 반지름 r이 존재한다.

 

- 이때 r1 + r2는 두원의 반지름의 합이고 이 거리를 d라고 정의한다.

- 두 좌표값을 통해 두 캐릭터 위치 사이의 거리를 새로 구한다. 이 거리를 c라고 정의한다.

- c가 d보다 크면 충돌하지 않은것,

- c가 d와 같거나 작으면 충돌한것이다.

 

 

 

 

코드로 구현한것.

 

#include<iostream>
#include<cmath>

using namespace std;

class Character {
public:
	double r;
	double x;
	double y;
	Character(double rr, double xx, double yy) : r(rr), x(xx), y(yy) {};
};

void isCrash( Character c1, Character c2) {
	
	double d1 = c1.r + c2.r;
	
	double a = abs(c1.x - c2.x);
	double b = abs(c1.y - c2.y);
	double d2 = sqrt(a * a + b * b);

	if (d1 < d2) {
		cout << "충돌안함";
	}
	else {
		cout << "충돌";
	}
}

int main() {

	cout.tie(NULL);
	ios::sync_with_stdio(false);

// ex1 : 충돌 O
//	Character c1(1, 2, 1);
//	Character c2(2, 4, 2);
//	isCrash(c1, c2);

// ex2 : 충돌 X 
//	Character c1(1, 2, 1);
//	Character c2(2, 8, 2);
//	isCrash(c1, c2);

// ex3 : 충돌 O
	Character c1(2, 4, 2);
	Character c2(2, 8, 2);
	isCrash(c1, c2);

	return 0;
}

 

 

이해하기 쉽게 아래에 충돌 ex 3개를 각각 그림으로 표현했다.