Study/Python

3차원 상의 한 점에서 가장 가까운 직선 위의 점 찾기

13.d_dk 2022. 7. 4. 19:29
728x90
반응형

3차원 상의 한 점에서 가장 가까운 직선 위의 점 찾기

  • 3차원 위의 어떤 두 점으로 이루어진 직선이 있음
  • 또 다른 위치에 3차원 상의 한 점이 있음
  • 이 점에서 가장 가까운 직선 위 한 점을 어떻게 찾을 수 있을까?
  • 계산 방식과 원리가 궁금하지만 일에서 빠르게 적용하기 위해 stackoverflow(스택오버플로우)의 도움을 받음

 

한 점에서 가장 가까운 직선 위 점을 찾는 함수

  • 이 함수는 입력으로 line을 이루는 두 점과 임의의 한 점을 입력으로 받음
  1. line을 이루는 두 점 : a, b
  2. 임의의 한 점 : p
    • 이 함수는 임의의 한 점 p에가장 가까운 line 위의 점을 결과로 return
    • 함수의 소스코드는 다음과 같음
1
2
3
4
5
6
7
import numpy as np
 
def ClosestPointOnLine(a, b, p):
    ap = p-a
    ab = b-a
    result = a + np.dot(ap,ab)/np.dot(ab,ab) * ab
    return result
 
cs

 

검증 및 확인

  • 검증 및 확인은 matplotlib을 통해 확인하였음
  • 파란색 라인주황색 점 그리고 파란색 라인 위의 점직선으로 표현하였음 (수직을 이룸을 확인할 수 있음)

    • 소스코드는 아래와 같음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
 
a=np.array([0.000015,-0.000046,387.265137]) 
b=np.array([0.000004,-0.000015,-12.138947]) 
p=np.array([39.939014,11.414734,104.960205])
 
= ClosestPointOnLine(a, b, p)
 
x1 = np.linspace(a[0],b[0],100)
y1 = np.linspace(a[1],b[1],100)
z1 = np.linspace(a[2],b[2],100)
 
x2 = np.linspace(t[0],p[0],100)
y2 = np.linspace(t[1],p[1],100)
z2 = np.linspace(t[2],p[2],100)
 
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
 
ax.plot(x1,y1,z1)
ax.scatter(t[0], t[1], t[2])
ax.scatter(p[0], p[1], p[2])
ax.plot(x2,y2,z2)
 
plt.show()
 
cs
  • 더 정확한 검증은 수직함을 확인하거나, 여러 점 중 가장 가까운 거리 값을 가지는지 확인해볼 수 있음

 

Reference

 

How can I project a 3D point onto a 3D line?

Let's say I have a line defined by two points, A and B, both in the form (x, y, z). These points represent a line in 3D space. I also have a point P, defined in the same format, that isn't on the ...

gamedev.stackexchange.com

 

반응형