2017-11-18 5 views
1

나는 course에 등록하고 있는데 코드 example에서이 기능을 가지고 있으며이 특정 기능이 어떻게 작동하는지 이해할 수 없다. 마지막 세 x 및 y 위치와 캔버스 원의 반경 동안 JavaScript -이 충돌 감지 기능이 작동하는 방식을 모르겠다.

function circRectsOverlap(x0, y0, w0, h0, cx, cy, r) { 
    var testX=cx; 
    var testY=cy; 
    if (testX < x0) testX=x0; 
    if (testX > (x0+w0)) testX=(x0+w0); 
    if (testY < y0) testY=y0; 
    if (testY > (y0+h0)) testY=(y0+h0); 
    return (((cx-testX)*(cx-testX)+(cy-testY)*(cy-testY))< r*r); 
} 

처음 네

인수는 X 및 Y 위치, 폭, 사각형의 높이이다.

사각형과 원이 만지면이 함수는 true을 반환하므로 충돌이 발생합니다.

답변

3

testX와 testY가 사각형으로 둘러싸인 원의 가장 가까운 점의 좌표가되는 것으로 보입니다. 4 개의 if 테스트는 원의 중심이 어느 한 차원에서 바깥쪽에있을 때이 값을 사각형의 모서리에 '고정'합니다. 원이 사각형 내부의 가운데에있는 경우를 고려하면 도움이됩니다. 모든 if는 false이고 testX와 testY는 원의 중심 좌표입니다. return 문에서의 테스트는 Pythagorean Theorem을 사용하여 테스트 지점이 원의 반경 내에 있는지를 결정합니다.

+1

다소 이해하지만 완전히는 아닙니다. 빗변이 r * r보다 작은 이유는 무엇입니까? –

+0

직사각형의 가장 가까운 점이 반지름보다 원 중심에 더 가깝게 있으면 어딘가에 겹쳐 있습니다. 직사각형의 가장 가까운 점과 원의 중심 사이의 거리 제곱은 (cx-testX) * (cx-testX) + (cy-testY) * (cy-testY)이며 반경 제곱은 r * r입니다. . 필자는 아마도 작성자가 왼쪽에서 JavaScript의 Math.sqrt() 함수를 사용하고 r보다 작을 것을 요구하는 것보다 작성하는 것이 더 간단했을 지 모르지만 (아마도 완전히 동일합니다). –