Python中检查两个球是否在3D空间中通过加速或不加速而相遇的程序

Python中检查两个球是否在3D空间中通过加速或不加速而相遇的程序

假设有两个半径值为r1和r2的球,它们位于(x1,y1,z1)和(x2,y2,z2)坐标处。它们的加速度值像(ax1,ay1,az1)和(ax2,ay2,az2)这样给出。如果它们按照给定的加速度移动,我们必须检查这两个球是否会在3D空间中相遇。

因此,如果输入是r1 = 1 r2 = 2 pos1 =(0,0,0)acc1 =(100,0,0) pos2 =(4,0,0)acc2 =(0,0,0),那么输出将是True,因为第二个球没有加速度,所以它不会移动,但第一个球将以x方向移动,因此它们将相撞。

为了解决这个问题,我们将按照以下步骤进行:

  • 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
  • 如果da不同于0,则
    • x:= -co / da
  • x:= x,0的最大值
  • dis:=(da * x * x + 2 * co * x + dp)的平方根
  • 如果dis-r1-r2,那么
    • 返回True
  • 否则返回False

例子

看以下实现以获得更好的理解 –

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))

输入

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

输出

False

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程