Este desafío se basa en la detección de colisión real que tuve que escribir para un juego simple recientemente.
Escriba un programa o función que, dados dos objetos, devuelva un valor verdadero o falso dependiendo de si los dos objetos están en colisión (es decir, se cruzan) o no.
Debe admitir tres tipos de objetos:
- Segmentos de línea : representados por 4 flotantes, que indican los dos puntos finales, es decir (x 1 , y 1 ) y (x 2 , y 2 ) . Puede suponer que los puntos finales no son idénticos (por lo que el segmento de línea no está degenerado).
- Discos : es decir, círculos rellenos, representados por 3 flotadores, dos para el centro (x, y) y uno (positivo) para el radio r .
- Cavidades : son el complemento de un disco. Es decir, una cavidad llena todo el espacio 2D, excepto una región circular, especificada por un centro y radio.
Su programa o función recibirá dos de estos objetos en forma de un número entero de identificación (de su elección) y sus 3 o 4 flotantes. Puede tomar la entrada a través de STDIN, ARGV o argumento de función. Puede representar la entrada en cualquier forma conveniente que no esté preprocesada, por ejemplo, de 8 a 10 números individuales, dos listas de valores separados por comas o dos listas. El resultado puede ser devuelto o escrito en STDOUT.
Puede suponer que los objetos están separados por al menos 10-10 unidades de longitud o que se cruzan entre sí, por lo que no debe preocuparse por las limitaciones de los tipos de punto flotante.
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Casos de prueba
Representando segmentos de línea con 0
, discos con 1
y cavidades con 2
, usando un formato de entrada basado en listas, lo siguiente debería producir una salida verdadera:
[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
mientras que lo siguiente debería resultar en una salida falsa
[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]]