3点を通る円の中心と半径

3点を通る円
3点を通る円

POINT

  • 円の通る3点から中心・半径を求める一般式を導出.
  • 導出した式で計算フォームを作成.

昔,Excelに数式ベタ打ちで円の半径を求めた際の計算をメモしておきます.単純な「連立方程式」の問題ですが,一般解はそこまで単純な形になりません.

計算フォームも作成しました(この記事で導出した数式を,jQueryで計算):

1点目 $x_1=$ $y_1=$
2点目 $x_2=$ $y_2=$
3点目 $x_3=$ $y_3=$
中心$(a,b)=$ 半径 $r=$

円の方程式

中心$(a,b)$,半径$r$の円は
\begin{align}
(x-a)^2+(y-b)^2=r^2
\end{align}という方程式を満たす$(x,y)$で与えられます.


3つの未知数(パラメータ)

  1. $a$(中心の$x$座標)
  2. $b$(中心の$y$座標)
  3. $r$(円の半径)

を決めるためには,3つの方程式が必要です.したがって,円の通る3点$(x_1,y_1)$, $(x_2,y_2)$, $(x_3,y_3)$を与えれば円の方程式を決定することができます.

円の中心

円の通る3点$(x_1,y_1)$, $(x_2,y_2)$, $(x_3,y_3)$を与えたことで,未知数$a,b,r$に関する連立方程式
\begin{align}
\begin{cases}
\,(x_1-a)^2+(y_1-b)^2=r^2 &\qquad\text{(1)} \\
\,(x_2-a)^2+(y_2-b)^2=r^2 &\qquad\text{(2)}\\
\,(x_3-a)^2+(y_3-b)^2=r^2 &\qquad\text{(3)}
\end{cases}
\end{align}が得られます.これは未知数$a,b,r$に関する2次式であるため,このままでは扱いにくい形です.


ここで「式( i )$-$式( j )」とすれば
\begin{align}
&(x_i+x_j-2a)(x_i-x_j) \\
&\quad +(y_i+y_j-2b)(y_i-y_j) = 0
\end{align}と未知数$a,b,r$に関する2次式を消去することができます(*1).これを整理すると
\begin{align}
&(x_i-x_j)a + (y_i-y_j)b \\
&\quad = \frac{1}{2}\left[(x_i^2-x_j^2) + (y_i^2-y_j^2)\right]
\end{align}となります.


未知数が$a,b$の2つに減ったため,必要な方程式の数は2つになります.したがって,上の式で$(i,j)=(1,2)$,$(i,j)=(2,3)$として得られる
\begin{align}
\begin{cases}
&\!\!\! (x_1-x_2)a + (y_1-y_2)b \\
&\qquad = \frac{1}{2}\left[(x_1^2-x_2^2) + (y_1^2-y_2^2)\right] \\
&\!\!\! (x_2-x_3)a + (y_2-y_3)b \\
&\qquad = \frac{1}{2}\left[(x_2^2-x_3^2) + (y_2^2-y_3^2)\right]
\end{cases}
\end{align}を解けば$a,b$を求めることができます.


これは,行列の形で書き直すと
\begin{align}
&\!\!\!
\begin{pmatrix}
x_1-x_2 & y_1-y_2 \\
x_2-x_3 & y_2-y_3
\end{pmatrix}
\begin{pmatrix}
a \\
b
\end{pmatrix}\\
&\qquad\qquad =\frac{1}{2}
\begin{pmatrix}
|\boldsymbol{X}_1|^2-|\boldsymbol{X}_2|^2\\
|\boldsymbol{X}_2|^2-|\boldsymbol{X}_3|^2
\end{pmatrix}
\end{align}となります($\boldsymbol{X}_i=(x_i,y_i)$としました.$|\boldsymbol{X}_i|$はベクトルの大きさです(つまり$|\boldsymbol{X}_i|^2=x_i^2+y_i^2$)).


