Проекция точки на линию (точка пересечения перпендикуляра с линией)
  Сначала я опишу сам процесс теоретически, а уж потом приведу код функции.
  Проекция точки 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;
}
Вот и все. В данном примере был рассмотрен двухмерного случая, но его теоретически легко переделать в трехмерный.
Статью написал faceH0r 24.09.2005
Используются технологии uCoz