

２Dのゲームで長方形と円の衝突判定プログラムを書きたいのですが、計算方法を教えて下さい。  
[![画像の説明をここに入力](https://i.stack.imgur.com/6ZRWl.png)](https://i.stack.imgur.com/6ZRWl.png)

長方形の中心を P0, 横幅の半分をw/2, 縦幅の半分を h/2 とします。  
円の中心は P1, 半径を r とします。

これらのパラメーターを使って円と長方形が交差しているか否かを判定するアルゴリズムとコードを教えて下さい。長方形は必ず軸に平行です。


CC BY-SA 3.0
2016-08-15T05:53:51.490
28275
2016-08-15T08:13:13.280
2016-08-15T07:28:06.577
76
8266
question
アルゴリズム game-development
長方形と円の衝突判定を行うコードを教えて下さい


言語の指定がないので、アルゴリズムだけ示します。

下記の図で細かい説明を省いて結論だけ言うと、長方形(赤)の外側に引いた水色の実線の中に、円の中心 P1
が入った際には衝突したとみなせます。水色の線は、長方形の外縁から r の距離に相当します。そのため角を除く部分は長方形に並行に、角の部分は半径 r の円の
1/4 となっています。

[![接触判定ライン](https://i.stack.imgur.com/lHiDv.png)](https://i.stack.imgur.com/lHiDv.png)

あとはこの水色の実線内に入ったかどうかの判定ですが、以下の図を参照してください。なおここで示すアルゴリズムは1つの例であり、組み立て方は他にもあります。またここで示した判定アルゴリズムは、決して速くはありません。接触していないことを早期に検出する、という改良が考えられます。

[![画像の説明をここに入力](https://i.stack.imgur.com/Ttwj0.png)](https://i.stack.imgur.com/Ttwj0.png)

  1. 黄色で示した領域に入ってるかどうかをチェックする。入っていたら接触しているとして終了
  2. 橙色で示した領域に入ってるかどうかをチェックする。入っていたら接触しているとして終了
  3. 緑色で示した領域に入ってるかどうかをチェックする。入っていたら接触しているとして終了
  4. 接触していないとして終了

1 については特に追加解説することはありません。黄色の領域の 4 隅の座標を計算して判定するだけです。

2 については2つの領域に分割されていますが、黄色の領域と重なってる部分については橙色であると仮定し、1 つの長方形ということで判定してよいでしょう。あとは
1 と同じで解説することはありません。

3 については赤色の長方形の4つ角のいずれかから、距離 r 以内であることを判定すれば良いです。単純な距離の計算に過ぎないので、細かい説明は省略します。

以上です。


CC BY-SA 3.0
2016-08-15T08:13:13.280
28280
2016-08-15T08:13:13.280
208
28275
answer