Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình kiểm tra hai quả cầu có thể gặp nhau bằng cách tăng tốc hay không trong không gian 3D bằng Python

Giả sử có hai mặt cầu có giá trị bán kính là r1 và r2. Chúng ở tọa độ (x1, y1, z1) và (x2, y2, z2). Và các giá trị gia tốc của chúng được cho như (ax1, ay1, az1) và (ax2, ay2, az2). Chúng tôi phải kiểm tra xem liệu hai quả cầu này có bao giờ gặp nhau trên không gian 3D hay không nếu chúng chuyển động với gia tốc cho trước hay không.

Vì vậy, nếu đầu vào là r1 =1 r2 =2 pos1 =(0, 0, 0) acc1 =(100,0,0) pos2 =(4, 0, 0) acc2 =(0,0,0), thì kết quả đầu ra sẽ là True, vì quả cầu thứ hai không có gia tốc nên nó sẽ không chuyển động, nhưng quả cầu thứ nhất sẽ chuyển động theo hướng x nên chúng sẽ va chạm.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • px:=pos1 [0] - pos2 [0]
  • py:=pos1 [1] - pos2 [1]
  • pz:=pos1 [2] - pos2 [2]
  • ax:=acc1 [0] - acc2 [0]
  • ay:=acc1 [1] - acc2 [1]
  • az:=acc1 [2] - acc2 [2]
  • da:=ax * ax + ay * ay + az * az
  • dp:=px * px + py * py + pz * pz
  • co:=ax * px + ay * py + az * pz
  • x:=0.0
  • nếu da không giống 0, thì
    • x:=- co / da
  • x:=tối đa của x, 0
  • dis:=căn bậc hai của (da * x * x + 2 * co * x + dp)
  • nếu dis - =r1 + r2, thì
    • trả về True
  • nếu không trả về False

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

def solve(r1, r2, pos1, acc1, pos2, acc2):
   px, py, pz = pos1[0] - pos2[0], pos1[1] - pos2[1], pos1[2] - pos2[2]
   ax, ay, az = acc1[0] - acc2[0], acc1[1] - acc2[1], acc1[2] - acc2[2]
   da = (ax * ax + ay * ay + az * az)
   dp = (px * px + py * py + pz * pz)
   co = (ax * px + ay * py + az * pz)

   x = 0.0
   if da != 0:
      x = - co / da
   x = max(x, 0)
   dis = (da * x * x + 2 * co * x + dp) ** 0.5
   if dis <= r1 + r2:
      return True
   else:
      return False

r1 = 1
r2 = 2
pos1 = (0, 0, 0)
acc1 = (100,0,0)
pos2 = (4, 0, 0)
acc2 = (0,0,0)
print(solve(r1, r2, pos1, acc1, pos2, acc2))

Đầu vào

1, 2, (0, 0, 0), (100,0,0), (4, 0, 0), (0,0,0)

Đầu ra

False