สมมติว่ามีทรงกลมสองอันที่มีค่ารัศมีเป็น r1 และ r2 อยู่ที่พิกัด (x1, y1, z1) และ (x2, y2, z2) และค่าความเร่งจะได้รับเช่น (ax1, ay1, az1) และ (ax2, ay2, az2) เราต้องตรวจสอบว่าทรงกลมทั้งสองนี้จะมาบรรจบกันบนอวกาศ 3 มิติหรือไม่ หากพวกมันเคลื่อนที่ด้วยความเร่งที่กำหนดหรือไม่
ดังนั้น หากอินพุตเป็น 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]
- ขวาน :=acc1[0] - acc2[0]
- ay :=acc1[1] - acc2[1]
- az :=acc1[2] - acc2[2]
- da :=axe * ax + ay * ay + az * az
- dp :=px * px + py * py + pz * pz
- co :=axe * px + ay * py + az * pz
- x :=0.0
- ถ้าดาไม่เหมือนกับ 0 แล้ว
- x :=- co / da
- x :=สูงสุดของ x, 0
- dis :=สแควร์รูทของ (da * x * x + 2 * co * x + dp)
- ถ้า dis −=r1 + r2 แล้ว
- คืนค่า True
- มิฉะนั้นจะคืนค่าเป็นเท็จ
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
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