원 충돌, 올드 페인팅(물체에 색입히기), 충돌 반사 각도 - 20170725

원과 원이 충돌했는지 확인하는 법


점과 점 사이의 길이를 잡은 다음, 각 원들의 반지름을 더한 값이 점과 점사이의 길이보다 짧다면 충돌한 셈이 되므로,

struct Circle{
int x, y; // x,y 좌표
int length;} // 반지름
Circle c1, c2;
일때

sqrt(abs(c1.x - c2.x) * abs(c1.x - c2.x) + abs(c1.y - c2.y) * abs(c1.y - c2.y))
(abs(a)-> a 를 양수로 만든다. sqrt(a) -> a의 제곱근을 리턴한다.)

로 점대점 변의 길이를 구한 후,
c1.length + c2.legnth 와 비교하면 됨.


원 충돌의 각도를 구하기.(GetAngle 유저 함수)

점과 점 사이의 각도가 얼만지 구하는 방식.
위에서 사용한
sqrt(abs(c1.x - c2.x) * abs(c1.x - c2.x) + abs(c1.y - c2.y) * abs(c1.y - c2.y))
을 이용하면 대각길이를 구할 수 있음.
그럼 한 변과 해당 대각길이를 사용해 cos를 구하거나, 대각변 이외의 양 변을 이용해 탄젠트(tan)를 구할 수 있음.

그 경우, 구한 탄젠트(tan)를 이용해 각 각도에 적용시켜줌. 예를 들어 187도의 경우, 7도만 계산하고, 180도를 추가로 더해서 사용할 경우 프로그램에선 올바르게 나올 수 있음.(탄젠트는 PI = 3.14값을 90도로 사용하는것 같다.)

그 값을 진행방향값으로 주면 중심점으로부터 충돌한 곳까지의 각도로 다른 힘을 줄수 있다.


<참고자료>

http://wooriworld2006.tistory.com/186 - 원과 원이 충돌했는지 확인하는 법


http://blog.naver.com/PostView.nhn?blogId=pok_jadan&logNo=186906198 - 두 점 사이의 각도 및 좌표계, GetAngle 유저 함수.

https://cboard.cprogramming.com/windows-programming/106613-how-fill-ellipse.html - 올드 브러시 형태, 네모 이외의 다른 형태에 색칠하는 방법.

https://msdn.microsoft.com/en-us/library/windows/desktop/ms535767(v=vs.85).aspx - 없어진 명령 FillEllipse 관련. 낚이지 말것!

댓글

이 블로그의 인기 게시물

[Unity2018.3.0f2] 코루틴 - 유니티에서 While문 멈추지 않고 돌리기.

[Unreal 4.20] 애니메이션 블루프린트에 캐릭터 가져오기.

[Unreal] AnimNotify 애님 노티파이 시스템.