Ce défi est basé sur la détection de collision réelle que j'ai dû écrire récemment pour un jeu simple.
Écrivez un programme ou une fonction qui, compte tenu de deux objets, renvoie une valeur vraie ou fausse selon que les deux objets sont en collision (c'est-à-dire se croisent) ou non.
Vous devez prendre en charge trois types d'objets:
- Segments de ligne : représentés par 4 flottants, indiquant les deux extrémités, à savoir (x 1 , y 1 ) et (x 2 , y 2 ) . Vous pouvez supposer que les points d'extrémité ne sont pas identiques (donc le segment de ligne n'est pas dégénéré).
- Disques : c'est-à-dire des cercles remplis, représentés par 3 flotteurs, deux pour le centre (x, y) et un (positif) pour le rayon r .
- Cavités : ce sont le complément d'un disque. C'est-à-dire qu'une cavité remplit tout l'espace 2D, à l' exception d' une région circulaire, spécifiée par un centre et un rayon.
Votre programme ou fonction recevra deux de ces objets sous la forme d'un entier identifiant (de votre choix) et leurs 3 ou 4 flottants. Vous pouvez prendre des entrées via STDIN, ARGV ou un argument de fonction. Vous pouvez représenter l'entrée sous n'importe quelle forme pratique qui n'est pas prétraitée, par exemple 8 à 10 nombres individuels, deux listes de valeurs séparées par des virgules ou deux listes. Le résultat peut être retourné ou écrit dans STDOUT.
Vous pouvez supposer que les objets sont séparés d' au moins 10 à 10 unités de longueur ou se croisent d'autant, vous n'avez donc pas à vous soucier des limitations des types à virgule flottante.
Il s'agit du code golf, donc la réponse la plus courte (en octets) l'emporte.
Cas de test
Représentant des segments de ligne avec 0
, des disques avec 1
et des cavités avec 2
, en utilisant un format d'entrée basé sur une liste, les éléments suivants devraient tous produire une sortie véridique:
[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
tandis que les éléments suivants devraient tous entraîner une sortie fausse
[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]]