[파이썬과 STL]
3. 두 점과 평면의 교점
STL 을 평면으로 잘라서 section 을 얻고 싶습니다. 이를 위해 평면과 두 점을 입력하면 두 점을 연결한 선분과 평면의 교점을 구해주는 함수가 필요합니다. 교점이 없는 경우는 아무 것도 반환하지 않고, 교점이 있는 경우는 점을 반환합니다.
평면은 한 점과, 법선벡터로 정의됩니다.
한점 (a,b,c)
법선벡터 (n1,n2,n3)
위 두 조건을 만족하는 평면의 방정식은 아래와 같습니다. P(x,y,z)라고 놓겠습니다.
P(x,y,z)=n1(x-a)+n2(y-b)+n3(z-c)=0
아래와 같이 벡터의 내적 형태로도 놓을 수 있습니다.
P(x,y,z)=[n1,n2,n3][x,y,z]-[n1,n2,n3][a,b,c]=0
임의의 두 점을 (p1,p2,p3) (q1,q2,q3) 라고 놓겠습니다. 두 점을 평면함수에 입력하여 나온 값 P(p1,p2,p3) 와 P(q1,q2,q3) 의 곱이 음수일 경우 평면과 교점을 갖습니다.
먼저 임의의 두 점과 한 평면을 이용하여 교점을 구해보도록 하겠습니다. 코드를 구성한 뒤, 작동을 잘 하는지 확인하고 함수로 만들면 됩니다.
p=(2,4,5)
q=(-4,-2,-6)
평면 위의 한 점 : (1,3,2)
평면의 법선벡터 : (2,3,5)
넘파이 배열을 이용하여 두점, 평면 위의 한 점, 평면의 법선벡터를 정의합시다.
점 p를 평면의 방정식에 대입한 결과를 P_p, 점 q를 평면의 방정식에 대입한 결과를 P_q 라고 놓겠습니다.
import numpy as np
p=np.array([2,4,5])
q=np.array([-4,-2,-6])
a=np.array([1,3,2])
N=np.array([2,3,5])
P_p=np.dot(N,p)-np.dot(N,a)
P_q=np.dot(N,q)-np.dot(N,a)
result=P_p*P_q
result 값은 -1300 입니다.
교점은 내분점을 이용하여 구합니다. 내분점의 비율은 각 점에서 평면까지의 거리입니다. 점에서 평면까지의 거리는 아래와 같이 구합니다.
분모는 법선벡터의 크기이므로 동일합니다. 따라서 따라서 P_p와 P_q 절댓값의 비율이 내분점을 구하는 비율입니다. 따라서 내분점은 아래와 같습니다.
아래와 같이 변형이 가능합니다.
위 예제를 가지고 내분점을 구해봅시다.
inter_p=abs(P_q)/(np.abs(P_p)+np.abs(P_q))*p+abs(P_p)/(np.abs(P_p)+np.abs(P_q))*q
내분점이 평면 위에 있는지 확인하기 위해 평면함수에 대입해봅시다. 0이 나오면 됩니다.
>>> np.dot(inter_p,N)-np.dot(N,a)
0.0
0이 나옵니다. 다음시간에는 오늘 만든 코드를 정리하고, 함수로 바꿔봅시다.
'STL > stl- 기초 (numpy stl)' 카테고리의 다른 글
[파이썬과 STL] 5. 두 점과 평면의 교점 함수 사용해보기 (2) | 2020.11.12 |
---|---|
[파이썬과 STL] 4. 두 점과 평면의 교점 함수 (0) | 2020.11.12 |
[파이썬과 STL] 2. STL 데이터 접근하기 (0) | 2020.11.12 |
[파이썬과 STL] 1. STL 불러오기 (0) | 2020.10.15 |
댓글