判断点是否在三角形内(重心坐标法, Barycentric coordinates)
从矢量的角度理解重心坐标的定义
对于任意三个非共线点,附近有任何一个点,都能满足以下条件
P
=
A
+
β
A
C
⃗
+
γ
A
B
⃗
\begin{equation} \begin{split} P = A + \beta \vec{AC} + \gamma \vec{AB} \end{split} \end{equation}
P=A+βAC+γAB
其几何意义解释为,从点
A
A
A出发,沿着
A
C
⃗
\vec{AC}
AC方向走一个长度
β
∣
A
C
⃗
∣
\beta |\vec{AC}|
β∣AC∣,再沿着
A
B
⃗
\vec{AB}
AB方向走一个长度
γ
∣
A
B
⃗
∣
\gamma |\vec{AB}|
γ∣AB∣,则能够得到任意点
P
P
P的坐标(如果
β
或
γ
\beta或\gamma
β或γ为负,则表示为
A
C
⃗
\vec{AC}
AC或
A
B
⃗
\vec{AB}
AB的反方向)
如果我们将矢量操作还原为点操作,则上式还原为
P
=
A
+
β
(
C
−
A
)
+
γ
(
B
−
A
)
=
A
+
β
C
−
β
A
+
γ
B
−
γ
A
=
A
−
β
A
−
γ
A
+
β
C
+
γ
B
=
(
1
−
β
−
γ
)
A
+
β
C
+
γ
B
\begin{equation} \begin{split} P = &A + \beta(C -A) + \gamma( B - A) \\ & = A + \beta C -\beta A + \gamma B - \gamma A \\ & = A -\beta A - \gamma A + \beta C + \gamma B \\ & = (1 -\beta - \gamma) A + \beta C + \gamma B \\ \end{split} \end{equation}
P=A+β(C−A)+γ(B−A)=A+βC−βA+γB−γA=A−βA−γA+βC+γB=(1−β−γ)A+βC+γB
从面积的角度理解三角形重心坐标的定义
在图形几何学中,重心坐标是一种表示一个点相对于三角形顶点的线性组合的方式。对于三角形
Δ
A
B
C
\Delta ABC
ΔABC的点
P
P
P,根据上面的推导结果,重心坐标`P$同样可以用矢量或者点的形式表示,写作
P
=
A
+
β
A
C
⃗
+
γ
A
B
⃗
=
α
A
+
β
B
+
γ
C
\begin{equation} \begin{split} P &= A + \beta \vec{AC} + \gamma \vec{AB} \\ &=\alpha A + \beta B + \gamma C \end{split} \end{equation}
P=A+βAC+γAB=αA+βB+γC
其中
α
=
1
−
β
−
γ
\alpha = 1 -\beta - \gamma
α=1−β−γ。也就是说,三角形内部任意一点
P
P
P都能由任意一个端点,向另外两个端点的矢量方向的移动(即矢量的系数不能为负)组合表示,有
α
+
β
+
γ
=
1
\begin{equation} \begin{split} \alpha + \beta + \gamma = 1 \end{split} \end{equation}
α+β+γ=1
即对于三角形中的任意点
P
P
P,其重心坐标表示为各顶点的加权和,其中
α
+
β
+
γ
=
1
\alpha + \beta + \gamma = 1
α+β+γ=1,且
α
,
β
,
γ
\alpha, \beta, \gamma
α,β,γ均为非负数,因此我们可以使用重心坐标来判断点是否在三角形内
而从三角形面积角度出发,如果
P
P
P点在三角形的内部,那么它必定满足以下条件
S
Δ
A
B
P
+
S
Δ
B
C
P
+
S
Δ
A
C
P
=
S
Δ
A
B
C
S
Δ
A
B
P
S
Δ
A
B
C
+
S
Δ
B
C
P
S
Δ
A
B
C
+
S
Δ
A
C
P
S
Δ
A
B
C
=
1
\begin{equation} \begin{split} S_{\Delta ABP} + S_{\Delta BCP} + S_{\Delta ACP} &= S_{\Delta ABC} \\ \dfrac{S_{\Delta ABP}}{S_{\Delta ABC}} + \dfrac{S_{\Delta BCP}}{S_{\Delta ABC}} + \dfrac{S_{\Delta ACP}}{S_{\Delta ABC}} &= 1 \end{split} \end{equation}
SΔABP+SΔBCP+SΔACPSΔABCSΔABP+SΔABCSΔBCP+SΔABCSΔACP=SΔABC=1
从这里可以看出,它们的定义是等效的,即
{
α
=
S
Δ
A
B
P
S
Δ
A
B
C
=
1
−
β
−
γ
β
=
S
Δ
B
C
P
S
Δ
A
B
C
γ
=
S
Δ
A
C
P
S
Δ
A
B
C
\begin{equation} \begin{cases} \alpha = \dfrac{S_{\Delta ABP}}{S_{\Delta ABC}} = 1-\beta - \gamma\\ \beta = \dfrac{S_{\Delta BCP}}{S_{\Delta ABC}} \\ \gamma = \dfrac{S_{\Delta ACP}}{S_{\Delta ABC}} \end{cases} \end{equation}
⎩
⎨
⎧α=SΔABCSΔABP=1−β−γβ=SΔABCSΔBCPγ=SΔABCSΔACP
所以我们只需要计算
β
\beta
β以及
γ
\gamma
γ的值。展开如下
β
=
S
Δ
A
C
P
S
Δ
A
B
C
γ
=
S
Δ
A
B
P
S
Δ
A
B
C
\begin{equation} \begin{split} \beta = \dfrac{S_{\Delta ACP}}{S_{\Delta ABC}} \\ \gamma = \dfrac{S_{\Delta ABP}}{S_{\Delta ABC}} \\ \end{split} \end{equation}
β=SΔABCSΔACPγ=SΔABCSΔABP
省略展开的计算步骤,后可得
{
β
=
(
y
a
−
y
b
)
x
p
+
(
x
b
−
x
a
)
y
p
+
x
a
y
b
−
x
b
y
a
(
y
a
−
y
b
)
x
c
+
(
x
b
−
x
a
)
y
c
+
x
a
y
b
−
x
b
y
a
γ
=
(
y
a
−
y
c
)
x
p
+
(
x
c
−
x
a
)
y
p
+
x
a
y
c
−
x
c
y
a
(
y
a
−
y
c
)
x
c
+
(
x
c
−
x
a
)
y
b
+
x
a
y
c
−
x
c
y
a
α
=
1
−
β
−
γ
\begin{equation} \begin{cases} \beta = \dfrac{(y_a - y_b)x_p + (x_b - x_a)y_p + x_ay_b - x_by_a}{(y_a-y_b)x_c + (x_b - x_a)y_c + x_ay_b - x_by_a} \\ \gamma = \dfrac{(y_a - y_c)x_p + (x_c - x_a)y_p + x_ay_c - x_cy_a}{(y_a-y_c)x_c + (x_c - x_a)y_b + x_ay_c - x_cy_a} \\ \alpha = 1-\beta - \gamma\\ \end{cases} \end{equation}
⎩
⎨
⎧β=(ya−yb)xc+(xb−xa)yc+xayb−xbya(ya−yb)xp+(xb−xa)yp+xayb−xbyaγ=(ya−yc)xc+(xc−xa)yb+xayc−xcya(ya−yc)xp+(xc−xa)yp+xayc−xcyaα=1−β−γ
上面这个写法过于抽象,一般写作矢量表达结果,如下
{
β
=
A
C
⃗
×
A
P
⃗
A
B
⃗
×
A
C
⃗
γ
=
A
B
⃗
×
A
P
⃗
A
B
⃗
×
A
C
⃗
α
=
1
−
β
−
γ
\begin{equation} \begin{cases} \beta = \dfrac{\vec{AC}\times \vec{AP}}{\vec{AB} \times \vec{AC}} \\ \gamma = \dfrac{\vec{AB}\times \vec{AP}}{\vec{AB} \times \vec{AC}} \\ \alpha = 1-\beta - \gamma\\ \end{cases} \end{equation}
⎩
⎨
⎧β=AB×ACAC×APγ=AB×ACAB×APα=1−β−γ
如果我们需要判断点是否在三角形内部,只需要根据上式计算出
α
,
β
\alpha, \beta
α,β以及
γ
\gamma
γ的值之后再判断即可,判断条件总结为
{
S
Δ
A
B
C
>
0
,
保证三个点能组成三角形
∀
{
α
,
β
,
γ
}
∈
[
0
,
1
]
,
等于
0
或
1
的情况表示
P
在三角形的边上
\begin{equation} \begin{cases} S_{\Delta ABC} > 0, &保证三个点能组成三角形 \\ \forall \{\alpha, \beta, \gamma\} \in [0,1],&等于0或1的情况表示P在三角形的边上 \end{cases} \end{equation}
{SΔABC>0,∀{α,β,γ}∈[0,1],保证三个点能组成三角形等于0或1的情况表示P在三角形的边上