কম্পিউটার টিউটোরিয়াল

পাইথনে ৩D স্পেসে দুটি স্ফের এক্সিলারেশন দিয়ে কখনো মিলবে কিনা চেক করার প্রোগ্রাম

দুটি স্ফেরর রেডিয়াস 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।

এলগরিদম (রিলেটিভ মোশন + কুয়াড্রাটিক ইকুয়েশন)

  1. রিলেটিভ পজিশন: px, py, pz = pos1 - pos2
  2. রিলেটিভ এক্সিলারেশন: ax, ay, az = acc1 - acc2
  3. da = ax²+ay²+az², dp = px²+py²+pz², co = ax·px + ay·py + az·pz
  4. x = max(-co/da, 0) (যদি da != 0)
  5. ন্যূনতম দূরত্ব: dis = √(da·x² + 2·co·x + dp)
  6. যদি 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
  1. পাইথনে দুটি ট্রি নোড স왪 করায় সমান হয় কিনা যাচাই করা (Flip Equivalent Trees)

  2. পাইথনে স্ট্রিংয়ে বাম বা ডান প্রান্তে পৌঁছানো সম্ভব কিনা যাচাই করার প্রোগ্রাম

  3. পাইথনে দুটি আয়তাকার ওভারল্যাপ হচ্ছে কিনা যাচাই করার প্রোগ্রাম

  4. পাইথনে দুটি স্ট্রিংর অংশ প্যালিনড্রোম কিনা যাচাই করার প্রোগ্রাম