スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
以後の更新内容の改善のために、是非ともご評価のほどよろしくお願いします!→

円同士の当たり判定

最近「円と円の当たり判定」で検索して来てくださる方がいらっしゃったんですが、残念ながらまだ用意できていませんでした。なので、この機会に当たり判定について(自分の頭の中の知識を整理することを目的に)書いておきます。

さて、今回は円同士(円と円)の当たり判定です。

実はこの判定は比較的カンタンです。理解してしまえばどうということはありません。
(ちなみに、それぞれの円について中心座標(x,y)と半径rがわかっていればOKです。)


(※この記事では、「円同士の当たり判定」の概念を説明しているだけで、プログラム例は掲載していません。そこでC言語(C++)での実装例を紹介する記事もこしらえましたので参考までにご覧くださいませ。「円同士の当たり判定【C言語での実装】」)


図1を見てください。このように2つの円があったとします。(左下が円A、右上が円Bとします。)

図1

x1、y1は円Aの中心点の座標です。どこを基準にとっても問題ではありません。x2、y2は円Bの中心座標です。また、それぞれの円の半径r1、r2がわかっているものとします。
また、判定処理のときには、r1とr2の距離が必要になってきますが、これは上に出てきた数値で求めることになります。



さて、この2つの円が当たっているのかどうかを判定する訳ですが、その前にまず2つの円が接する状態を見てみましょう。

図2:接する状態

2つの円が接していますね。ここで注目すべきは円Aと円Bの中心座標同士の距離dです。見ればわかりますが、r1とr2を合わせた距離「r1 + r2」と中心座標同士の距離「d」が等しいですね?

式で表せば「r1 + r2 = d」となりますが、これぞ円同士が接する判定条件です。この式が成り立てば2つの円が接していることがわかります。

しかし、ゲームでの当たり判定は接している場合だけではありません。互いの一部分が重なり合っている場合も「当たっている」と判定しなければなりません。さて、どうしましょう...


次に、円の一部が重なっている状態の図を見てみましょう。

図3:一部が含まれる状態

r1とr2を一直線上においていないのはわざとです。どうですか?r1とr2を足したものと距離dを比べてください。明らかに半径同士の合計(和)の方が大きいですね。

このことから、「r1 + r2 > d」という式が得られます。この条件式を満たす場合は円の一部分が重なっているということがわかります。(ただし、接しているときは含まれません。



要するに、実際に条件式として用いる場合は上の二つの場合をどちらも含めて次のようにします。

円同士が当たる条件

この条件式が成り立つときに、2つの円が「当たっている」と言えるのです。





さて、判定の概念がわかったところですが、実際に判定させるには距離dを算出しなければなりません。
(求め方がわかる人は読む必要はないでしょう。)

図4:ピタゴラスの定理(三平方の定理)

ここでは上図のピタゴラスの定理(三平方の定理)を利用して距離dを求めます。

図5:距離dの求め方

この図は円の中心同士を結んだ線を斜辺とする直角三角形を考えたものです。
この直角三角形でピタゴラスの定理を考えると、斜辺(距離d)を求めるわけですから、直角三角形の底辺と高さがわかれば良いわけです。
2つの円のx,y座標をそれぞれ引いたものの絶対値は、その長さになりますから、
底辺は「 |x1-x2| 」、高さは「 |y1-y2| 」となります。

あとはピタゴラスの定理の式からいろいろ変形していけば式を導くことが出来ます。

図6:式の変形
1行目はピタゴラスの定理です。
2行目は...言葉で説明しづらいですね・・・、cについて二乗から一乗に変形しています。
3行目はcは斜辺の長さなので負の数にはなりません。(だから「?」を取り除く。)
cは斜辺(すなわち2つの円の中心座標の距離d)なのでdに変えてしまい、先ほど求めた直角三角形の高さと底辺をa,bそれぞれに代入して4行目の式になります。
絶対値記号「|」がついているので、なんとなく展開して再度、因数分解します。(6行目)


このように求めた距離dを用いて、最終的には次のように変形します。

図7:最終的な変形

1行目は2つの円が当たる条件式です。
2行目はdに先ほど求めた式を代入したものです。

別にこの状態で条件判定を行ってもいいのですが、コンピュータの計算処理的に平方根(ここではルート)の計算は結構大変なんだそうです。(想像つきますよね^^;)
なので、ここでは両辺の平方をとります。(両辺を2乗する。)
そうすれば赤枠の式が求まり、(少なくとも平方根を含んだ計算より遥かに?)軽い「当たり判定」が行えるはずです。(たぶん。)





これだけ長々と説明しても、結局これを理解してくれる人は(説明が下手すぎて)非常に少ないだろうなと思いつつ、この締めの文を打ち込んでいます。時間を使った割には実のない説明となりました(うぅ...残念--;)

もし「そりゃ違うだろっ!」という具合の間違い等がございましたら是非ご指摘ください。(間違えたまま覚えてしまうと困るので。)
あと、間違えていたらゴメンナサイ・・・(汗) 今日はここで失礼します。m(_ _;)m



(※この記事の先頭でも紹介しましたが、この判定概念を実際にプログラムに実装してみた記事を掲載しております。「円同士の当たり判定【C言語での実装】」参考になれば幸いです^^)
以後の更新内容の改善のために、是非ともご評価のほどよろしくお願いします!→

コメントの投稿

非公開コメント

No title

はじめまして
辺り判定ですか・・・
日常的には結構当たり前のようなことでも
数式化したりプログラム化するのは骨が折れますよね(笑
また来ますねー

はじめまして!

はじめまして!ご訪問ありがとうございます。
そうですよね。簡単そうに思えても意外にややこしかったり、処理的に不都合があったりで...大変です--;
でも、ちゃんと数式で表せてコンピュータで処理できた時の達成感もひとしおですよね^^

またのご訪問お待ちしています!m(_ _)m

すごい!

はじめてこのブログに来ました。はじめまして
僕もC言語勉強しててゲーム作る際に円と円の当たり判定の作り方がいまいち分からなかったんですけどやっとわかりました!
これからもこのブログを読みたいと思います

Re: すごい!

ご訪問ありがとうございます。管理人の とらすけ です。
そう言っていただけると非常に嬉しいです^^
ZOLNさんのサイトにもお邪魔しました。
ゲーム作りも受験も頑張ってください!^^
カテゴリー
ようこそ!
Author: Torasuke
Profile: 地元大学の情報系学部に息をひそめる二回生。
   SA SW


ブログ内検索
最近のコメント
オススメ
京都の大学生のラボブログ
Python,Java,Objective-C,GAE,Macなど
Python独習中の大学生のブログ


ltzz.info
ここの管理者さんには謁見済み!(えっ

 Use OpenOffice.org
無補償でも良いなら、MSOfficeよりOpenOfficeで十分です。

Mozilla Firefox ブラウザ無料ダウンロード
当サイトは、Firefoxというブラウザで動作確認しています。私は以前、IE派でしたが、一度乗り換えて慣れてしまうと、Firefoxのほうが便利だということを実感しました。

是非よろしくお願いします。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。