Цей виклик заснований на фактичному виявленні зіткнень, про які я нещодавно повинен був написати для простої гри.
Напишіть програму або функцію, яка, задавши два об'єкти, повертає триєдичне або хибне значення залежно від того, чи два об'єкти стикаються (тобто перетинаються) чи ні.
Вам потрібно підтримувати три типи об’єктів:
- Відрізки рядків : представлені 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]]