このままでは見づらいので,左辺の$2\times2$行列を
\begin{align}
M=
\begin{pmatrix}
\alpha &\beta \\
\gamma&\delta
\end{pmatrix}
\end{align}としましょう.よく知られているように,$M$の逆行列は
\begin{align}
M^{-1}=\frac{1}{\alpha\delta-\beta\gamma}
\begin{pmatrix}
\delta &-\beta \\
-\gamma&\alpha
\end{pmatrix}
\end{align}なので,未知数$a,b$は
\begin{align}
\begin{pmatrix}
a \\
b
\end{pmatrix}
=&\frac{1}{2(\alpha\delta-\beta\gamma)} \times \\
&\quad
\begin{pmatrix}
\delta &-\beta \\
-\gamma&\alpha
\end{pmatrix}
\begin{pmatrix}
|\boldsymbol{X}_1|^2-|\boldsymbol{X}_2|^2\\
|\boldsymbol{X}_2|^2-|\boldsymbol{X}_3|^2
\end{pmatrix}
\end{align}であることがわかりました.

円の半径

上で円の中心$(a,b)$がわかったので,円の方程式から
\begin{align}
r=\sqrt{(x_i-a)^2 + (y_i-b)^2}
\end{align}と計算することができます($(x_i,y_i)$は,3点$(x_1,y_1)$, $(x_2,y_2)$, $(x_3,y_3)$の中の任意の1点).

別解:垂直二等分線の交点を計算

円の中心は,2直線

  • $l_{12}$:2点$(x_1,y_1)$と$(x_2,y_2)$の垂直二等分線
  • $l_{23}$:2点$(x_2,y_2)$と$(x_3,y_3)$の垂直二等分線

の交点として求めることができます.

【Step.1:直線$l_{ij}$の方程式を求める】
直線$l_{ij}$の方程式を
\begin{align}
y=ax+b
\end{align}として,未知数$a,b$を決定しましょう.


【Step.1-(1):直線$l_{ij}$の傾き$a$を求める】
直線$l_{ij}$は「2点$(x_i,y_i)$と$(x_j,y_j)$を通る直線」と直交します.「2点$(x_i,y_i)$と$(x_j,y_j)$を通る直線」の傾きは
\begin{align}
\color{red}{\frac{y_i-y_j}{x_i-x_j}}
\end{align}ですから,直線$l_{ij}$の傾き$a$は
\begin{align}
a\cdot \color{red}{\frac{y_i-y_j}{x_i-x_j}} =-1
\end{align}を満たします.したがって,
\begin{align}
a=-\frac{x_i-x_j}{y_i-y_j}
\end{align}であることがわかります.


【Step.1-(2):直線$l_{ij}$の切片$b$を求める】
また,直線$l_{ij}$は2点$(x_i,y_i)$と$(x_j,y_j)$の中点
\begin{align}
\left(\frac{x_i+x_j}{2},\frac{y_i+y_j}{2}\right)
\end{align}を通るので$y=ax+b$に代入すると
\begin{align}
\frac{y_i+y_j}{2} = -\frac{x_i-x_j}{y_i-y_j}\cdot \frac{x_i+x_j}{2} + b
\end{align}が成り立ちます.これを$b$について解けば
\begin{align}
b&=\frac{y_i+y_j}{2} + \frac{x_i-x_j}{y_i-y_j}\cdot \frac{x_i+x_j}{2} \\
&=\frac{(x_i^2+y_i^2)-(x_j^2+y_j^2)}{2(y_i-y_j)}
\end{align}となります.

以上より,直線$l_{ij}$の方程式が
\begin{align}
y=-\frac{x_i-x_j}{y_i-y_j} x
+\frac{(x_i^2+y_i^2)-(x_j^2+y_j^2)}{2(y_i-y_j)}
\end{align}であることがわかりました(注:これは1つ目の方法で円の方程式から求めた式とおなじものです).

【Step.2:円の中心座標$(a,b)$を求める】
上で求めた直線$l_{ij}$の方程式に$(i,j)=(1,2),(2,3)$を代入して2直線$l_{12}$, $l_{23}$の方程式を作ります.2式を連立して$x,y$について解けば,円の中心座標$(a,b)$を求めることができます.

【Step.3:円の半径$r$を求める】
上で円の中心$(a,b)$がわかったので,円の方程式から
\begin{align}
r=\sqrt{(x_i-a)^2 + (y_i-b)^2}
\end{align}と計算することができます($(x_i,y_i)$は,3点$(x_1,y_1)$, $(x_2,y_2)$, $(x_3,y_3)$の中の任意の1点).

*1:因数分解の公式$X^2-Y^2=(X+Y)(X-Y)$を使いました.