円と円セグメント間の衝突を検出するための堅実な解決策を見つけるのに苦労しています。ゲームの敵の視野円錐を想像してください。円は対象のオブジェクトを表しています。
一番下の図は、考えられるいくつかのケースを考えて描いたものですが、他にもあるはずです。
極端なケースをすばやく除外する方法を理解しており、円全体と衝突しないターゲットを破棄し、メイン サークルの中心がターゲット サークル内にある場合は自動的に true になります (図の E)。
残りのケースをチェックする良い方法を見つけるのに苦労しています。円の中心とセグメントの外側の線の端点との間の距離を比較してみました。また、メインの円の中心からターゲットの円の中心の角度を計算し、それがセグメント内にあるかどうかを判断しようとしました、しかし、どちらの方法でもすべてのケースをキャッチできるようには見えません。
具体的には、ターゲット円が中心に近いがそれに触れていない場合 (以下の E と B の間のどこか)、またはセグメントがターゲット円よりも狭い場合 (中心がセグメント内にあるが両方のエッジ)、ファンキーになるようです。その外にあります)。
これを行うための信頼できる方法はありますか?
追加情報:セグメントは、位置 P、向き O (大きさは円の半径)、およびビュー サイズ S によって記述されます。
これまでで最も成功した試みは、ベクトル ca1 と ca2 の角度を決定し、それらのいずれかがベクトル a1 と a2 の角度の間にあるかどうかを確認することでした。これは、上記で説明したように一部のケースでは機能しますが、ターゲット円がセグメントよりも大きい状況では機能しません。
編集2 以下からの最良の提案を実装した後、まだ誤検知があり、それをどのように排除するのが最善かわかりません. 下のピンク色の図を見てください。右下の円は、境界が半分のスペースとメインの円の両方に重なっているため、セグメントと衝突していると報告しています。
最終編集
別のエッジ ケース (4 番目の画像) を発見した後、以下の上位 2 つの回答を組み合わせて、すべてのベースをカバーしているように見えるアプローチに落ち着きました。フォローしてくださる方のために、ここで説明しておきます。
最初に、円から円への迅速なテストに失敗したものをすべて除外します。
次に、円とセグメントの 2 つの外側の線の間の衝突をテストします。どちらかに触れた場合、true を返します。
最後に、円の中心と 2 つの外側の線を使用して、ポイントから半空間へのテストをいくつか実行します (Gareth が以下で説明するように)。それらの両方を通過する場合、それ以外の場合は false を返します。