Эта задача основана на фактическом обнаружении столкновений, которое мне недавно пришлось написать для простой игры.
Напишите программу или функцию, которая, учитывая два объекта, возвращает истинное или ложное значение в зависимости от того, находятся ли два объекта в столкновении (то есть пересекаются) или нет.
Вам необходимо поддерживать три типа объектов:
- Сегменты линии : представлены 4 числами с плавающей запятой, указывающими две конечные точки, т.е. (x 1 , y 1 ) и (x 2 , y 2 ) . Вы можете предположить, что конечные точки не идентичны (поэтому отрезок не является вырожденным).
- Диски : т.е. заполненные круги, представленные 3-мя поплавками, два для центра (x, y) и один (положительный) для радиуса r .
- Полости : это дополнение диска. Таким образом, полость заполняет все пространство 2D, кроме круглой области, определенной центром и радиусом.
Ваша программа или функция получит два таких объекта в виде идентифицирующего целого числа (по вашему выбору) и их 3 или 4 числа с плавающей точкой. Вы можете получить ввод через STDIN, ARGV или аргумент функции. Вы можете представить ввод в любой удобной форме, которая не была предварительно обработана, например, от 8 до 10 отдельных чисел, два списка значений через запятую или два списка. Результат может быть возвращен или записан в STDOUT.
Вы можете предположить, что объекты находятся на расстоянии не менее 10 -10 единиц или слишком сильно пересекаются, поэтому вам не нужно беспокоиться об ограничениях типов с плавающей запятой.
Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает.
Тестовые случаи
Представляя линейные сегменты с 0
дисками и с 1
полостями 2
, используя формат ввода на основе списка, все следующее должно давать достоверный вывод:
[0,[0,0],[2,2]], [0,[1,0],[2,4]] # Crossing line segments
[0,[0.5,0],[-0.5,0]], [1,[0,0],1] # Line contained in a disc
[0,[0.5,0],[1.5,0]], [1,[0,0],1] # Line partially within disc
[0,[-1.5,0.5],[1.5,0.5]], [1,[0,0],1] # Line cutting through disc
[0,[0.5,2],[-0.5,2]], [2,[0,0],1] # Line outside cavity
[0,[0.5,0],[1.5,0]], [2,[0,0],1] # Line partially outside cavity
[0,[-1.5,0.5],[1.5,0.5]], [2,[0,0],1] # Line cutting through cavity
[1,[0,0],1], [1,[0,0],2] # Disc contained within another
[1,[0,0],1.1], [1,[2,0],1.1] # Intersecting discs
[1,[3,0],1], [2,[0,0],1] # Disc outside cavity
[1,[1,0],0.1], [2,[0,0],1] # Disc partially outside cavity
[1,[0,0],2], [2,[0,0],1] # Disc encircling cavity
[2,[0,0],1], [2,[0,0],1] # Any two cavities intersect
[2,[-1,0],1], [2,[1,0],1] # Any two cavities intersect
в то время как следующее должно привести к ложному выводу
[0,[0,0],[1,0]], [0,[0,1],[1,1]] # Parallel lines
[0,[-2,0],[-1,0]], [0,[1,0],[2,0]] # Collinear non-overlapping lines
[0,[0,0],[2,0]], [0,[1,1],[1,2]] # Intersection outside one segment
[0,[0,0],[1,0]], [0,[2,1],[2,3]] # Intersection outside both segments
[0,[-1,2],[1,2]], [1,[0,0],1] # Line passes outside disc
[0,[2,0],[3,0]], [1,[0,0],1] # Circle lies outside segment
[0,[-0.5,0.5],[0.5,-0.5]], [2,[0,0],1] # Line inside cavity
[1,[-1,0],1], [1,[1,1],0.5] # Non-intersecting circles
[1,[0.5,0],0.1], [2,[0,0],1] # Circle contained within cavity
[0,[-2,0],[-1,0]], [0,[1,0],[2,0]]