自学内容网 自学内容网

图形学初识--三角形重心坐标插值算法(小白狂喜)

前言

前面咱们发了两篇文章,主要讲了直线光栅化和直线插值的内容,这一节咱们聊一聊三角形插值算法,主要就是利用重心坐标公式。先忽略如何进行三角形光栅化的内容,后面有时间可以补上!

正文

为什么需要三角形插值?

关于直线插值在前面文章已描述过,针对三角形插值,思想也是类似。简要描述下:

如果我们知道屏幕上三角形的三个顶点各自的属性值,如何得知三角形内部覆盖所有像素位置的属性值呢?

这个问题的答案就是回答!

什么是三角形插值?

这里就用数学符号简易的描述下:

已知三角形的三个顶点 v 0 v_0 v0 v 1 v_1 v1 v 2 v_2 v2,每个顶点的属性值 f ( v 0 ) f(v_0) f(v0) f ( v 1 ) f(v_1) f(v1) f ( v 2 ) f(v_2) f(v2),要求计算所有三角形内的顶点 v i n v_{in} vin的属性值 f ( v i n ) ? f(v_{in})? f(vin)?

如何进行三角形插值?

虽然可能也会有别的三角形插值算法,但是咱们重点介绍:重心坐标插值算法!

1、结论

对于三角形 △ A B C \triangle ABC ABC 内任意一点 p p p,都存在 0 < α 、 β 、 γ < 1 且 α + β + γ = 1 0 < \alpha、\beta、\gamma < 1 且 \alpha + \beta + \gamma = 1 0<αβγ<1α+β+γ=1 ,使得 f ( p ) = α f ( A ) + β f ( B ) + γ f ( C ) f(p) = \alpha f(A) + \beta f(B) + \gamma f(C) f(p)=αf(A)+βf(B)+γf(C)

为了更好的简述算法核心内容,咱们忽略三角形边界情况,也就不考虑取0和1的情况啦!

2、核心理解

通过观察上面的结论,给人的感觉就像是,只要通过三角形三个顶点属性值的加权混合,就可以获得三角形内部任何位置的顶点的属性值!

3、几何理解-重心坐标公式推导

(1)已知三角形 △ A B C \triangle ABC ABC,其中一点 P P P 位于三角形内部

在这里插入图片描述

(2) 借助向量辅助推导,推导出顶点P和A、B、C的关系

∵ 向量 A B ⃗ , A C ⃗ 线性无关 ∴ 一定 ∃ 常数 β 、 γ 使得 A P ⃗ = β A B ⃗ + γ A C ⃗ ∵ A B ⃗ = B − A , A C ⃗ = C − A , A P ⃗ = P − A ∴ P − A = β ( B − A ) + γ ( C − A ) ∴ P = ( 1 − β − γ ) A + β B + γ C 记 α = 1 − β − γ , 从而 ∃ ( α + β + γ = 1 ) , 使得 P = α A + β B + γ C \begin{aligned} &\because 向量 \vec{AB} , \vec{AC} 线性无关\\ &\therefore 一定 \exists 常数 \beta、\gamma 使得\vec{AP} = \beta\vec{AB} + \gamma\vec{AC}\\ &\because\vec{AB} = B-A,\vec{AC} = C-A,\vec{AP} = P-A\\ &\therefore P - A = \beta(B-A) + \gamma(C-A)\\ &\therefore P = (1 - \beta - \gamma)A + \beta B + \gamma C\\ &记\alpha = 1 - \beta - \gamma,从而\exists (\alpha + \beta + \gamma = 1),使得P = \alpha A + \beta B + \gamma C\\ \end{aligned} 向量AB ,AC 线性无关一定常数βγ使得AP =βAB +γAC AB =BAAC =CAAP =PAPA=β(BA)+γ(CA)P=(1βγ)A+βB+γCα=1βγ,从而(α+β+γ=1),使得P=αA+βB+γC
(3)接下来的关键就是求解三个常数系数: α \alpha α β \beta β γ \gamma γ 的值

​ 针对上述的 △ A B C \triangle ABC ABC ,咱们需要作点P和点B分别到直线AC的垂线,交点分别记作 D D D E E E,然后连接PC

在这里插入图片描述

