檢測圓矩形的碰撞是不平凡的(但沒有那麼複雜要麼)。
@kuroi neko的解決方案是正確的,大概就像代碼一樣簡單。
幸運的是,您不需要完全理解使用命中測試函數的數學理論。
如果你想對函數是如何工作的詳細信息,下面是使用4個步驟進行測試,如果一個圓和一個矩形的碰撞描述:
演示:http://jsfiddle.net/m1erickson/n6U8D/
首先,定義一個圓形或矩形
var circle={x:100,y:290,r:10};
var rect={x:100,y:100,w:40,h:100};
步驟#1:找到垂直&水平(distX /二STY)圓的中心與矩形的中心
var distX = Math.abs(circle.x - rect.x-rect.w/2);
var distY = Math.abs(circle.y - rect.y-rect.h/2);
步驟#2之間的距離:如果該距離大於halfCircle + halfRect更大,則它們被分開得太遠要碰撞
if (distX > (rect.w/2 + circle.r)) { return false; }
if (distY > (rect.h/2 + circle.r)) { return false; }
步驟#3:如果該距離小於halfRect然後他們肯定碰撞
if (distX <= (rect.w/2)) { return true; }
if (distY <= (rect.h/2)) { return true; }
步驟4:測試直角拐角處的碰撞。
- 覺得從矩形中心向任何矩形角落
- 現在線由圓
- 的半徑延長該行如果圓的中心在該行他們正好是矩形角落碰撞
使用畢達哥拉斯公式來比較圓和中心之間的距離。
var dx=distX-rect.w/2;
var dy=distY-rect.h/2;
return (dx*dx+dy*dy<=(circle.r*circle.r));
繼承人的全碼:
var circle={x:100,y:290,r:10};
var rect={x:100,y:100,w:40,h:100};
// return true if the rectangle and circle are colliding
function RectCircleColliding(circle,rect){
var distX = Math.abs(circle.x - rect.x-rect.w/2);
var distY = Math.abs(circle.y - rect.y-rect.h/2);
if (distX > (rect.w/2 + circle.r)) { return false; }
if (distY > (rect.h/2 + circle.r)) { return false; }
if (distX <= (rect.w/2)) { return true; }
if (distY <= (rect.h/2)) { return true; }
var dx=distX-rect.w/2;
var dy=distY-rect.h/2;
return (dx*dx+dy*dy<=(circle.r*circle.r));
}
我知道這個解決方案很不錯,,,我已經看到了小提琴文件,真正感謝那個傢伙@markE ,,但實際上我剛開始HTML5的Canvas ,,它不那麼強硬碼,,,但都不我需要,,,我竟然有一種類型的乒乓遊戲的地方,我必須圓(槳)和矩形(OBJ作爲球),那它..之間的碰撞檢測!希望你能得到一個簡單的解決方案.. !! – Gurjit
PLZ如果你不介意可以編輯我的checkCollision功能..! – Gurjit
@markE這個版本的情況下,更精簡你考慮矩形「實」(圓被認爲是在矩形內時發生碰撞)。我通過我的[測試小提琴](http://jsfiddle.net/CDLwP/4/)運行它,它像一個魅力。 –