2016-12-25 85 views
1

目前我正在研究2D粒子模擬器。我有每個粒子以獨特的角度移動。我找到了一個改變x和y速度的基本公式,但是我現在有一個根據角度移動的設定速度。2D垂直角度碰撞

particles[a][3] += particles[a][1] * cos(radians(particles[a][5]));//move X 
particles[a][4] += particles[a][1] * sin(radians(particles[a][5]));//move Y 

我對牆上的碰撞有一個基本的碰撞,但找不到排除碰撞的最佳方法。目前我只是將旋轉乘以-1,但只能在頂部和底部工作。注意:運行碰撞後,粒子將始終移動(它不會卡在碰撞盒中,並且會陷入困境)。

if(particles[a][3] < 0 || particles[a][3] > windowWidth/2 || particles[a][4] < 0 || particles[a][4] > windowHeight/2) { 
    /*windowWidth and windowHeight are divided by 2 to find the canvas size. In the setup() I have the canvas set to that value).*/ 
    particles[a][5] *= -1; 
} 

數組值:

particles[a][1] = speed 
particles[a][3] = x position 
particles[a][4] = y position 
particles[a][5] = rotation 

我的問題是什麼是運行這些碰撞測試的最好方法。我明白碰撞會以90度反彈,但我希望儘可能少地使用陳述(簡單得多)而不是繁瑣的一堆。

聖誕快樂,並提前致謝!


想通了! 最終代碼:

if(particles[a][4] < 0 || particles[a][4] > windowHeight/2) { 
    particles[a][5] *= -1; 
} else if(particles[a][3] < 0 || particles[a][3] > windowWidth/2) { 
    particles[a][5] = 180 - particles[a][5]; 
} 

回答

0

嘗試谷歌搜索「的JavaScript反映角」,你會發現公式繞X軸和Y軸都反映了。當你碰到頂部或底部時,你做一個,當你碰到左邊或右邊時,你做另一個。

此外,你可能不應該使用數組來保存你的數據。創建一個保存你的值的類,然後創建該類的實例。使用魔術數組索引是令人頭疼的祕訣。

如果你仍然無法正常工作,那麼請發帖MCVE,我們將從那裏開始。祝你好運。

+0

完全打開陣列替代。你能給我一個關於實例的推薦學習指南的鏈接嗎?現在檢出javascript反射角度的東西。 – bdkopen

+0

得到了正確反映的y軸。仍然對學習這些實例感興趣。 – bdkopen