2012-10-09 18 views
0

我有一個小圓圈,裏面是一個大圓圈。小圓圈正在飛行,如果小圓圈來到大圓圈的邊界,它就會碰撞。我幾乎設法這樣做,但它仍然不能完美。有時圓圈在邊界之前碰撞,有時在邊界之後。這是我的代碼:畫布:大圓內的球應該偏轉

if (!(Math.pow((xSmallCircle + radiusSmallCircle) - (xBigCircle), 2) + Math.pow((
    ySmallCircle + radiusSmallCircle) - yBigCircle, 2) < Math.pow(radiusBigCircle + 10, 2))) { 
            xVelocity *= -1; 
            yVelocity *= -1; 
    } else if (!(Math.pow((xSmallCircle - radiusSmallCircle) - (xBigCircle), 2) + Math.pow((
    ySmallCircle - radiusSmallCircle) - yBigCircle, 2) < Math.pow(radiusBigCircle + 10, 2))) { 
             xVelocity *= -1; 
             yVelocity *= -1; 
    } else if (!(Math.pow((xSmallCircle + radiusSmallCircle) - (xBigCircle), 2) + Math.pow((
    ySmallCircle - radiusSmallCircle) - yBigCircle, 2) < Math.pow(radiusBigCircle + 10, 2))) { 
             xVelocity *= -1; 
             yVelocity *= -1;    
    } else if (!(Math.pow((xSmallCircle - radiusSmallCircle) - (xBigCircle), 2) + Math.pow((
    ySmallCircle + radiusSmallCircle) - yBigCircle, 2) < Math.pow(radiusBigCircle + 10, 2))) { 
             xVelocity *= -1; 
             yVelocity *= -1; 
         } 

任何想法爲什麼這是行不通的?

+0

...我的解決方案有幫助嗎? – FrankieTheKneeMan

+0

非常感謝,它工作完美! (...我昨天沒有上網,所以我看不到你的答案;)) – user1590534

回答

0

這是因爲你只在四個點檢查碰撞,實際上它們都在內圈以外。嘗試一個更簡單,並在數學上正確的碰撞檢測機制。

var sep = Math.sqrt(
     Math.pow(xSmallCircle-xBigCircle, 2) 
     + Math.pow(ySmallCircle-yBigCircle, 2) 
); 
if(sep + radiusSmallCircle + borderWidthSmallCircle >= radiusBigCircle){ 
    //You have a collision Here 
} 

這裏的邏輯是,如果你計算每個圓的中心之間的線段的長度,並添加小圓圈的半徑,你會得到這是最小的圓的半徑(一)與外圓同心,(b)完全包圍小圓。如果該圓圈比您的外圈大或大小相同,就會發生碰撞。

如果你仍然有不精確的碰撞,這可能是一個舍入誤差。

+0

你的意思是'加'吧? – Daedalus

+0

@達達盧斯 - 當然。 :c) – FrankieTheKneeMan

+0

只是檢查,heh :) – Daedalus