본문 바로가기
알고리즘

말랑말랑 만들기

by hansoo.labs 한수댁 2008. 10. 24.

붙으면 찌그러지는 '말랑말랑'
아~~ 완벽하지 않다.
업데이트 해야겠다 ㅠㅠ

 


계산방법

반지름이 rA인 회색공과 rB인 노란공이 만났을 때, 각 공의 외각을 이루는 점들 중 겹치는 부분에 위치한 점들은 점선상에 놓여야만 한다. 즉, 겹치는 부분의 반지름을 줄이는 방법이다.

그림을 참고로 삼각함수를 만들어보면,


cos(thetaA) = dA(A 에서 겹치는 중심까지 거리) / resizeAp(A의 줄어든 길이);
cos(thetaB) = dB(B 에서 겹치는 중심까지 거리) / resizeBp(B의 줄어든 길이);

resizeAp = dA / cos(thetaA);
resizeBp = dB / cos(thetaB);


그리고,

dA = rA - (rA + rB - dAB(공 AB 중심점의 거리))/2;
dB = rB - (rA + rB - dAB(공 AB 중심점의 거리))/2;


thetaA 는
(공 A의 외각점 pA가 절대 좌표상 이루는 각) - (공 A 입장에서 공 B의 위치가 이루는 각) 이다.

thetaA = atan2(pA.y - A.y, pA.x - A.x) - atan2(B.y - A.y, B.x - A.x);
thetaB = atan2(pB.y - B.y, pB.x - B.x) - atna2(A.y - B.y, A.x - B.x);

이로써, 두 공의 위치와 반지름을 알면 찌그러뜨릴 수 있다.ㅎ


근데 여러개의 공을 계산하면 계산량의 부담이 있다.
완벽하지 않지만 이상 말랑말랑 하게 하는 방법.

댓글0