黒目(円C)が目玉(円A)に内接しているとき、黒目の中心(x,y)は、点A=(a1,a2)を中心とする半径(ar-cr)の円(これを円Dとしましょう)の円周上にあります。
(1) マウスのカーソル点B=(b1,b2)が円Dの中にある場合には、黒目(円C)の中心が点Bと一致している、ってのは如何でしょう。このときには黒目は目玉の中にあるけれども、内接してはいない。
それでオッケーであれば、
もし(b1-a1)^2+(b2-a2)^2 ≦ (ar-cr)^2 ならば (x,y)=(b1,b2)
(ここで、^2 は、二乗する、って意味です。)
とすれば良い。
(2) マウスのカーソル(b1,b2)が円Dの外にある場合:
(x,y)はまた、直線m上にあります。
直線mは点B=(b1,b2)と点A=(a1,a2)を通っています。
んですから、直線mと円Dの交点を求めればよい。
原点を(a1,a2)にずらした座標系(X,Y)で考えれば簡単です。つまり
(X,Y)=(x-a1,y-a2)
という変換をしてやると、
点A=(0,0)
点B=(b1-a1,b2-a2)
円D= {(X,Y) | X^2+Y^2=(ar-cr)^2}
ですから、連立方程式
X^2+Y^2=(ar-cr)^2 …(イ)
k X=(b1-a1) …(ロ)
k Y=(b2-a2) …(ハ)
を満たすX,Y,kを求める問題です。
(イ)の両辺を(k^2)倍してみると
(k X)^2+(k Y)^2=(k^2)((ar-cr)^2)
であるから(ロ)(ハ)を代入して
(b1-a1)^2+(b2-a2)^2=(k^2)((ar-cr)^2)
ここで、黒目は目玉より小さい。つまり(ar-cr)>0なんだから、両辺を((ar-cr)^2)で割ることができて
(k^2)=((b1-a1)^2+(b2-a2)^2)/((ar-cr)^2)
となる。両辺の平方根(sqrt)をとれば、kが決まります。
k=sqrt(((b1-a1)^2+(b2-a2)^2)/((ar-cr)^2))
そして(2)の条件から、k>1である。だからk=0になることはないんで、kを分母にしても大丈夫。
X=(b1-a1)/k
Y=(b2-a2)/k
最後に、原点をずらしてあったのを元にもどして、
x=X+a1
y=Y+a2
によって(x,y)が計算できます。
●そうすると、(1)(2)を合わせて、
k=sqrt(((b1-a1)^2+(b2-a2)^2)/((ar-cr)^2))
if k ≦1 then (x,y)=(b1,b2) else (x,y)=((b1-a1)/k+a1,(b2-a2)/k+a2)
これが「簡素」かどうかはなんとも言えませんが。
kony0さん、やっほー
お礼
ありがとう。