在快速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坐标关系怎样?
证明:
设坐标\(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)\)
∴
有
\[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\)
∴
如果\(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关系,可写成