点と点の当たり判定(後編)

アバター
ナムアニクラウド
記事: 16
登録日時: 15年前
住所: 茨城県

点と点の当たり判定(後編)

投稿記事 by ナムアニクラウド » 13年前

 連投御免。しかもすごい長い。
 今回は、「点と点の当たり判定」について突き詰めて行きましょう。
なんだかマニアックな話になると思うのでご注意ください。あと間違いがありましたら優しく教えてね。

 前編で考えた当たり判定の条件は次の通りでした。
  2つの点( x1, y1 ), ( x2, y2 ) は、小さな正の実数εがあるとき、|x1-x2|<ε かつ |y1-y2|<ε ならば当たっている。
この方法を思いついた経緯としては、「2つの点が当たっている状況なんて、点どうしが一致しているしかないじゃん」という考え方からでした。
ゲームプログラミング的には「使えればおk」なので問題ありませんが、納得していない人もいるのではないでしょうか。自分だけかしら?

 前回はこの方法で点どうしの当たり判定がとれると証明したわけではないので、前述の法則に当てはまらないヤヴァイ点があるかも知れないということは否定できないのです。
そういうわけで、今回はこの当たり判定について厳密に考えてみます。

当たっているとはどういうことか?

 当たり判定とは何か? ・・・というのは前編で話しましたが、あれは証明に役立つような定義にはなり得ません。
「まあ、見た目当たってればいいじゃん?」というくらいの話ですので、「当たっているとは何か」といわれれば撃沈じゃないか、と自分は思うわけです。

 さあ、平面上に2つの図形A,Bがあるとき、これらが「当たっている」というのはどういった状態でしょうか?
自分なりの定義は次のとおりです。
  平面R2の、任意の部分集合A,Bについて、「AとBが当たっている」とはAとBが共通部分を持つということである。

・・・。
なんのこっちゃ? と思った人挙手。
えー、簡単にいえば、この文でいう「平面R2」とは、平面上の全ての点を含む集合のことです。
そしてその部分集合とは、平面上の特定の点を含む領域、すなわち平面図形のことです。
AとBの共通部分というのは、AにもBにも含まれる点の集合のことです。

 「集合」という概念をよく知らない人も多いと思いますので、上の文章の意味を書いておきます。それは次のとおりです。
  平面図形A,Bが当たっているというのは、Aの領域にもBの領域にも含まれる点が1つ以上ある、すなわちAの領域とBの領域が重なるということである。

 さて、この定義をベン図で表します。集合をよく知らない人も聞いたことはあるでしょうか。
次の図は、平面R2の部分集合A,Bが共通部分を持つ、つまり図形AとBが当たっている状態のベン図です。
collision.png
collision.png (7.63 KiB) 閲覧数: 81 回
興味深いことに、このベン図はまさしく平面図形A,Bが当たっている様子を表しています。

ぼくのかんがえたさいきょうの"点と点の当たり判定"

 さあ、この定義に従って点と点の当たり判定を考えてみましょう。

 「点」は、平面R2の部分集合と考えることができます。つまり点もりっぱな平面図形です。
いま、点P( x1, y1 ), Q( x2, y2 )が当たっていると仮定しましょう。
先ほどの定義より、P,Qが当たっているならば、PにもQにも含まれる点が1つはあるはずです。その点をRとします。

Pに含まれる点R、すなわちPの部分集合Rはどのようなものでしょうか。図形Pを集合で表すと、P={ ( x1, y1 ) }となります。
図形「点」は1つ点を含む集合といえるので、この集合の部分集合はR=Pしかあり得ません。「ある点に含まれる点」は、その点自身にほかならないということです。
点RはPにもQにも含まれるので、とうぜんR=Qでもあります。
すると、P=R, Q=R となり、P=Qが成り立ちます。ここにおいて、ついに点どうしの当たり判定を証明することができるのです。

 さあ、P = Qを整理しましょうか。
P = Q より
{ ( x1, y1 ) } = { ( x2, y2 ) } なので、
( x1, y1 ) = ( x2, y2 )

よって x1 = x2 かつ y1 = y2

PとQは「当たっている点」なので、定義から次の命題が成り立ちます。
  点P( x1, y1 )と点Q( x2, y2 )が当たっていることは、x1 = x2 かつ y1 = y2であることと同じである。

やったー! すっきり!!!!!!
あとは前編と同じくこの命題を表したプログラムに、誤差に関する処理を与えてやればおkです。

[11/16追記]
 と、思ったのですが、冷静に考えてみるとここで求めた命題は「点P( x1, y1 )と点Q( x2, y2 )が当たっているならば、x1 = x2 かつ y1 = y2」でした。
これではx1 = x2 かつ y1 = y2を満たしてもPとQが当たっているとは言い張れません。
逆の命題を考えてみましょう。

 ここでは座標が( a, b )である点を表す集合を { ( a, b ) } と表すことにします。

 いま、点P( x1, y1 )と点Q( x2, y2 )があり、x1 = x2 かつ y1 = y2 を満たしていると仮定します。
このとき、( x1, y1 ) = ( x2, y2 ) すなわち P = Q となります。
しかし、これではまだ当たったことになりません。
前述の定義でもって当たっているかどうかを判断するために、図形を集合で表す必要があります。

 いま、{ P } = { ( x1, y1 ) }, { Q } = { ( x2, y2 ) } といえます。
要素がすべて等しい集合どうしは等しいので、{ P } = { Q } が成り立ちます。
このとき、{ P }と{ Q }は必ず共通部分を持ちますので、「共通部分を持つことは当たっていることと同じ」という定義から、
  x1 = x2 かつ y1 = y2ならば、点P( x1, y1 )と点Q( x2, y2 )が当たっている。
と言えることになります。

大変失礼いたしました。
[追記ここまで]


 今回は「点と点の当たり判定」でがっつり話し込んでしまいましたが、まだまだ他の図形の当たり判定があります。
みんなが知りたいあんな当たり判定やこんな当たり判定も・・・?
え?まだやるのかって? ・・・はい、こんなノリでもうしばらくやりますww
とはいえ、前編はゲームプログラミングに即効の内容にしたいと思っていますので、これに懲りず前編だけでも目を通していただければ幸いです。
というか、これ以降の当たり判定の解説はここまで長くならないと思います。たぶん・・・

最後に一言。
風邪ひいてるのになんでこんな時間まで起きてるんだ自分は。
最後に編集したユーザー ナムアニクラウド on 2011年11月16日(水) 18:10 [ 編集 1 回目 ]

コメントはまだありません。