数学基础:三角形重心坐标插值公式的证明
在快速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)可表示为:
如何证明?
初看无从下手,可以先考虑2个点的情况.
线性坐标插值
如果点P(x,y)为线段AB上一点,P点与A、B坐标关系怎样?
证明:
设坐标\(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)\)
∴
有
令\(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\)
∴
如果\(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\)即可.
可得,
因此,线性坐标插值公式也可写为:
三角形重心坐标插值
P是△ABC内任一点,连接CP交AB与G.
只要P在三角形内部而不是外部,则Q必位于线段AB上,而不是延长线上.
如此,可通过线段插值,分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关系,可写成
关于\(α,β,γ\)详细求解过程,可参见:计算机图形:三角形及重心空间
推广到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}\)坐标.