728x90
반응형
3차원 상의 한 점에서 가장 가까운 직선 위의 점 찾기
- 3차원 위의 어떤 두 점으로 이루어진 직선이 있음
- 또 다른 위치에 3차원 상의 한 점이 있음
- 이 점에서 가장 가까운 직선 위 한 점을 어떻게 찾을 수 있을까?
- 계산 방식과 원리가 궁금하지만 일에서 빠르게 적용하기 위해 stackoverflow(스택오버플로우)의 도움을 받음
한 점에서 가장 가까운 직선 위 점을 찾는 함수
- 이 함수는 입력으로 line을 이루는 두 점과 임의의 한 점을 입력으로 받음
- line을 이루는 두 점 : a, b
- 임의의 한 점 : 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])
t = 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
반응형
'Study > Python' 카테고리의 다른 글
matplotlib에서 임의의(random) color 자동 생성하기 : hex string 기반 (0) | 2023.04.21 |
---|---|
python bool list에서 True 개수 빨리 찾기 (0) | 2023.04.12 |
3차원 상의 두 직선 사이 가장 가까운 점 구하기 (서로 다른 두 점으로 이루어진 두 직선 사이 가장 가까운 점들 구하기) (0) | 2022.07.04 |
python을 이용한 간단한 게임 - 숫자 맞추기 게임 (0) | 2014.01.29 |
Python이란? (0) | 2014.01.29 |