기본 콘텐츠로 건너뛰기

라벨이 교점인 게시물 표시

[S3D] 칼럼(Column)간의 최소 거리 구하기

 아래와 같이 두 칼럼과 연결하는 빔이 있을때 두 칼럼간의 최소 거리를 구하는 방법입니다. 두 칼럼의 Origin Point로 거리를 구하게 되면 Cardinal Point에 따라 거리가 달라지게 됩니다. Cardinal Point에 대해서는 이전 글 을 참조하시면 됩니다. 그래서 여기서는 칼럼의 4개의 면을 이용하여 거리를 구하는 방법에 대해 생각해봅시다. 칼럼도 CableWay와 유사하게 8개의 코너 점을 가지고 있습니다. 이 코너 점을 이용하여 4개의 면을 만들 수 있습니다. $(P_0, P_1, P_5, P_4), (P_1, P_2, P_6, P_5), (P_2, P_3, P_7, P_6), (P_3, P_0, P_4, P_7)$ 이 점들로 각각 면들을 구성할 수 있습니다. 면의 방정식은 $ax+by+cz+d=0$입니다. $<a,b,c>$는 면의 법선 벡터로써 면에 존재하는 점들의 벡터 외적으로 구할 수 있습니다. 예를들어 첫번째 면의 법선 벡터는 $\overrightarrow{P_1-P_0}\times\overrightarrow{P_4-P_0}$입니다. 면들을 생성하였으면 빔의 라인과의 법선이 평행한 면들과의 교점 을 구할 수 있습니다.  라인과 법선의 평행 여부는 라인의 단위 벡터와 법선의 단위 벡터를 더하여 그 길이가 0 혹은 2에 근접하는지 여부로써 판별할 수 있습니다. 아마 위 예제에서는 2개의 평행한 면이 있어 2개의 교점을 구할 수 있습니다. S3D에서는 API를 통하여 평면과 곡선의 교점을 구할 수 있습니다. oColCurves1의 Position이 교점이 됩니다. 물론 S3D API를 이용하지 않고 직접 교점을 구할 수 있습니다. 이전 글 을 참조하시면 평면과 직선의 교점을 구할 수 있습니다. 반대편 칼럼에 대해서도 위와 같이 2개의 교점을 구합니다. 이렇게 구한 4개의 교점들에서 가장 짧은 거리를 구할 수 있습니다. 이 거리가 두 칼럼의 최소 거리가 됩니다. min_dist , line = None , ...

[2D]두 직선의 교점 구하기

  2D상의 A,B를 지나는 직선과 C,D를 지나는 직선의 교점을 구하는 방정식을 구해보도록 합시다. $$\begin{eqnarray} l_1&=A+(B-A)\times t_1 \\ l_2&=C+(D-C)\times t_2 \\ A+(B-A)\times t_1 &= C+(D-C)\times t_2\end{eqnarray}$$ 두 직선은 교점은 위의 방정식을 통하여 구할 수 있습니다. 이 방정식을 풀어보도록 합시다. 위 방정식은 2개의 변수를 가지고 있으므로 2개의 식이 있어야만 방정식을 풀수 있습니다. 따라서 이 방정식을 매개변수 $x,y$에 대해서 풀어보면, $$\begin{eqnarray} A_x+(B_x-A_x)\times t_1 &= C_x+(D_x-C_x)\times t_2 \\ A_y+(B_y-A_y)\times t_1 &= C_y+(D_y-C_y)\times t_2\end{eqnarray}$$ (4)번 식에서 $t_2$를 구해 (5)번 식에 대입하면, $$\begin{eqnarray} A_y+(B_y-A_y)\times t_1 &=& C_y+(D_y-C_y)\times \frac{(A_x-C_x)+(B_x-A_x)\times t_1}{(D_x-C_x)} \\ (A_y-C_y)*(D_x-C_x) &=& (D_y-C_y)*(A_x-C_x)+((B_x-A_x)*(D_y-C_y)-(B_y-A_y)*(D_x-C_x))\times t_1 \\ t_1 &=& \frac{(A_y-C_y)*(D_x-C_x)-(A_x-C_x)*(D_y-C_y)}{(B_x-A_x)*(D_y-C_y)-(B_y-A_y)*(D_x-C_x)}\end{eqnarray}$$ 이렇게 해서 $t_1$를 구했습니다. 만일 분모가 0이 되면 $t_1$을 구할 수가 없게 되고 따라서 교차점도 구할 수 없습니다. (두 직선이 평행할 경우) $$(B_x-A_x)*(D_y-C_y)-(B_y-A_y)*(D_x-C_x)=0$$...

[Geometry] 평면과 직선의 교점 구하기

[고찰 1] S와 E는 서로 평면의 반대편에 있어야 교점이 존재하게 됩니다. 교점 C는 직선의 방정식인 $S + t*(E - S)$로 표현됩니다. 또한 C는 평면 상의 점이 되므로 $\vec{N}*C + d = 0$을 만족합니다. 첫번째 식을 두번째 식에 대입하면,$\begin{eqnarray} \vec{N}*S + t*\vec{N}*(E-S) + d = 0 \\ t = -(\vec{N}*S + d)/(\vec{N}*(E-S)) \end{eqnarray}$이 됩니다. 이렇게 해서 $t$를 구할 수 있습니다. $t$를 구한 다음 당연히 교점 C를 구할 수 있습니다.