기본 콘텐츠로 건너뛰기

라벨이 Line인 게시물 표시

선분의 중점 구하기

 두 점 $P_1,P_2$으로 이루어진 선분의 중점은 $(P_1+P_2)/2$입니다. 어 이게 맞나? 생각할지도 모르겠습니다. 맞는지 한번 확인해 보도록 하겠습니다. $P_1,P_2$로 이루어진 선분은 다음과 같이 표현이 가능합니다. 식으로는 아래와 같이 표현할 수 있습니다. $$L = P_1 + (\overrightarrow{P_2 - P_1})\times t, (0<=t<=1)$$ 여기서 선분의 중점은 두 점의 가운데이기 때문에 t=0.5로 두면 됩니다. ($t=0$일 경우는 시작점, $t=1$일 경우는 끝점) $t$에 0.5넣어 풀어보면, $$\begin{array} \\M&=P_1+\overrightarrow{(P_2-P_1)}\times 0.5 \\ &=P_1 + P_2\times 0.5 - P_1\times 0.5 \\ &=P_1\times 0.5 + P_2\times 0.5 \\ &=(P_1+P_2)\times 0.5 \end{array}$$ $P_1, P_2$가 이루는 선분의 중점은 $(P_1+P_2)/2$ 가 되는 것을 확인할 수 있습니다. 이제부터는 두 점 $P_1, P_2$의 중점을 구할때 두 점의 합을 2로 나눈 값을 사용하시면 됩니다.

선분과 직선과의 거리

선분(S-E)와 점 P와의 거리를 구해보도록 합시다. 우선 두개의 벡터를 구할수 있습니다. $$ \begin{aligned} V_1 &= \overrightarrow{P-S} \\ V_2 &= \overrightarrow{E-S} \\ \vec{V_1}\cdot\vec{V_2} &= |\vec{V_2}||\vec{V_1}|cos(\theta) =|\vec{V_2}||\vec{V_2}|U \\ U &= \frac{\vec{V_1}\cdot\vec{V_2}}{|\vec{V_2}||\vec{V_2}|} \end{aligned} $$ 위 식을 통해서 U값을 구할수 있습니다. 일단 U를 구했으면, U를 통하여 $V_2$와 수직을 이루는 벡터 $\overrightarrow{P-C}$의 C 값을 구할 수 있습니다. $$ C = S + U*\overrightarrow{E-S} $$ 마지막으로 C를 구했으니 $C-P$간의 거리가 선분과 점의 거리가 됩니다. double CIsLine2d::DistanceTo(const CIsPoint2d &pt) const { const double mag = Length(); if(0.f != mag) { double u = ((pt.x() - m_start.x())*(m_end.x() - m_start.x()) + (pt.y() - m_start.y())*(m_end.y() - m_start.y())) / (mag*mag); double xp= m_start.x() + u*(m_end.x() - m_start.x()); double yp= m_start.y() + u*(m_end.y() - m_start.y()); const double dx = xp - pt.x(); const double dy = yp - pt.y(); return sqr...

점이 직선의 어느 편에 있는가?

가끔씩 프로그래밍을 하다 보면 POINT가 직선의 어느 편에 존재하는지 판단해야 할 경우가 발생합니다. 직선의 시작점에서 끝점을 바라본다고 생각하면 왼쪽에 있는 POINT는 $E\to S$와 $LHS\to S$의 외적의 값은 양의 수가 되고 오른쪽에 있는 POINT가 그 값이 음의 수가 됩니다. 당연히 0일때는 POINT가 직선상에 존재합니다.