プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

任意の3点を通る円を求める方法

一直線上にない任意の3点が与えられれば、その3点を通る円を求めることができます。

ここでは、任意の3点を通る円の中心座標と半径を求める方法を2種類の方法で紹介します。

 

なお、以下では、円の方程式を、

{ \displaystyle
 (x - c_x)^2 + (y - c_y)^2 = r^2
}

とし、点{ \displaystyle
C(c_x, c_y)
}が円の中心点の座標、{ \displaystyle r}が半径とします。

また、任意の3点{ \displaystyle P_1,P_2,P_3}の座標をそれぞれ{ \displaystyle (x_0, y_0), (x_1, y_1), (x_2, y_2) } とします。

 

1.連立方程式から求める方法

任意の3点の座標を円の方程式に代入すると、

{ \displaystyle (x_0 - c_x)^2 + (y_0 - c_y)^2 = r^2}

{ \displaystyle (x_1 - c_x)^2 + (y_1 - c_y)^2 = r^2}

{ \displaystyle (x_2 - c_x)^2 + (y_2 - c_y)^2 = r^2}

となります。ここで、

第1式-第2式とすると

{ \displaystyle (x_0 - c_x)^2 - (x_1 - c_x)^2 + (y_0 - c_y)^2 - (y_1 - c_y)^2 = 0 }

となり、第2式-第3式とすると

{ \displaystyle (x_1 - c_x)^2 - (x_2 - c_x)^2 + (y_1 - c_y)^2 - (y_2 - c_y)^2 =  0 }

となります。

この両式を展開すると、{ \displaystyle c_x, c_y}の2次の項が消え、

{ \displaystyle 2(x_1 - x_0)c_x + 2(y_1 - y_0)c_y + x_0^2 - x_1^2 + y_0^2 - y_1^2 = 0 }

{ \displaystyle 2(x_2 - x_1)c_x + 2(y_2 - y_1)c_y + x_1^2 - x_2^2 + y_1^2 -  y_2^2 = 0 }

となります。

あとは、一次方程式として{ \displaystyle c_x, c_y}を求めることができます。

{ \displaystyle c_x,c_y}が求まれば、円の方程式に代入して、半径{ \displaystyle r}も求めることができます。

(以下の式展開は省略します)

2.幾何学的に求める方法

1.による方法で求めるのでもいいのですが、幾何学的に求めると非常に簡単に求められるので、まとめておきます。

円と任意の3点の関係が下記のようになっていると仮定します。

円周上の3点の図

ここで、円周上の2点を結ぶ線分の中点を通り、この線分に垂直な直線を考えると、この直線は必ず円の中心Cを通過していることを使います。

線分{ \displaystyle CP_1, CP_2}について考えると、同じ円周上の点であるので、これらの線分の長さは半径に等しく{ \displaystyle r}になります。すると、△{ \displaystyle CP_{1}P_{2}}は二等辺三角形になります。二等辺三角形の底辺を2等分した点Eと残りの頂点Cを結ぶ直線は、底辺に垂直になることからわかります。

そこで、{ \displaystyle P_{1}P_{2}}の中点をE、{ \displaystyle P_{2}P_{3}}の中点をFとすると、 直線CEと直線CFの交点が円の中心となります。

 

これを具体的に計算して求めればOKです。

点Eおよび点Fの座標を{ \displaystyle (e_{x}, e_{y}), (f_{x}, f_{y})}とおき、円の中心を通る座標軸に平行な直線から直線CE、CFまでの反時計回りに求めた角度を{ \displaystyle \alpha, \beta}とします。

したがって、直線CEと直線CFの方程式は、それぞれ、{ \displaystyle \tan\alpha, \tan\beta}が直線の傾きを表していることから、

{ \displaystyle y - c_y = \tan\alpha (x - c_x ) }

{ \displaystyle y - c_y = \tan\beta (x - c_x ) }

ここで、

{ \displaystyle \tan\alpha = \frac{e_y - c_y}{e_x - c_x} }

{ \displaystyle \tan\beta = \frac{f_y - c_y}{f_x - c_x} }

となります。

これより、交点を求めるために、それぞれの式に点Eおよび点Fの座標を代入して、

{ \displaystyle e_y - c_y = \tan\alpha (e_x - c_x) }

{ \displaystyle f_y - c_y = \tan\beta (f_x - c_x) }

{ \displaystyle c_y}を消せば、

{ \displaystyle e_y - f_y = e_{x}\tan\alpha - f_{x}\tan\beta - c_{x}\tan\alpha + c_{x}\tan\beta}

{ \displaystyle c_x = \frac{e_y - f_y - e_{x}\tan\alpha + f_{x}\tan\beta}{ \tan\beta - \tan\alpha } }

と求められます。

一方、{ \displaystyle c_y}は、

{ \displaystyle c_y = e_y - (e_x - c_x)\tan\alpha}

となり、円の半径{ \displaystyle r}は、

{ \displaystyle r = |CP_1|=|CP_2|=|CP_3|=\sqrt{(x_1-c_x)^2 + (y_1 - c_y)^2 } }

と求めることができます。

 

なお、角度{ \displaystyle \alpha, \beta}は、

{ \displaystyle \alpha = \arctan(\frac{y_2 - y_1}{x_2 - x_1}) + \frac{\pi}{2} }

{ \displaystyle \beta = \arctan(\frac{y_3 - y_2}{x_3 - x_2}) + \frac{\pi}{2} }

としても求められます。

 

ちなみに、円弧{ \displaystyle P_{1}P_{3}}の間の角度を{ \displaystyle \theta}とすると、これはベクトル{ \displaystyle CP_1}およびベクトル{ \displaystyle CP_3}の内積を用いて、

{ \displaystyle CP_{1}\cdot CP_{3} = r^2 \cos\theta }

より、

{ \displaystyle \theta = \arccos\frac{CP_{1}\cdot CP_{3}}{r^2} = \arccos\frac{(x_1 - c_x)(x_3 - c_x) + (y_1 - c_y)(y_3 - c_y)}{r^2} }

と求めることができます。


この計算手順のとおりにプログラムを書けば、3点を通る円の中心と半径を求めることができます。