重心坐标系(Barycentric coordinate system)详解

Posted by Tao on Tuesday, March 1, 2022

本文介绍了平面上重心坐标系与点的重心坐标的定义、向量解释和解法推导。(最后总结)


1 定义

对于空间三角形\(A\)\(B\)\(C\)所在平面内的任意一点\(P\),必定唯一存在三个数\(\alpha,\beta,\gamma\),满足:\[\alpha +\beta +\gamma =1\]

\(P=\alpha *A+\beta *B+\gamma *C\) (即P表示成\(A\),\(B\),\(C\)的线性组合)
则\(\alpha,\beta,\gamma\)就称为此三角形上P点的(归一化)重心坐标。

2 由来

对\(P=\alpha *A+\beta *B+\gamma *C\)变形得\(\alpha *(A-P)+\beta *(B-P)+\gamma *(C-P)=0\),即: \[\alpha \overrightarrow{PA}+\beta \overrightarrow{PB}+\gamma \overrightarrow{PC}=0\]

上式说明,如果A点挂重物\(\alpha\),B点挂重物\(\beta\),C点挂重物\(\gamma\),则P点正好是重心。如果把P点放在针间上,能保持平衡,如图:

barycentric_coordinates

这就是“重心坐标”名称的由来。

3 用处

三角形顶点属性的(color、uv、法线等)线性插值。

打比方说,A处纹理坐标为texcoord1,B处为texcoord2,C处为texcoord3,则P处纹理坐标就是texcoord=\(\alpha\)*texcoord1+\(\beta\)*texcoord2+\(\gamma\)*texcoord3。

软光栅化或光线追踪都用得到。

4 重心坐标求法

直接解方程组: \[ \begin{cases} \alpha +\beta +\gamma =1\\ P_x=\alpha *A_x+\beta *B_x+\gamma *C_x\\ P_y=\alpha *A_y+\beta *B_y+\gamma *C_y \end{cases}\hspace{50cm} \]

\[ ⇒ \begin{cases} P_x-C_x=\alpha (A_x-C_x)+\beta (B_x-C_x)\\ P_y-C_y=\alpha (A_y-C_y)+\beta (B_y-C_y)\\ \gamma=1-\alpha -\beta \end{cases}\hspace{50cm} \]

另\(\overrightarrow{W}=P-C\),\(\overrightarrow{U}=A-C\),\(\overrightarrow{V}=B-C\)

barycentric_coordinates2

\[⇒ \begin{cases} W_x=\alpha U_x+\beta V_x\\ W_y=\alpha U_y+\beta V_y\\ \gamma=1-\alpha -\beta \end{cases}\hspace{50cm} \]

\[⇒ \begin{cases} \alpha=\dfrac{W_x V_y-W_y V_x}{U_x V_y-U_y V_x}=\dfrac{W\times V}{U\times V}=\dfrac{S_{\Delta PBC}}{S_{\Delta ABC}}\\ \beta=\dfrac{W_x U_y-W_y U_x}{V_x U_y-V_y U_x}=\dfrac{W\times U}{V\times U}=\dfrac{S_{\Delta APC}}{S_{\Delta ABC}}\\ \gamma=1-\dfrac{S_{\Delta PBC}}{S_{\Delta ABC}}-\dfrac{S_{\Delta APC}}{S_{\Delta ABC}}=\dfrac{S_{\Delta ABP}}{S_{\Delta ABC}} \end{cases}\hspace{50cm} \]

即所挂重物重量应与对边所在三角形面积成比例: area

所以计算重心坐标,可先叉乘计算面积,再求面积比。
注意:这里的面积为有向面积(带符号),可用右手定则判断正负。

我们已知图中4点坐标,那么求出面积自然是很简单的,这里利用行列式的几何意义直接求解,即任意2个2维向量组合成矩阵的行列式的绝对值,为这两条向量所围成平行四边形的面积 (如果对行列式几何意义不清楚的话建议前往B站搜索3B1B的线代本质)。

此处省略行列式计算步骤,不难得出

\[\gamma=\dfrac{(y_a-y_b)x+(x_b-x_a)y+x_ay_b-x_by_a}{(y_a-y_b)x_c+(x_b-x_a)y_c+x_ay_b-x_by_a}\hspace{50cm}\] \[\beta=\dfrac{(y_a-y_c)x+(x_c-x_a)y+x_ay_c-x_cy_a}{(y_a-y_c)x_b+(x_c-x_a)y_b+x_ay_c-x_cy_a}\hspace{50cm}\] \[\alpha=1-\beta -\gamma\hspace{50cm}\]

注意,求出其中2个之后第三个可以根据性质直接求出。

「如果这篇文章对你有用,请随意打赏」

Heisenberg Blog

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付


comments powered by Disqus