Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの3D空間で加速するかどうかによって、2つの球をチェックするプログラムが出会うことができます


半径の値がr1とr2である2つの球があるとします。それらは(x1、y1、z1)および(x2、y2、z2)座標にあります。そして、それらの加速度値は(ax1、ay1、az1)と(ax2、ay2、az2)のように与えられます。これらの2つの球が、指定された加速度で移動した場合に3D空間で出会うかどうかを確認する必要があります。

したがって、入力がr1 =1 r2 =2 pos1 =(0、0、0)acc1 =(100,0,0)pos2 =(4、0、0)acc2 =(0,0,0)、 2番目の球には加速度がないため移動しないため、出力は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

  1. Pythonで2つのパーティションのグループを同じ合計で作成できるかどうかを確認するプログラムはありますか?

    numsと呼ばれる数値のリストがあるとすると、両方のグループの要素の合計が同じである2つのグループにnumsを分割できるかどうかを確認する必要があります。 したがって、入力がnums =[2、3、6、5]のような場合、[2、6]や[3、5]のようなグループを作成できるため、出力はTrueになります。 これを解決するために、次の手順に従います total:=numsのすべての要素の合計 合計が奇数の場合、 Falseを返す 半整数:=合計の整数部分/ 2 dp:=サイズの半分+1のリストとfalseで埋める dp [0]:=true nums

  2. Pythonでノードを交換することで2つのツリーを形成できるかどうかを確認するプログラム

    2つのツリーがあるとすると、ノードの左右のサブツリーを何度でも交換して、最初のツリーを2番目のツリーに変換できるかどうかを確認する必要があります。 したがって、入力が次のような場合 その場合、出力はTrueになります これを解決するには、次の手順に従います- que1:=最初はroot0のキュー que2:=最初はroot1のキュー que1とque2は空ではありませんが、実行してください temp1:=新しいリスト、temp2:=新しいリスト values1:=新しいリスト、values2:=新しいリスト que1とque2に含まれる要素の数が