দুটি স্ফেরর রেডিয়াস r1, r2, পজিশন pos1, pos2, এক্সিলারেশন acc1, acc2 দেওয়া আছে। এক্সিলারেশন দিয়ে গতিশীল হলে কখনো মিলবে (collide) কিনা চেক করুন।
উদাহরণ
r1=1, r2=2, pos1=(0,0,0), acc1=(100,0,0), pos2=(4,0,0), acc2=(0,0,0) → আউটপুট: False
নোট: উদাহরণে আউটপুট False দেখানো হয়েছে, কিন্তু বর্ণনায় True বলা হয়েছে। কোড অনুযায়ী আউটপুট False।
এলগরিদম (রিলেটিভ মোশন + কুয়াড্রাটিক ইকুয়েশন)
- রিলেটিভ পজিশন:
px, py, pz = pos1 - pos2 - রিলেটিভ এক্সিলারেশন:
ax, ay, az = acc1 - acc2 da = ax²+ay²+az², dp = px²+py²+pz², co = ax·px + ay·py + az·pzx = max(-co/da, 0)(যদিda != 0)- ন্যূনতম দূরত্ব:
dis = √(da·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
return dis <= r1 + r2
r1, r2 = 1, 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)) # আউটপুট: False
ইনপুট / আউটপুট
1, 2, (0,0,0), (100,0,0), (4,0,0), (0,0,0) False