Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Chương trình kiểm tra hai quả cầu có thể va chạm nhau trong không gian 3D trong Python

Cho hai quả cầu bán kính r1, r2, vị trí pos1, pos2 và gia tốc acc1, trong không gian 3D. Kiểm tra xem chúng có bao giờ va chạm nhau hay không.

Ví dụ: → (cầu 2 đứng yên, cầu 1 di chuyển theo x).

Thuật toán giải quyết (Giải tích vector)

  1. Tính vector vị trí tương đối: p = pos1 - pos2
  2. Tính vector gia tốc tương đối: a = acc1 - acc2
  3. Khoảng cách bình phương giữa hai tâm tại thời điểm t: |p + 0.5*a*t²|²
  4. Tìm t ≥ 0 cực tiểu hóa khoảng cách: t = max(0, - (a·p) / |a|²)
  5. Tính khoảng cách nhỏ nhất dis tại t đó
  6. Nếu : trả về , ngược lại

Ví dụ minh họa

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