前回投稿した「点と点の当たり判定(後編)」に誤りがありましたので、修正しました。恥ずかしいなぁ。
点と円の当たり判定
さて、気をとり直して、今回は「点と円の当たり判定」を考えましょう。
そもそも「円」というのは、平面上のある一点からの距離が一定である点の集まりです。コンパスで描ける図形ですね。
その「一定の距離」のことを「半径の長さ」とか、たんに「半径」といいます。
ここでいう点と円の当たり判定は、ある点と円があるときに、円が囲んでいる領域の内部に点があるかどうかの判定です。
次の図を見てください。
円に当たっている点Pと、当たっていない点Qがあります。
この2つの点の違いは、円の中心点との距離が半径より小さいかどうかです。
円の中心点との距離が半径より短い点Pは当たっており、そうでない点Qは当たっていないことが分かるでしょうか。
このことは前述した円の性質からも考えられることです。
平面上で、点( x1, y1 )と点( x2, y2 )の間の距離は、
( x1 - x2 )2 + ( y1 - y2 )2 の平方根です。
いま、平面上に点P( X, Y )と、中心の座標が( x, y )で半径がrの円Oがあるとき、
円Oの中心点と点Pとの距離 √( ( x1 - x2 )2 + ( y1 - y2 )2 ) をdとします。
先ほど述べた通り、円の中心点との距離が半径より小さければ当たっているので、d≦rならばよいことになります。つまり、
√( ( x1 - x2 )2 + ( y1 - y2 )2 ) ≦ r ならば当たっていることになります。
しかし、平方根の計算をプログラムに書いてしまうと処理速度が心配です。
そこで、先ほどの式の両辺を2乗してしまいましょう。d > 0, r > 0 なので両辺2乗して問題ありません。
すると先ほどの条件が次のようになります。
( x1 - x2 )2 + ( y1 - y2 )2≦ r2
証明
ここまでは分かりやすいように噛み砕いて説明しましたが、ここからは厳密に(?)証明をしたいと思います。
前回も言いましたが、ゲームプログラミング的には「使えればおk」なのでここから先は物好きさんと自分用です。
前回「点と点の当たり判定(後編)」で、当たっているとは何かについて次のように定義しました。
平面R2の任意の部分集合A,Bについて、Aの表す図形とBの表す図形が当たっているというのは、AとBが共通部分を持つということである。
中心の座標が( a, b )で半径がrの円を表す集合をOとすると、O = { ( x, y ) | ( x - a )2 + ( y - b )2 = r2 } となります。
円は中心からの距離が半径と等しい点の集まりといえるので、このような集合で表せます。
このOは円の境界線のみを表しているので、円の内部も含めた集合を考えましょう。
この場合、中心からの距離が半径より短い点の集まりなので、その集合をO' とるすと O' = { ( x, y ) | ( x - a )2 + ( y - b )2 ≦ r2 } です。
さて、いま点P = { ( X, Y ) } と円C = { ( x, y ) | ( x - a )2 + ( y - b )2 ≦ r2 } があるとします。
ここで、PがCの部分集合であるときPとCは共通部分をもちます。
PがCの部分集合であるということは、Cが点( X, Y )を含むことになり、集合Cの要素であるための条件を、( X, Y )が満たしていることになります。
するとCの要素であるための条件のx,yにそれぞれX,Yを代入して次の条件式が現れます。
( X - a )2 + ( Y - b )2 ≦ r2
このことから、次のことがいえます。
点( X, Y ) と、中心点が( a, b )で半径rの円は、( X - a )2 + ( Y - b )2 ≦ r2 ならば当たっている
ということになります。
次回は「円と円の当たり判定」をします。
点と円の当たり判定
コメントはまだありません。