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

在快速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=α A + β B + γ C, α + β + γ=1 \]

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

线性坐标插值

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

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

img

证明:
设坐标\(A(x_1,y_1)、B(x_2,y_2)\)
∵P在线段AB上
\(\overrightarrow{AP}\parallel \overrightarrow{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\)
这里P,A,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线段裁剪算法中也有应用.

  • u值是多少?如何求?

由于\(u=\frac{1}{1-\lambda}\),因此求出\(\lambda\)即可.

\[\overrightarrow{AP}=\lambda\overrightarrow{BP}\implies |AP|=-\lambda |BP|\\ \therefore \lambda=-\frac{|AP|}{|BP|} \]

可得,

\[u=\frac{1}{1-\lambda}=\frac{1}{1+\frac{|AP|}{|BP|}}=\frac{|BP|}{|BP|+|AP|}=\frac{|BP|}{|AB|} \]

img

因此,线性坐标插值公式也可写为:

\[P=uA+(1-u)B, u=\frac{|BP|}{|AB|} \]

三角形重心坐标插值

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

img

如此,可通过线段插值,分2步求P坐标与三角形关系:
(1)求Q坐标;(2)求P坐标.

∵Q是线段AB上一点

∴存在\(u_1\)满足\(Q=u_1A+(1-u_1)B,0\le u_1 \le 1\)

∵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\)
因此,令\(α=u_1u_2, β=u_2(1-u_1), γ=1-u_2, 0\le α,β,γ\le 1\)

P与A、B、C关系,可写成

\[P=α A + β B + γ C, α+β+γ=1且0\le α,β,γ \le 1 \]

关于\(α,β,γ\)详细求解过程,可参见:计算机图形:三角形及重心空间

推广到n凸多边形

推广:对于四边形,甚至n凸多边形,是否有同样的结论?

即n凸多边形\(A_1A_2...A_n\)内一点P,坐标与顶点是否有这样的关系\(P=k_1A_1+k_2A_2+...+k_nA_n,且k_1+k_2+...+k_n=1成立\)
答案是肯定的.可以用数学归纳法证明.

证明:
1)当n=3时,问题简化为三角形插值,显然\(P_3=k_1A_1+k_2A_2+k_3A_3,k_1+k_2+k_3=1\)成立.

2)当n=m时,假设\(P_m=k_1A_1+k_2A_2+...+k_mA_m,k_1+k_2+...+k_m=1\)成立

那么,当n=m+1时,连接点\(A_{m+1}\)与点\(P_{m+1}\)
由于\(P_{m+1}\)在m+1凸多边形内部,因此\(A_{m+1}P_{m+1}\)与凸多边形必有2个交点(否则就不是凸多边形),而其中一个已经是顶点\(A_{m+1}\),因此,另一个交点必然位于子凸多边形\(A_1A_2...A_{m}\)

而m凸多边形\(A_1A_2...A_{m}\)内任一点,是可以用\(P_m\)表达式来表示的.

不妨直接取线段另一点为\(P_m\),有\(P_{m+1}\)为线段\(P_mA_{m+1}\)上一点

\(P_{m+1}=uP_m+(1-u)A_{m+1}\)
\(P_{m+1}=uk_1A_1+uk_2A_2+...+uk_mA_m+(1-u)A_{m+1}\)

显然,系数和\(uk_1+uk_2+...+uk_m+(1-u)=1\)
\(k_i\prime=uk_i(i=1,2,...,m),k_i\prime=1-u(i=m+1)\)

\(P_{m+1}\)可写成\(P_{m+1}=k_1\prime A_1+k_2\prime A_2+...+k_m\prime A_m + k_{m+1}\prime A_{m+1}\)
\(k_i\prime\)写成\(k_i\)形式,则\(P_{m+1}=k_1A_1+k_2A_2+...+k_{m+1}A_{m+1}\)\(k_1+k_2+...+k_{m+1}=1\)也成立

故得证.

注:只要\(A_{m+1}\)\(P_{m+1}\)连线的延长线经过前m个点形成的多边形区域即可,就能利用m多边形的插值公式+线段插值,求出\(P_{m+1}\)坐标.

posted @ 2023-11-16 20:24  明明1109  阅读(119)  评论(0编辑  收藏  举报