いつの間にか2週間が過ぎていた。
今回は点と線分の当たり判定を紹介します。
線分AB, 点P, Q, R があり、P は AB に当たっており、Q,R は AB に当たっておりません。
このとき、何らかの方法で点P と他の点を区別する必要があります。
そこで、線分ABの端点と対象の点P,Q,Rをつなぐベクトルを考えます。これを点P,Q,Rに関するベクトルと呼びましょう。
次のようになります。
Pに関するベクトルは逆向きです。
Qに関するベクトルは並行ではありません。
Rに関するベクトルは同じ向きです。
このことから、当たっている点に関するベクトルは逆向きになることが推測できます。
2つのベクトルが逆向きになっていることはどうやって調べればよいでしょう?
ここで、前回紹介した「ベクトルの内積」を使うと、2つのベクトルが逆向きになっているかどうかが分かります。
ベクトルの内積は次のように求めるのでした。
a・b = |a||b|cosθ
いま、2つのベクトルが逆向きなら、θ = 180°です。このとき、cosθ = -1 となります。
すると、互いに逆向きのベクトル AP, BP について、次のことが言えます。
AP・BP = -|AP||BP|
これを、点と線分の当たり判定の条件とします。
AP・BP = -|AP||BP| ⇔ 点P と線分AB は当たっている
証明はイマイチ面白くないと思ったので割愛です。
点と線分の当たり判定
RE: 点と線分の当たり判定
点に大きさがないのならいっそのこと
AB = a, AP = p として
double x = p.x / a.x;
double y = p.y / a.y;
当たってるなら 0 ≦x(or y)≦1 かつ|x-y| ≦ε みたいにしたほうがシンプルかなぁ~とか思いましたがどうでしょう?
AB = a, AP = p として
double x = p.x / a.x;
double y = p.y / a.y;
当たってるなら 0 ≦x(or y)≦1 かつ|x-y| ≦ε みたいにしたほうがシンプルかなぁ~とか思いましたがどうでしょう?
Re: 点と線分の当たり判定
なるほど、と思いまして、ひとまず証明もしました。確かに正しく当たり判定ができそうです。
これは確かにシンプルですね!
これなら内積を使う方法に比べて計算量も抑えられそうです。
自分もこのように実装してみたいと思います。アドバイスありがとうございました。
これは確かにシンプルですね!
これなら内積を使う方法に比べて計算量も抑えられそうです。
自分もこのように実装してみたいと思います。アドバイスありがとうございました。