这里分别计算 △ A B C \triangle ABC ABC △ A P C \triangle APC APC的面积:
S A P C = 0.5 ∗ A C ∗ P D S A B C = 0.5 ∗ A C ∗ B E 上下两式相除,得到 : S A P C S A B C = P D B E 记 P D = h p , B E = h b S_{APC} = 0.5 * AC * PD\\ S_{ABC} = 0.5 * AC * BE\\ 上下两式相除,得到: \frac{S_{APC}}{S_{ABC}} = \frac{PD}{BE}\\ 记PD = h_p,BE = h_b SAPC=0.5ACPDSABC=0.5ACBE上下两式相除,得到:SABCSAPC=BEPDPD=hpBE=hb
(4)上述的计算看似没啥用,但是我们可以联想相似三角形的知识,类比转换!

做辅助线:过P点做垂直于PD的直线 l 1 l_1 l1,交线段AB于点F。然后过点F做平行线 l 2 l_2 l2交线段AC于点G,如下图所示:

在这里插入图片描述

(5)向量加法几何理解突破

因为四边形PFGD是矩形,所以 P D = = F G PD == FG PD==FG,结合之前的公式: S A P C S A B C = P D B E \frac{S_{APC}}{S_{ABC}} = \frac{PD}{BE} SABCSAPC=BEPD

​ 于是得出: S A P C S A B C = P D B E = F G B E \frac{S_{APC}}{S_{ABC}} = \frac{PD}{BE} = \frac{FG}{BE} SABCSAPC=BEPD=BEFG

又因为 △ A F G \triangle AFG AFG △ A B E \triangle ABE ABE是相似三角形(为什么就不用多说了,初中知识),所以 F G B E = A F A B \frac{FG}{BE} = \frac{AF}{AB} BEFG=ABAF

这时候,结合开头提到的公式: A P ⃗ = β A B ⃗ + γ A C ⃗ \vec{AP} = \beta \vec{AB} + \gamma \vec{AC} AP =βAB +γAC ,然后再结合向量加法的几何理解,我们可以得到 A F = β ∗ A B AF = \beta * AB AF=βAB,从而得到 A F A B = β \frac{AF}{AB} = \beta ABAF=β,也就得到了 β = S A P C S A B C \beta = \frac{S_{APC}}{S_{ABC}} β=SABCSAPC

(6)同理。我们也可以得到 α \alpha α γ \gamma γ 的值,如下:
α = S B P C S A B C β = S A P C S A B C γ = S A P B S A B C \alpha = \frac{S_{BPC}}{S_{ABC}}\\ \beta = \frac{S_{APC}}{S_{ABC}}\\ \gamma = \frac{S_{APB}}{S_{ABC}}\\ α=SABCSBPCβ=SABCSAPCγ=SABCSAPB
(7)至于三角形的公式,咱们不多说,这里贴出来:
S B P C = 0.5 ∗ ∣ ∣ P B ⃗ × P C ⃗ ∣ ∣ S A P C = 0.5 ∗ ∣ ∣ P A ⃗ × P C ⃗ ∣ ∣ S A P B = 0.5 ∗ ∣ ∣ P A ⃗ × P B ⃗ ∣ ∣ S A B C = 0.5 ∗ ∣ ∣ A B ⃗ × A C ⃗ ∣ ∣ S_{BPC} = 0.5 *||\vec{PB} \times \vec{PC}||\\ S_{APC} = 0.5 *||\vec{PA} \times \vec{PC}||\\ S_{APB} = 0.5 *||\vec{PA} \times \vec{PB}||\\ S_{ABC} = 0.5 *||\vec{AB} \times \vec{AC}||\\ SBPC=0.5∣∣PB ×PC ∣∣SAPC=0.5∣∣PA ×PC ∣∣SAPB=0.5∣∣PA ×PB ∣∣SABC=0.5∣∣AB ×AC ∣∣

大功告成,希望对大家所有帮助!画图用的是在线软件:geogebra

结尾

喜欢的小伙伴可以点点关注+赞哦!谢谢大家!

希望对各位小伙伴能够有所帮助哦,永远在学习的道路上伴你而行, 我是航火火,火一般的男人!


原文地址:https://blog.csdn.net/u010092716/article/details/139195853

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!