Diese Herausforderung basiert auf der Kollisionserkennung, die ich kürzlich für ein einfaches Spiel schreiben musste.
Schreiben Sie ein Programm oder eine Funktion, die bei zwei Objekten je nachdem, ob die beiden Objekte kollidieren (dh sich kreuzen) oder nicht , einen wahren oder falschen Wert zurückgibt .
Sie müssen drei Arten von Objekten unterstützen:
- Liniensegmente : durch 4 Gleitkommazahlen dargestellt, die die beiden Endpunkte angeben, dh (x 1 , y 1 ) und (x 2 , y 2 ) . Sie können davon ausgehen, dass die Endpunkte nicht identisch sind (das Liniensegment ist also nicht entartet).
- Scheiben : dh gefüllte Kreise, dargestellt durch 3 Floats, zwei für den Mittelpunkt (x, y) und einen (positiv) für den Radius r .
- Hohlräume : Dies sind die Ergänzung einer Scheibe. Das heißt, ein Hohlraum füllt den gesamten 2D-Raum mit Ausnahme eines kreisförmigen Bereichs, der durch einen Mittelpunkt und einen Radius festgelegt ist.
Ihr Programm oder Ihre Funktion erhält zwei solche Objekte in Form einer identifizierenden Ganzzahl (Ihrer Wahl) und ihre 3 oder 4 Gleitkommazahlen. Sie können Eingaben über STDIN, ARGV oder Funktionsargument vornehmen. Sie können die Eingabe in einer beliebigen, nicht vorverarbeiteten Form darstellen, z. B. 8 bis 10 einzelne Zahlen, zwei durch Kommas getrennte Wertelisten oder zwei Listen. Das Ergebnis kann zurückgegeben oder an STDOUT geschrieben werden.
Sie können davon ausgehen, dass die Objekte mindestens 10 -10 Längeneinheiten voneinander entfernt sind oder sich um so viel überschneiden, sodass Sie sich nicht um die Einschränkungen von Gleitkommatypen kümmern müssen.
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Testfälle
Bei der Darstellung von Liniensegmenten mit 0
, Discs mit 1
und Hohlräumen mit 2
einem listenbasierten Eingabeformat sollten alle folgenden Elemente eine wahrheitsgemäße Ausgabe liefern:
[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
Das Folgende sollte jedoch zu einer fehlerhaften Ausgabe führen
[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]]