円と点の内包関係の判定

最強最速アルゴリズマー養成講座:あなたの論理的思考とコーディング力は3倍高められる」を読んだら、ある点が円に内包されているか判定する関数があった。

bool checkInside(int x1, int y1, int x2, int y2, int r)
{
    return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) <= r*r;
}

(x1,y1) が円の中心で (x2,y2) が点の座標だけど、2乗ってことは面積で・・・うーん、分からない。ページに「点も半径0の円として管理すると、より見通しがよくなります」って書いてあるからきっと円の内包に関することだって思ってぐぐった。

1.d+Rb

2円(1円は内包されている)の関係性について

d は中心間の距離で Ra Rb は半径だからこんな感じ?

そしてこういうことだね!

2つの座標から距離を計算するにはどうすればいいんだっけ? 長方形の対角線だからきっとルートに関係することだ。

三平方の定理を用いれば可能ですね。

長辺の2乗 + 短辺の2乗 = 対角線の2乗

対角線 = √(長辺の2乗 + 短辺の2乗)

http://oshiete.goo.ne.jp/qa/2168534.html

三平方の定理はこんなやつだったと記憶。

内包関係は d+Rb < Ra で、問題の設定上 Rb=0 だから判定式は d < Ra ってことになるね。

距離の計算は d = sqrt(abs(x1-x2)^2 + abs(y1-y2)^2) だけど、どうせ2乗するから abs は要らない。

あと、d < Ra だったら d^2 < Ra^2 も多分成り立つので、そうすれば sqrt も省ける。結局 (x1-x2)^2 + (y1-y2)^2 < Ra^2 で点が円に内包されてるか判定できるんだね。

bool checkInside(int x1, int y1, int x2, int y2, int r)
{
    return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) <= r*r;
}

というわけで、読めました。< じゃなくて <= だから点が円周上にあっても内側判定になるところが違うけど。