球體彈性碰撞位置和速度計算算法


#本人原創,費了不少功夫計算推導公式,通過驗證非常完美

#兩球的位置和速度,R為半徑,這里設質量一樣,容易加上不同的質量和半徑
def collide(loc1,loc2,sp1,sp2):
  x,y=loc1
  x2,y2 = loc2
  dlx,dly = x-x2,y-y2

  dx,dy = sp1
  dx2,dy2 = sp2
  dvx,dvy = dx-dx2,dy-dy2

  #假如當前“碰撞過度”則回到之前的位置再求相切時的位置

  if dlx**2+dly**2<R**2:
    x,y = x-dx , y-dy
    x2, y2 = x2-dx2, y2-dy2
    dlx, dly = x-x2, y-y2
    b = R**2*(dvx**2+dvy**2)-(dlx*dvy - dly*dvx)**2
    #計算碰撞的時間
    p = -dlx*dvx -dly*dvy+ math.sqrt(b)
    p2 =-dlx*dvx -dly*dvy - math.sqrt(b)

    if dvx**2 + dvy**2==0:
      t=1

    #因為會相切兩次所以有兩個解,取較小一個
    else:
      temp = min((abs(p),abs(p2)))
      t = (temp)/(dvx**2 + dvy**2)


    #碰撞時的位置
    loc1 = x + t*dx , y +t*dy
    loc2 = x2 + t*dx2, y2 + t*dy2


    ## print(math.sqrt((loc1[1]-loc2[1])**2+(loc1[0]-loc2[0])**2))

    #碰撞后的速度改變,求動量交換
    if dly==0:
      ey=0
      ex=dvx
     else:
      k = dlx/dly
    ey=(dvy+k*dvx)/(1+k*k)
    ex=k*ey
    sp1 = dx -ex, dy-ey
    sp2 = dx2+ex, dy2 + ey
  return [loc1,loc2 ,sp1, sp2]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM