Questa sfida si basa sull'effettivo rilevamento delle collisioni che ho dovuto scrivere di recente per un semplice gioco.
Scrivi un programma o una funzione che, dati due oggetti, restituisce un valore di verità o falsa a seconda che i due oggetti siano in collisione (cioè si intersecano) o meno.
Devi supportare tre tipi di oggetti:
- Segmenti di linea : rappresentati da 4 float, che indicano i due punti finali, ovvero (x 1 , y 1 ) e (x 2 , y 2 ) . Si può presumere che gli endpoint non siano identici (quindi il segmento di linea non è degenerato).
- Dischi : cioè cerchi pieni, rappresentati da 3 galleggianti, due per il centro (x, y) e uno (positivo) per il raggio r .
- Cavità : questi sono complementi di un disco. Cioè, una cavità riempie tutto lo spazio 2D, tranne una regione circolare, specificata da un centro e un raggio.
Il tuo programma o funzione riceverà due di questi oggetti sotto forma di un numero intero identificativo (a tua scelta) e dei loro 3 o 4 float. È possibile accettare input tramite STDIN, ARGV o argomento della funzione. È possibile rappresentare l'input in qualsiasi forma conveniente che non sia preelaborata, ad esempio da 8 a 10 numeri singoli, due elenchi di valori separati da virgole o due elenchi. Il risultato può essere restituito o scritto su STDOUT.
Si può presumere che gli oggetti siano distanti almeno 10-10 unità di lunghezza o si intersecino di così tanto, quindi non è necessario preoccuparsi dei limiti dei tipi in virgola mobile.
Questo è il golf del codice, quindi vince la risposta più breve (in byte).
Casi test
Rappresentando segmenti di linea con 0, dischi con 1e cavità con 2, utilizzando un formato di input basato su elenco, tutti i seguenti dovrebbero produrre un output veritiero:
[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
mentre quanto segue dovrebbe comportare un output errato
[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]]


