您當前的位置:首頁 > 攝影

三角形的外接圓

作者:由 二圈妹 發表于 攝影時間:2019-09-19

行列式

三角形的外接圓圓心也就是三角形的外心,一搜到處都有球外心的公式:

(O_x, O_y) =  ({\frac  {{\begin{vmatrix}x_{1}^{2}+y_{1}^{2}&y_{1}&1\\x_{2}^{2}+y_{2}^{2}&y_{2}&1\\x_{3}^{2}+y_{3}^{2}&y_{3}&1\end{vmatrix}}}{2{\begin{vmatrix}x_{1}&y_{1}&1\\x_{2}&y_{2}&1\\x_{3}&y_{3}&1\end{vmatrix}}}},{\frac  {{\begin{vmatrix}x_{1}&x_{1}^{2}+y_{1}^{2}&1\\x_{2}&x_{2}^{2}+y_{2}^{2}&1\\x_{3}&x_{3}^{2}+y_{3}^{2}&1\end{vmatrix}}}{2{\begin{vmatrix}x_{1}&y_{1}&1\\x_{2}&y_{2}&1\\x_{3}&y_{3}&1\end{vmatrix}}}})\\

如果我們想推導一下的話,首先圓的方程式為:

a(x^2+y^2)+bx+cy+d = 0

,代入三個點:

a(x^2+y^2)+bx+cy+d = 0 \\ a(x_1^2+y_1^2)+bx_1+cy_1+d = 0 \\ a(x_2^2+y_2^2)+bx_2+cy_2+d = 0  \\ a(x_3^2+y_3^2)+bx_3+cy_3+d = 0

寫成矩陣形式:

\begin{bmatrix}x^2+y^2 &x & y & 1 \\x_{1}^{2}+y_{1}^{2}&x_1&y_{1}&1\\x_{2}^{2}+y_{2}^{2}&x_2&y_{2}&1\\x_{3}^{2}+y_{3}^{2}&x_3&y_{3}&1\end{bmatrix} \begin{bmatrix} a \\ b \\ c \\ d \end{bmatrix} =  \begin{bmatrix} 0 \\ 0 \\ 0 \\ 0 \end{bmatrix}\\

也就是行列式:

\begin{vmatrix}x^2+y^2 &x & y & 1 \\x_{1}^{2}+y_{1}^{2}&x_1&y_{1}&1\\x_{2}^{2}+y_{2}^{2}&x_2&y_{2}&1\\x_{3}^{2}+y_{3}^{2}&x_3&y_{3}&1\end{vmatrix} = 0\\

展開:

(x^2+y^2)\begin{vmatrix} x_1&y_{1}&1\\x_2&y_{2}&1\\x_3&y_{3}&1\end{vmatrix} - x \begin{vmatrix} x_{1}^{2}+y_{1}^{2} & y_1 & 1 \\x_{2}^{2}+y_{2}^{2}&y_{2}&1\\x_{3}^{2}+y_{3}^{2}&y_3&1\end{vmatrix} + y\begin{vmatrix} x_{1}^{2}+y_{1}^{2} & x_1 & 1 \\x_{2}^{2}+y_{2}^{2}&x_{2}&1\\x_{3}^{2}+y_{3}^{2}&x_3&1\end{vmatrix} - \begin{vmatrix} x_{1}^{2}+y_{1}^{2} & x_1 & y_1  \\x_{2}^{2}+y_{2}^{2}&x_2&y_{2}\\x_{3}^{2}+y_{3}^{2}&x_3&y_3\end{vmatrix} = 0\\

對比就是上面的方程式:

x^2 + y^2 + \frac{b}{a}x + \frac{c}{a}y+\frac{d}{a} = 0\\

對比一下這個方程式和圓的圓心方程式:

(x-O_x)^2+(y-O_y)^2 = r^2 \\ x^2 + y^2 - 2xO_x - 2yO_y = r^2 - O_x^2 - O_y^2\\

對比上下兩式可知:

 O_x = -\frac{b}{2a}\\  O_y = -\frac{c}{2a}\\

所以有最上面的求外心的式子。

同時值得指出的還有其實分母是三角形面積公式的4倍,即:

\Delta = \frac{1}{2}\begin{vmatrix} x_1&y_{1}&1\\x_2&y_{2}&1\\x_3&y_{3}&1\end{vmatrix}\\

這個式子可以透過簡單的叉乘也可以透過格林公式證明。

初中幾何

如果我們就是簡單的算一下2維平面上的三角形的外心還要引入矩陣,行列式在有些情況下就顯得有點大材小用。有時候就從簡,直接利用這個三角形的外心是三邊的垂直平分線的交點既可。可能有以下幾種情況:

三角形的外接圓

算出兩條直線,找到它們的交點,即算出三角形的外心:

def

circumcircle

triangle

):

v1

v2

v3

=

triangle

x1

y1

=

v1

x2

y2

=

v2

x3

y3

=

v3

absy1y2

=

abs

y1

-

y2

absy2y3

=

abs

y2

-

y3

# 這種情況三點共線,無法生成外接圓

if

absy1y2

<

EPSION

and

absy2y3

<

EPSION

return

# 第一種情況, v1和v2基本水平

if

absy1y2

<

EPSION

m2

=

-

x3

-

x2

/

y3

-

y2

mx2

=

x2

+

x3

/

2

my2

=

y2

+

y3

/

2

xc

=

x2

+

x1

/

2

yc

=

m2

*

xc

-

mx2

+

my2

# 第二種情況: v2和v3基本水平

elif

absy2y3

<

EPSION

m1

=

-

x2

-

x1

/

y2

-

y1

mx1

=

x1

+

x2

/

2

my1

=

y1

+

y2

/

2

xc

=

x2

+

x3

/

2

yc

=

m1

*

xc

-

mx1

+

my1

# 情況三:

else

m1

=

-

x2

-

x1

/

y2

-

y1

m2

=

-

x3

-

x2

/

y3

-

y2

mx1

=

x1

+

x2

/

2

mx2

=

x2

+

x3

/

2

my1

=

y1

+

y2

/

2

my2

=

y2

+

y3

/

2

xc

=

m1

*

mx1

-

m2

*

mx2

+

my2

-

my1

/

m1

-

m2

# y1y2 之間差距更大,更不容易出現直線非常靠近垂直的狀況,靠近垂直線意味著斜率很大,這樣相乘的話誤差可能會比較極端

yc

=

m1

*

xc

-

mx1

+

my1

if

absy1y2

>

absy2y3

else

m2

*

xc

-

mx2

+

my2

dx

=

x2

-

xc

dy

=

y2

-

yc

return

Circle

Point

xc

yc

),

math

sqrt

dx

*

dx

+

dy

*

dy

))

產生題圖程式碼:

標簽: y2  x2  y1  y3  M1