Задача «Два отрезка»
Два отрезка АВ и CD на плоскости заданы координатами своих концов - точек А, В, С и D. Требуется найти пересечение этих отрезков и вывести:
слово Empty, если эти отрезки не пересекаются;
координаты точки пересечения, если пересечение состоит из единственной точки;
координаты точек - концов отрезка пересечения, если пересечение заданных отрезков является отрезком.
Входные данные
Входной файл содержит координаты точек А, В, С и D - целые числа, не превосходящие 1 ООО по абсолютной величине. Отрезки могут быть вырожденными. Выходные данные
Выходной файл должен содержать ответ на задачу в указанном формате. Числа следует выводить не менее чем с 6 знаками после точки.
INPUT.TXT |
00 99 95 05 |
OUTPUT.TXT |
5.000000 5.000000 |
Разбор задачи №2 "Два отрезка"
Камско-Устьинского муниципального района РТ
Решение распадается на 2 принципиально различных случая:
1.Все 4 точки лежат на одной прямой
2.Точки не лежат на одной прямой. В первом случае надо аккуратно рассмотреть все возможные случаи. Для упрощения работы концы отрезков надо отсортировать так, чтобы первая точка была левее(x1<x2), если отрезок параллелен оси ОУ (х1=х2) то, чтобы первая точка была ниже (у1<у2). После этого надо отсортировать отрезки так чтобы первый был левее(x1<x3), если х1=х3 ,то чтобы первый был ниже(y1<y3). В результате число возможных вариантов значительно уменьшается. А)второй отрезок начинается после первого (х2<x3)– общих точек нет. Б)Второй отрезок начинается в концу первого (х2=х3 и у2=у) ответ одна точка Т3 В)второй отрезок начинается внутри первого(х3<x2 или х3=х3 и у3< 2): В1) один из отрезков вырожденный – ответ одна точка Т3, В2) второй отрезок заканчивается внутри первого – ответ отрезок Т3-Т4 В3)конец второго отрезка вне первого отрезка – ответ отрезок Т3-Т2
Если точки на лежат на одной прямой, то сортировка не обязательна, пересечение находим таким образом: Прямая разбивает плоскость на 2 полуплоскости. Если концы отрезка лежат в разных полуплоскостях, то отрезок пересевает прямую, если в одной – не пересекает. 2 отрезка пересекаются если каждый из них пересекает прямую, на которой лежит другой отрезок. Проверить это можно таким образом: если подставить в уравнение прямой координаты точек одной полуплоскости, то получим значения одного знака (на пример положительные).
Координаты точек другой полуплоскости дадут значения другого знака ( в примере - отрицательного). При умножении 2 чисел одного знака имеем положительный результат, разного знака – отрицательный.
Запишем уравнение прямой, проходящей через первую и вторую точки , (x-x1)(y2-y1)-(y-y1)(y2-y1)=0, подставим в его левую координаты третьей и четвёртой и перемножим полученные результаты.
Затем то же проделаем для прямой, проходящей через третью и четвертую точки и точек один и два.
Если в обоих случаях результат неположительный, то отрезки имеют общую точку.
Её координаты найдем, решив соответствующую систему полученных уравнений. Легче сделать это методом Крамера. Прилагаю вариант листинга, в нём все переменные типа REAL.
Можно использовать и целый тип INT64. При использовании типа LONGINT данный вариант программы даёт неверный результат в 2 тестах (№14 и №36), т.к. при умножении получаем выход за допустимый интервал значений.