Найти расстояние от данной точки внутри треугольника до ближайшей его стороны - 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.
Объяснение кода листинга программы
uses crt;
- подключает библиотеку функций графического интерфейса, которая используется для очистки экрана перед началом работы программы.const t=0.001;
- задает точность вычислений вещественных чисел, в данном случае, до четвертого знака после запятой.function plosh(x1,y1,x2,y2,x3,y3:real):real;
- определяет площадь треугольника по координатам вершин. Функция возвращает абсолютное значение площади, так как она может быть отрицательной.function prin(x1,y1,x2,y2,x3,y3,tx,ty:real):boolean;
- проверяет, лежит ли точка внутри треугольника. Функция возвращает логическое значениеtrue
, если точка находится внутри треугольника, иfalse
в противном случае.function vys(x1,y1,x2,y2,tx,ty:real):real;
- определяет высоту треугольника. Функция возвращает значение, которое в два раза меньше площади треугольника, образованной основанием, проведенным из вершины Y к точке (x1, y1), и боковыми сторонами, проведенными из вершин X1 и X2.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;
- цикл продолжается до тех пор, пока площадь треугольника не станет больше заданного диапазона точности.writeln('Расстояние от точки до стороны АВ=',vys(ax,ay,bx,by,tx,ty):0:2);
- выводит расстояние от точки до стороны АВ.writeln('Расстояние от точки до стороны АС=',vys(ax,ay,cx,cy,tx,ty):0:2);
- выводит расстояние от точки до стороны АС.writeln('Расстояние от точки до стороны ВС=',vys(bx,by,cx,cy,tx,ty):0:2);
- выводит расстояние от точки до стороны ВС.if vys(ax,ay,bx,by,tx,ty)<vys(ax,ay,cx,cy,tx,ty)
- проверяет, является ли расстояние до точки АВ меньше, чем расстояние до точки АС. Если да, то обновляет значение наименьшего расстояния.d:=vys(ax,ay,bx,by,tx,ty);
- обновляет значение наименьшего расстояния.if vys(bx,by,cx,cy,tx,ty)<d then d:=vys(bx,by,cx,cy,tx,ty);
- проверяет, является ли расстояние до точки АВ меньше, чем расстояние до точки АС. Если да, то обновляет значение наименьшего расстояния.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д