Найти расстояние от данной точки внутри треугольника до ближайшей его стороны - Turbo Pascal

Узнай цену своей работы

Формулировка задачи:

Даны координаты вершин треугольника и координаты некоторой точки внутри него. Составить программу, находящую расстояние от данной точки до ближайшей стороны треугольника. (При определении расстояний учесть, что площадь треугольника вычисляется и через три его стороны, и через основание и высоту.)

Решение задачи: «Найти расстояние от данной точки внутри треугольника до ближайшей его стороны»

textual
Листинг программы
uses crt;
const t=0.001;{точность сравнения вычисленных вещественных чисел}
{функция определения площади треугольника по координатам вершин}
function plosh(x1,y1,x2,y2,x3,y3:real):real;
begin
plosh:=abs((x1-x3)*(y2-y3)-(x2-x3)*(y1-y3))/2;
end;
{функция проверки лежит ли точка в треугольнике}
function prin(x1,y1,x2,y2,x3,y3,tx,ty:real):boolean;
begin
prin:=abs(plosh(x1,y1,x2,y2,x3,y3)-plosh(x1,y1,x2,y2,tx,ty)
-plosh(x1,y1,tx,ty,x3,y3)-plosh(tx,ty,x2,y2,x3,y3))<t
end;
{функция определения высоты}
function vys(x1,y1,x2,y2,tx,ty:real):real;
begin
vys:=2*plosh(x1,y1,x2,y2,tx,ty)/sqrt(sqr(x1-x2)+sqr(y1-y2));
end;
var ax,ay,bx,by,cx,cy,tx,ty,d:real;
begin
clrscr;
repeat
writeln('Введите координаты вершин треугольника');
readln(ax,ay,bx,by,cx,cy);
if plosh(ax,ay,bx,by,cx,cy)<t then
writeln('Треугольник вырожденный, повторите ввод')
until plosh(ax,ay,bx,by,cx,cy)>t;
repeat
writeln('Введите координаты точки внутри треугольника:');
readln(tx,ty);
if not prin(ax,ay,bx,by,cx,cy,tx,ty) then
writeln('Точка вне треугольника, повторите ввод')
until prin(ax,ay,bx,by,cx,cy,tx,ty);
writeln('Расстояние от точки до стороны АВ=',vys(ax,ay,bx,by,tx,ty):0:2);
writeln('Расстояние от точки до стороны АC=',vys(ax,ay,cx,cy,tx,ty):0:2);
writeln('Расстояние от точки до стороны ВC=',vys(bx,by,cx,cy,tx,ty):0:2);
if vys(ax,ay,bx,by,tx,ty)<vys(ax,ay,cx,cy,tx,ty)then
d:=vys(ax,ay,bx,by,tx,ty)else d:=vys(ax,ay,cx,cy,tx,ty);
if vys(bx,by,cx,cy,tx,ty)<d then d:=vys(bx,by,cx,cy,tx,ty);
writeln('Наименьшее расстояние=',d:0:2);
readln
end.

Объяснение кода листинга программы

  1. uses crt; - подключает библиотеку функций графического интерфейса, которая используется для очистки экрана перед началом работы программы.
  2. const t=0.001; - задает точность вычислений вещественных чисел, в данном случае, до четвертого знака после запятой.
  3. function plosh(x1,y1,x2,y2,x3,y3:real):real; - определяет площадь треугольника по координатам вершин. Функция возвращает абсолютное значение площади, так как она может быть отрицательной.
  4. function prin(x1,y1,x2,y2,x3,y3,tx,ty:real):boolean; - проверяет, лежит ли точка внутри треугольника. Функция возвращает логическое значение true, если точка находится внутри треугольника, и false в противном случае.
  5. function vys(x1,y1,x2,y2,tx,ty:real):real; - определяет высоту треугольника. Функция возвращает значение, которое в два раза меньше площади треугольника, образованной основанием, проведенным из вершины Y к точке (x1, y1), и боковыми сторонами, проведенными из вершин X1 и X2.
  6. var ax,ay,bx,by,cx,cy,tx,ty,d:real; - объявляет переменные для координат вершин треугольника и точки внутри треугольника.
  7. begin - начинает блок кода.
  8. clrscr; - очищает экран перед началом работы программы.
  9. repeat - начинает цикл повторения до тех пор, пока условие не выполнится.
  10. writeln('Введите координаты вершин треугольника'); - выводит сообщение и ожидает ввода координат вершин треугольника.
  11. readln(ax,ay,bx,by,cx,cy); - считывает введенные пользователем координаты вершин треугольника.
  12. if plosh(ax,ay,bx,by,cx,cy)<t then - проверяет, находится ли треугольник внутри заданного диапазона точности. Если нет, то программа переходит к следующему циклу.
  13. writeln('Треугольник вырожденный, повторите ввод') - выводит сообщение, если треугольник не удовлетворяет условию.
  14. until plosh(ax,ay,bx,by,cx,cy)>t; - цикл продолжается до тех пор, пока площадь треугольника не станет больше заданного диапазона точности.
  15. writeln('Расстояние от точки до стороны АВ=',vys(ax,ay,bx,by,tx,ty):0:2); - выводит расстояние от точки до стороны АВ.
  16. writeln('Расстояние от точки до стороны АС=',vys(ax,ay,cx,cy,tx,ty):0:2); - выводит расстояние от точки до стороны АС.
  17. writeln('Расстояние от точки до стороны ВС=',vys(bx,by,cx,cy,tx,ty):0:2); - выводит расстояние от точки до стороны ВС.
  18. if vys(ax,ay,bx,by,tx,ty)<vys(ax,ay,cx,cy,tx,ty) - проверяет, является ли расстояние до точки АВ меньше, чем расстояние до точки АС. Если да, то обновляет значение наименьшего расстояния.
  19. d:=vys(ax,ay,bx,by,tx,ty); - обновляет значение наименьшего расстояния.
  20. if vys(bx,by,cx,cy,tx,ty)<d then d:=vys(bx,by,cx,cy,tx,ty); - проверяет, является ли расстояние до точки АВ меньше, чем расстояние до точки АС. Если да, то обновляет значение наименьшего расстояния.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы