Сначала я опишу сам процесс теоретически, а уж потом приведу код функции.
Проекция точки I на линию L представляет собой точку пересечения перпендикуляра из I на L - P.
Итак, как было сказано выше необходимо найти проекцию точки I на линию L. Линия должна быть задана двумя точками A и
B, тогда точку P можно представить как:
P=A+k*Dir;
Здесь k коэффициент, а Dir - направление линии, высчитанное так B-A.
В данном уравнении 2 неизвестных сама точка P и k, найдем коэффициент.
Если P-I является перпендикуляром к линии, то можно записать так:
DOT(Dir,A+k*Dir-I)=0;
DOT - скалярное произведение векторов.
Теперь остается лишь отсюда вывести k.
DOT(Dir,A)+k*Dir2-DOT(Dir,I)=0;
k*Dir2=DOT(Dir,I)-DOT(Dir,A);
k=(DOT(Dir,I)-DOT(Dir,A))/Dir2;
k=(DOT(Dir,I-A))/Dir2;
Вот в принципе и все, остается лишь подставить в главную формулу:
P=A+((DOT(Dir,I-A))/Dir2)*Dir;
Теперь переходим к практике:
Vec2 PrjPointOnLine(Vec2 vI,Line2 lI)
{
Vec2 vDir = (lI.B-lI.A);
float fDot = DOT(vI-lI.A,vDir);
float fk = (fDot)/((vDir.x*vDir.x)+(vDir.y*vDir.y));
Vec2 vP = lI.A+fk*vDir;
return vP;
}
|
Вот и все. В данном примере был рассмотрен двухмерного случая, но его теоретически легко переделать в трехмерный.
|