본문 바로가기
STL/stl- 기초 (numpy stl)

[파이썬과 STL] 3. 두 점과 평면의 교점

by 만다린망고 2020. 11. 12.
반응형

[파이썬과 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이 나옵니다. 다음시간에는 오늘 만든 코드를 정리하고, 함수로 바꿔봅시다. 

반응형

댓글