3
2D衝突検出
この挑戦は、私が最近簡単なゲームのために書かなければならなかった実際の衝突検出に基づいています。 2つのオブジェクトが与えられたときに、2つのオブジェクトが衝突(交差)しているかどうかに応じて、真偽値を返すプログラムまたは関数を作成します。 次の3種類のオブジェクトをサポートする必要があります。 線分:2つの端点、つまり(x 1、y 1)と(x 2、y 2)を示す4つの浮動小数点で表されます。エンドポイントが同一ではないと想定することができます(したがって、ラインセグメントは縮退していません)。 ディスク:塗りつぶされた円。3つのフロートで表され、中心(x、y)に2つ、半径rに 1(正)で表されます。 キャビティ:これらはディスクを補完するものです。つまり、空洞は、中心と半径で指定された円形の領域を除き、すべての2D空間を満たします。 プログラムまたは関数は、2つのそのようなオブジェクトを(選択した)識別整数の形式で受け取り、それらの3つまたは4つのフロートを受け取ります。STDIN、ARGV、または関数引数を介して入力を取得できます。入力は、前処理されていない便利な形式で表すことができます。たとえば、8〜10個の個別の数値、2つのコンマ区切りの値リスト、2つのリストなどです。結果を返すか、STDOUTに書き込むことができます。 オブジェクトは少なくとも10 -10の長さの単位で離れているか、その分だけ交差していると仮定することができるため、浮動小数点型の制限について心配する必要はありません。 これはコードゴルフなので、最短の回答(バイト単位)が勝ちです。 テストケース リストベースの入力フォーマットを使用して0、ラインセグメントを、ディスク、1およびキャビティで2表現すると、次のすべてが真の出力を生成するはずです。 [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 …