2017-11-18 146 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(這完全等價)。 –