2017-11-18 50 views
1

我正在注册这course,他们从他们的代码example有这个功能,我不明白这个特定的工作方式。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位置,宽度和矩形的高度,而最后三个是x和y位置,并在画布上圆的半径。

如果矩形和圆形接触,函数返回true,因此存在碰撞。

回答

3

看来testX和testY会成为矩形所包围的圆心的最近点的坐标。如果四个测试将这些值“钳制”到矩形的边缘,则圆的中心应位于任一维度之外。这可能有助于考虑圆形在矩形内部居中的情况 - 所有的if都是假的,testX和testY是圆形中心的坐标。 return语句中的测试使用毕达哥拉斯定理来确定测试点是否在圆的半径内。

+1

我有点理解,但不完全。为什么它检查,如果斜边比r * r小? –

+0

如果矩形上的最近点比其半径更接近圆的中心,则它们在某处重叠。矩形上最近点与圆心之间的距离平方为(cx-testX)*(cx-testX)+(cy-testY)*(cy-testY),半径平方为r * r 。作者可能会比在左边使用JavaScript的Math.sqrt()函数编写起来要简单,并且要求它小于r(这完全等价)。 –