선분(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);
}
}
댓글
댓글 쓰기