bor

3D : Расстояние до прямой

bor
Jan 3rd, 2013
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 1.35 KB | None | 0 0
  1. program _3D;
  2.  
  3. type
  4.   Point = record
  5.     x, y : Longint;
  6.   end;
  7.  
  8. var
  9.   a, b, p, ab, ap: Point;
  10.   dot : Longint;
  11.   distAP, distAB, projAP, answer : Extended;
  12.  
  13. begin
  14.   ReadLn(p.x, p.y);
  15.   Read(a.x, a.y);
  16.   ReadLn(b.x, b.y);
  17.   (* Считаем вектора AB и AP *)
  18.   ab.x := b.x - a.x;
  19.   ab.y := b.y - a.y;
  20.   ap.x := p.x - a.x;
  21.   ap.y := p.y - a.y;
  22.   (* Скалярное произведение векторов AB * AP *)
  23.   dot := ab.x * ap.x + ab.y * ap.y;
  24.   (* Найдём расстояния от A до P и от A до B *)
  25.   distAP := Sqrt(Sqr(a.x - p.x) + Sqr(a.y - p.y));
  26.   distAB := Sqrt(Sqr(a.x - b.x) + Sqr(a.y - b.y));
  27.   (* По формуле скалярного произведение dot = |AB| * |AP| * cos(a)
  28.    * Найдём |AP| * cos(a), это будет проэкцией вектора AP (тенью) на прямую AB *)
  29.   projAP := dot / distAB;
  30.   (* Если всё это нарисовать, то можно увидить прямоугольный треугольник с
  31.    * гипотенузой AP, одним катетом длиной projAP, а другой катет будет искомым
  32.    * расстоянием от точки до прямой. Воспользуемся теоремой Пифагора. *)
  33.   answer := Sqrt(Sqr(distAP) - Sqr(projAP));
  34.   WriteLn(answer);
  35. end.
Advertisement
Add Comment
Please, Sign In to add comment