2012-11-27 162 views
2

我試圖按照此http://www.migapro.com/circle-and-rotated-rectangle-collision-detection/圈旋轉矩形碰撞檢測

我在這裏的jsfiddle添加http://jsfiddle.net/Z6KSX/2/的代碼來實現旋轉矩形和圓形之間的碰撞檢測。

我在這裏失蹤了什麼?

function check_coll (circle_x,circle_y, rect_x, rect_y, rect_width, rect_height, rect_angle) 
    { 

    // Rotate circle's center point back 
    var rect_centerX = rect_x /2 ; 
    var rect_centerY = rect_y /2 ; 

    var cx = (Math.cos(rect_angle) * (circle_x - rect_centerX)) - (Math.sin(rect_angle) * (circle_y - rect_centerY)) + rect_centerX; 
    var cy = (Math.sin(rect_angle) * (circle_x - rect_centerX)) + (Math.cos(rect_angle) * (circle_y - rect_centerY)) + rect_centerY; 

    // Closest point 
    var x, y; 

    // Find the unrotated closest x point from center of unrotated circle 
    if (cx < rect_x) { 
     x = rect_x; 
    } 
    else if (cx > rect_x + rect_width){ 
     x = rect_x + rect_width; 
    } 
    else{ 
     x = cx; 
    } 

    // Find the unrotated closest y point from center of unrotated circle 
    if (cy < rect_y){ 
     y = rect_y; 
    } 
    else if (cy > rect_y + rect_height) { 
     y = rect_y + rect_height; 
    } 
    else { 
     y = cy; 
    } 
    // Determine collision 
    var collision = false; 

    var c_radius = 5; 
    var distance = findDistance(cx, cy, x, y); 

    if (distance < c_radius) { 
     collision = true; // Collision 
    } 
    else { 
     collision = false; 
    } 
    return collision; 
} 


function findDistance (x1, y1, x2, y2) { 
     var a = Math.abs(x1 - x2); 
     var b = Math.abs(y1 - y2); 

     var c = Math.sqrt((a * a) + (b * b)); 
     return c; 
} 

回答

1

呵呵,我覺得這很可笑,因爲我最近有些解決了這個爲自己花費去錯了路的時候大量之後。

最後,我想出一個辦法:

1)簡單地通過將負量的矩形已經被旋轉的旋轉圓的中心的點。現在,點與矩形「對齊」(在矩形的相對座標空間中)。

2.)求解圓與AABB。我解決這個問題的方式給了我一個最接近圓心的矩形。

3.)旋轉矩形旋轉後的正數量的結果點。繼續像往常一樣解決問題(檢查該點與圓心之間的距離是否在圓的半徑範圍內)

從您的代碼中快速瀏覽一下,似乎您可能正在做同樣的事情,但錯過了最後一個步?我建議從第2步開始在矩形上繪製出您的要點,以確切瞭解它在幫助調試的位置。

+0

我無法理解,您能否請添加一些細節 – user94437

+0

從查看您的代碼中看起來有點難,但我的意思是圓與OOBB是相同的圓與AABB除了你需要旋轉矩形旋轉後的負圓的圓心,然後在碰撞測試之後(您將其測試爲圓與AABB相似),旋轉矩形的旋轉結果點,然後使用該點來檢查它是否在圓圈內。 – mitim

0

我能弄明白這一點。在代碼的問題是,我用錯了半徑和已經錯過了rect_x和rect_y中心

var rect_centerX = rect_x + (rect_width/2); 
    var rect_centerY = rect_y + (rect_height /2); 

當畫布上的旋轉處理,我們需要將轉換值添加到相應的X和Y在createrect中使用的值。