数学基础:三角形重心坐标插值公式的证明

发布时间 2023-11-16 20:29:40作者: 明明1109

在快速Phong明暗处理(Blinn-Phong明暗处理)时,出现了三角形重心坐标插值公式,但没有给出证明. 网上也鲜有证明过程,这里给出证明.

问题描述:在三角形ABC中,三顶点A、B、C坐标分别为\((x_1,y_1,z_1)、(x_2,y_2,z_2)、(x_3,y_3,z_3)\). 则三角形内任一点P(x,y,z)可表示为:

\[\tag{1} P=\alpha A + \beta B + \gamma C, \alpha + \beta + \gamma=1\]

如何证明?
初看无从下手,可以先考虑2个点的情况.

1)线段坐标插值
如果点P(x,y)为线段AB上一点,P点与A()、B坐标关系怎样?

\[P=uA+(1-u)B, 0\le u \le 1 \]

证明:
设坐标\(A(x_1,y_1)、B(x_2,y_2)\)
∵P在线段AB上
∴向量AP//向量BP
即存在实数\(\lambda(\lambda\neq 0)\),使得\((x-x_1,y-y_1)=\lambda(x-x_2,y-y_2)\)

\[\begin{cases} x-x_1=\lambda(x-x_2) \\ y-y_1=\lambda(y-y_2) \end{cases} \]

\[x=\frac{1}{1-\lambda}x_1+(1-\frac{1}{1-\lambda})x_2 \]

\(u=\frac{1}{1-\lambda}(\lambda\neq 1)\),则\(x=ux_1+(1-u)x_2\)
同理,\(y=uy_1+(1-u)y_2\)
将2个等式合并成一个,写成坐标形式:\(P=uA+(1-u)B\)

\(\lambda=1\)时呢?
此时,由平行向量得到的等式与x、y无关,且要求A、B中点必须为原点,这没有意义.

如何求u的范围?
不妨设\(x_1\le x_2\).
由于x位于线段AB(含端点),因此\(x_1\le x \le x_2\).
\(x_1\le x=ux_1+(1-u)x_2\le x_2\)

\[\begin{cases} (1-u)x_1\le (1-u)x_2 & (1)\\ ux_1\le ux_2 & (2) \end{cases} \]

如果\(u>1\),则(1)与假设矛盾,故\(u\le 1\)
如果\(u<0\),则(2)与假设矛盾,故\(0\le u\).

综上,\(P=uA+(1-u)B, 0\le u \le 1\)成立.

tips:该公式在Liang-Barsky线段裁剪算法中也有应用.

2)三角形重心坐标插值
P是△ABC内任一点,连接CP交AB与G.
只要P在三角形内部而不是外部,则Q必位于线段AB上,而不是延长线上.

如此,可通过线段插值,分2步求P坐标与三角形关系:
(1)求Q坐标;(2)求P坐标.
对于Q,因为Q是线段AB上一点
∴存在\(u_1\)满足\(Q=u_1A+(1-u_1)B,0\le u_1 \le 1\)

对于P,因为P是线段CQ上一点
∴存在\(u_2\)满足\(P=u_2Q+(1-u_2)C, 0\le u_2 \le 1\)
∴联立2个等式,可得\(P=u_1u_2A+u_2(1-u_1)B+(1-u_2)C\)
\(u_1u_2+u_2(1-u_1)+(1-u_2)=1\)
因此,令\(\alpha=u_1u_2, \beta=u_2(1-u_1), \gamma=1-u_2, 0\le \alpha,\beta\gamma\le 1\)
P与A、B、C关系,可写成

\[P=\alpha A + \beta B + \gamma C, \alpha+\beta+\gamma=1且0\le \alpha,\beta,\gamma \le 1 \]