2017-04-23 126 views
1

我一直陷入遊戲/模擬解決方案中,以便在時間運行時找到距離,而這不是我正在尋找的。計算兩個圓圈之間的碰撞時間 - 物理

我正在尋找一個O(1)公式來計算(0或1或2)時鐘時間(s),其中兩個圓圈完全相互爲r1 + r2距離。負面的時間是可能的。有可能兩個圓圈不會相撞,並且它們可能沒有交叉點(例如,當兩輛汽車在相反方向上行駛過於接近道路中間時彼此「剪輯」),這會弄亂我所有的mx + b解決方案。

從技術上講,單點碰撞應該是可能的。

我大約有100行代碼深,我確信必須有更好的方法,我甚至不確定我的測試用例是否正確。我的初始設置是:

dist(x1+dx1*t, y1+dy1*t, x2+dx2*t, y2+dy2*t) == r1+r2 

通過假設在任何時間t的距離可以用畢達哥拉斯來計算,我想知道在兩個時間點中,從中心的距離正好是半徑之和。我解答了a,b和c並應用了二次公式,並且我相信如果我假設他們是幻象物體,這會給我第一次碰撞和碰撞的最後時刻,我可以假設在每一刻之間,它們都是重疊的。

我工作的前提是2個對象不可能在t0重疊,這意味着「卡在對方內」的無限衝突是不可能的。我也過濾出來,並使用特殊處理,當斜率爲0或無限,這是工作。

我試着計算的距離,當對象1在交點時,它距離對象2的距離,同樣當o2在交點時,但這不起作用,因爲它有可能發生碰撞時他們不在他們的交叉點。

我在遇到斜率相等但幅度不同的問題。

是否有一個簡單的物理/數學公式呢?

編程語言並不重要,僞代碼會很好,或者沒有複雜符號的任何數學公式(我不是數學/物理學的人)......但沒有更高的順序(我認爲python可能已經有碰撞(p1,p2)方法)

+0

對象是否具有恆定的速度?如果是這樣,你應該簡單地能夠解決_t_。什麼不起作用? – pingul

回答

1

有一個簡單的( - )解決方案。你已經提到使用二次方程式是一個好的開始。

首先定義您的問題,其中二次公式可以有用,在這種情況下,中心之間的距離,隨着時間的推移。

  • 讓我們來定義時間t
  • 因爲我們使用兩個維度,我們可以撥打我們的尺寸x & y
  • 首先,讓我們在我們的圈子t = 0定義兩個中心點爲a & b
  • 我們還定義我們的速度爲t = 0a & b分別爲u & v
  • 最後,分別假設常數a & b的加速度分別爲o & p
  • 用於相對於沿着任何一個維度的位置(我們稱之爲i)到時間t的方程如下:i(t) = 1/2 * a * t^2 + v * t + i0;a是恆定的加速度,v是初始速度,和i0是初始位置沿尺寸i
  • 我們知道兩個2D點之間的距離在任何時候t((a.x(t) - b.x(t))^2 + (a.y(t) - b.y(t))^2)
  • 平方根算了筆的條款,我們定義的常量使用沿着維度,我們可以替代的距離公式的一切位置的公式早。爲簡寫起見,我們將調用函數d(t);
  • 最後使用該公式,我們將知道值是d(t) = a.radius + b.radius是碰撞開始或結束的地方。
  • 爲了把這個二次方程式方面我們移動半徑向左所以我們得到d(t) - (a.radius + b.radius) = 0
  • 然後,我們可以擴展和簡化結果方程等等一切都在t條款和我們得到的常數值。使用該解決方案爲正數&負值與二次公式。
  • 這也會處理錯誤,因爲如果你得到兩個永遠不會碰撞的對象,你將得到一個未定義或虛構的數字。

你應該可以很容易地將其餘的代碼翻譯成代碼。我沒有時間atm,並會盡我所能寫出一個簡單的解決方案。