Wyzwanie to opiera się na wykrywaniu kolizji, które ostatnio musiałem napisać dla prostej gry.
Napisz program lub funkcję, która, biorąc pod uwagę dwa obiekty, zwraca wartość prawdy lub fałszu w zależności od tego, czy oba obiekty są w kolizji (tj. Przecinają się), czy nie.
Musisz obsługiwać trzy typy obiektów:
- Segmenty linii : reprezentowane przez 4 zmiennoprzecinkowe, wskazujące dwa punkty końcowe, tj. (X 1 , y 1 ) i (x 2 , y 2 ) . Możesz założyć, że punkty końcowe nie są identyczne (więc odcinek linii nie jest zdegenerowany).
- Tarcze : tzn. Wypełnione koła, reprezentowane przez 3 zmiennoprzecinkowe, dwie dla środka (x, y) i jedną (dodatnią) dla promienia r .
- Wnęki : są uzupełnieniem płyty. Oznacza to, że wnęka wypełnia całą przestrzeń 2D, z wyjątkiem okrągłego obszaru określonego przez środek i promień.
Twój program lub funkcja otrzyma dwa takie obiekty w postaci identyfikującej liczby całkowitej (do wyboru) i ich 3 lub 4 zmiennoprzecinkowe. Możesz przyjmować dane wejściowe za pomocą argumentu STDIN, ARGV lub funkcji. Możesz reprezentować dane wejściowe w dowolnej dogodnej formie, która nie jest wstępnie przetwarzana, np. Od 8 do 10 pojedynczych liczb, dwie listy wartości oddzielone przecinkami lub dwie listy. Wynik można zwrócić lub zapisać w STDOUT.
Możesz założyć, że obiekty są oddalone od siebie o co najmniej 10-10 jednostek lub przecinają się tak bardzo, więc nie musisz się martwić ograniczeniami typów zmiennoprzecinkowych.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Przypadki testowe
Reprezentując segmenty linii 0, dyski 1i wnęki 2, przy użyciu formatu wejściowego opartego na listach, poniższe elementy powinny generować prawdziwy wynik:
[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
podczas gdy poniższe powinny skutkować wynikiem fałszowania
[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]]


