Определить, имеют ли отрезки, заданные координатами концов, общие точки - Free Pascal
Формулировка задачи:
Помогите пожалуйста решить
Входные данные
Восемь чисел – координаты концов двух отрезков.Выходные данные
Одна строка “YES”, если отрезки имеют общие точки, и “NO” в противном случае.Примеры
входные данные
1 2 1 2 1 2 1 2выходные данные
YESвходные данные
3 3 5 6 5 6 3 3выходные данные
YESРешение задачи: «Определить, имеют ли отрезки, заданные координатами концов, общие точки»
textual
Листинг программы
const res:array[1..2] of string[3]=('YES','NO');
var x1,y1,x2,y2,x3,y3,x4,y4,a,b,c,d,e,f,det,t,s,dt,ds:real;
otv:string[3];
begin
readln(x1,y1,x2,y2,x3,y3,x4,y4);
{вычислим координаты векторов}
a:=x2-x1;
b:=x3-x4;
c:=x3-x1;
d:=y2-y1;
e:=y3-y4;
f:=y3-y1;
det:=a*e-b*d;{вычислим определитель матрицы}
if det=0 then otv:=res[2]{прямые не пересекаются}
else
begin{определяем принадлежит ли точка пересечения обоим отрезкам}
dt:=c*e-f*b;
ds:=a*f-c*d;
t:=dt/det;
s:=ds/det;
if (s>=0) and (s<=1){принадлежит 1}
and(0<=t) and (t<=1){принадлежит 2} then otv:=res[1]
else otv:=res[2];
end;
write(otv);
end.
Объяснение кода листинга программы
- Задаются координаты концов отрезков и сохраняются в переменных x1, y1, x2, y2, x3, y3, x4, y4.
- Вычисляются координаты векторов a, b, c, d, e, f.
- Вычисляется определитель матрицы det.
- Если det=0, то прямые не пересекаются и otv присваивается
NO. - Иначе, вычисляются значения t и s.
- Если (s>=0) and (s<=1), то точка пересечения принадлежит первому отрезку, иначе принадлежит второму.
- Аналогично, если (0<=t) and (t<=1), то точка пересечения принадлежит второму отрезку, иначе принадлежит первому.
- Если оба условия выполняются, то otv присваивается
YES. - Результат выводится на экран.