반지름 값이 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)과 같으면 두 번째 구에는 가속도가 없으므로 이동하지 않지만 첫 번째 구는 x 방향으로 이동하여 충돌하므로 출력은 True가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 픽셀:=pos1[0] - pos2[0]
- 파이 :=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 :=도끼 * 도끼 + 에이 * 에이 + az * az
- dp :=px * px + py * py + pz * pz
- co :=ax * px + y * py + az * pz
- x :=0.0
- da가 0과 같지 않으면
- x :=- 공동 / 다
- x :=최대 x, 0
- dis :=(da * x * x + 2 * co * x + dp)의 제곱근
- dis −=r1 + r2이면
- 참 반환
- 그렇지 않으면 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