直線と円の交点を求める

HOME>>メモ>>図形処理の基礎>>直線と円の交点を求める

陰関数で表わす

直線と円の交点について考えてみます。 点$(x_\mathrm{P},y_\mathrm{P})$を中心とした半径$r$の円と、直線$ax+by+c=0$の交点を考えます。

上の図で、点Hの座標は「点と直線の距離を求める」で求めました。 $d=ax_\mathrm{P}+by_\mathrm{P}+c$と置けば、点Hの座標は次のように書けます。

\begin{eqnarray*} x &=& x_\mathrm{P} - a\frac{d}{a^2+b^2} \\ y &=& y_\mathrm{P} - b\frac{d}{a^2+b^2} \end{eqnarray*}

次に線分HQの長さを考えます。この長さは三平方の定理から簡単に求めることができます。 線分OHの長さは$d/\sqrt{a^2+b^2}$なので

\[ \mathrm{HQ} = \sqrt{r^2-\frac{d^2}{a^2+b^2}} \]

となります。

ここで、直線に沿った向きのベクトルを$\overrightarrow{w}$とすると

\[ \overrightarrow{\mathrm{HQ}} = \pm \sqrt{r^2-\frac{d^2}{a^2+b^2}}\frac{\overrightarrow{w}}{|\overrightarrow{w}|} \]

と書くことができます。 $\overrightarrow{w}$$\overrightarrow{v}$と直交するベクトルなので$\overrightarrow{w}=(b,-a)$です。

これで点Hの座標と、点Hと点Qの相対座標がわかりました。 後はこれらを足しあわせれば点Qの座標が出ます。

\begin{eqnarray*} x &=& x_\mathrm{P} - a\frac{d}{a^2+b^2} \pm \sqrt{r^2-\frac{d^2}{a^2+b^2}}\frac{b}{\sqrt{a^2+b^2}}\\ y &=& y_\mathrm{P} - b\frac{d}{a^2+b^2} \mp \sqrt{r^2-\frac{d^2}{a^2+b^2}}\frac{a}{\sqrt{a^2+b^2}} \end{eqnarray*}

これをまとめると点Pの座標は次式のようになります。

\begin{eqnarray*} x &=& \frac{-ad \pm b\sqrt{(a^2+b^2)r^2 - d^2}}{a^2+b^2} + x_\mathrm{P} \\ y &=& \frac{-bd \mp a\sqrt{(a^2+b^2)r^2 - d^2}}{a^2+b^2} + y_\mathrm{P} \end{eqnarray*}

特に、円の中心が原点の場合、$d=c$となります。

媒介変数表示で表わす

直線が媒介変数表示されている場合についても考えてみます。

\begin{eqnarray*} x &=& at + x_0\\ y &=& bt + y_0 \end{eqnarray*}

まずは点Hの座標ですが、「点と直線の距離を求める」で求めたように

\[ t=\frac{a(x_\mathrm{P}-x_0)+b(y_\mathrm{P}-y_0)}{a^2+b^2} \]

となる$t$の点です。

$d=a(y_\mathrm{P}-y_0)-b(x_\mathrm{P}-x_0)$とすれば、陰関数表示の場合と同様に

\[ \mathrm{HQ} = \sqrt{r^2-\frac{d^2}{a^2+b^2}} \]

です。これから、

\begin{eqnarray*} t &=& \frac{a(x_\mathrm{P}-x_0)+b(y_\mathrm{P}-y_0)}{a^2+b^2} \pm \sqrt{r^2-\frac{d^2}{a^2+b^2}}\frac{1}{\sqrt{a^2+b^2}}\\ &=& \frac{a(x_\mathrm{P}-x_0)+b(y_\mathrm{P}-y_0) \pm \sqrt{(a^2+b^2)r^2 - d^2}}{a^2+b^2} \end{eqnarray*}

実際にやってみよう

実際にやってみました。 SVGにJavascriptを埋め込んで簡単なアニメーションを作ってみました。 黒の直線と円が与えられた時の交点を求めます。赤の小さい円が交点です。
SVGファイルをダウンロードする

残念ながら現在使用しているブラウザでは表示できません。 IE以外のブラウザの最新版をダウンロードしてください。