前回から少し時間が経ってしまいましたが、円と円の当たり判定をしたいと思います。
「円」は中心点の座標と半径をデータに持ちます。
この当たり判定はSTGなどで使うと便利です。
円どうしの当たり判定
この図をご覧ください。
この2つの円は当たっていますね。
こうして当たっている2つの円をよく観察してみてください。
中心点の間の距離が2つの円の半径の和より小さいことが分かるでしょうか?
この性質は、当たっている2つの円ならどんな状態でも満たしますので、これを当たり判定の条件としましょう。
いま、円Aの半径をrA、円Bの半径をrBとすると、
2つの円が当たるための条件は、
AB ≦ rA + rB
となります。ABは中心点どうしの距離です。
前回まで使っていた2点間の距離の公式 √{ ( x1 - x2 )2 + ( y1 - y2 )2 } を使うとよいでしょう。
証明
円が2つあるとき、その位置関係は5通りあります。以下の図のとおりです。
(1) 共有点を持たない
(2) 外接している
(3) 交わっている
(4) 内接している
(5) 包含している となっています。
このうち2つの円が当たっているといえるのは(2) ~ (5)です。
さて、先ほどは「当たっている円の共通点」を探して条件を求めましたが、その考え方で証明をすることはできません。
当たっている円の共通点を見つけても、それは「当たっているならば~」という命題の証明にしかならず、求めたい「~ならば当たっている」を導き出すことはできないのです。
そこで、論理の分野でとても重要な「対偶」という方法を使って証明をすることにします。
対偶とは、「A ならば B」のとき「Bでない ならば Aでない」が成り立つ、という論理の性質です。
記号で書くと 「A ⇒ B のとき ¬A ⇐ ¬B」といったところでしょうか。
矢印の向きを逆にして、左右の条件式を否定したものを対偶と呼びます。
そして、命題が成り立つとき、その対偶もまた成り立つのです。
では、「Bでない ならば Aでない」・・・すなわち、「当たっていないならば~」を考えましょう。
今回証明したいのは「AB ≦ rA + rB ならば当たっている」なので、「当たっていないならば AB > rA + rB」を考えることになります。
次の図は、2つの円が当たっていない状態を表しています。
いま、2つの当たっていない円A,Bがあるとき、その中心点どうしをつなぐ線分はそれぞれの円周と必ず交わります。
その交点をそれぞれC, Dとします。このとき、CDは円どうしの間の距離になっています。
またこのとき、集合として考えると、点Cは円Aに含まれ、点Dは円Bに含まれます。
このとき、CD≠0です。それはCD=0ならばDは円Aの円周上に、CはBの円周上にあり、そのとき点Dは円Aに含まれ、点Cは円Bに含まれ、円A,Bが共通部分を持つ(当たっている)ことになってしまうからです。
さて、いま明らかに AB = AC + CD + DB です。
すると、円Aの半径をrA、円Bの半径をrBとしたとき、AB= rA + rB + CD です。
するとCD>0なので AB > rA + rB となります。
はじめに「AとBが当たっていない」と仮定して考えたので、これにて「当たっていないならば~」が求められました。それは以下のとおりです。
半径rAの円A, 半径rBの円Bについて、 AとBが当たっていない ⇒ AB > rA + rB
それでは、その対偶を書いてみましょう。
半径rAの円A, 半径rBの円Bについて、 AB ≦ rA + rB ⇒ AとBが当たっている
これにて、円どうしの当たり判定の条件を導くことができました。
次回は「軌跡判定」を考えたいと思います。乞うご期待。
円どうしの当たり判定
RE: 円どうしの当たり判定
実際にプログラムを組むときは
AB ≦ rA + rB よりも
(AB)2 ≦ (rA + rB)2
を計算したほうが平方根を求めなくてよいので軽くなると思います:-)
AB ≦ rA + rB よりも
(AB)2 ≦ (rA + rB)2
を計算したほうが平方根を求めなくてよいので軽くなると思います:-)
Re: 円どうしの当たり判定
>h2so5さん
ご指摘ありがとうございます。そうですね。自分もプログラムを書くときはそうしています。
なんで記事に書かなかったんだろうと思いましたw
今後の記事もどうぞよろしくお願いします。
ご指摘ありがとうございます。そうですね。自分もプログラムを書くときはそうしています。
なんで記事に書かなかったんだろうと思いましたw
今後の記事もどうぞよろしくお願いします。