원 충돌, 올드 페인팅(물체에 색입히기), 충돌 반사 각도 - 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 관련. 낚이지 말것!
댓글
댓글 쓰기