선분(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간의 거리가 선분과 점의 거리가 됩니다.
우선 두개의 벡터를 구할수 있습니다.
\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 sqrt(dx*dx + dy*dy); } else { const double dx = pt.x() - m_start.x(); const double dy = pt.y() - m_start.y(); return sqrt(dx*dx + dy*dy); } }
댓글
댓글 쓰기