首页 > 其他分享 >数学基础:三角形重心坐标插值公式的证明

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

时间:2023-11-16 20:33:18浏览次数:27  
标签:le 插值 线段 beta 重心坐标 alpha 三角形 gamma lambda

在快速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坐标关系怎样?

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

证明:
设坐标\(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)\)

\[\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\)

当\(\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线段裁剪算法中也有应用.

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关系,可写成

\[P=\alpha A + \beta B + \gamma C, \alpha+\beta+\gamma=1且0\le \alpha,\beta,\gamma \le 1 \]

标签:le,插值,线段,beta,重心坐标,alpha,三角形,gamma,lambda
From: https://www.cnblogs.com/fortunely/p/17837205.html

相关文章

  • Java流程控制12:打印三角形及Debug
    publicclassTestDemo{publicstaticvoidmain(String[]args){//打印三角形5行for(inti=1;i<=5;i++){for(intj=5;j>=i;j--){System.out.print("");}for(intj=......
  • 三角形的生命-NVIDIA的逻辑管道
    三角形的生命-NVIDIA的逻辑管道自从突破性的费米架构发布近5年以来,也许是时候刷新其下的主要图形架构了。费米是第一个实现完全可扩展图形引擎的NVIDIAGPU,其核心架构可以在开普勒和麦克斯韦中找到。本文关注GPU如何工作的图形,尽管一些原理(如着色器程序代码的执行方式)对于计算是......
  • 判断直角三角形
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intCheck1(intx,inty,intz){ if(x*x==y*y+z*z){  return1; }else{  return0; }}intCheck2(intx,inty,intz){ if(Check1(x,y,z)||Check1(y,x,z)||Check1(z,x,y)){ return1; }else{ ......
  • JAVA怎么画三角形,用一个简单通俗的例子
    在Java中,画三角形通常意味着在图形用户界面(GUI)上绘制一个三角形的图形,或者在控制台(命令行界面)上打印出三角形的形状。我会提供两种情况的简单示例: ###控制台三角形 如果我们要在控制台中打印一个三角形,我们可以使用循环来打印一系列的星号(`*`)字符。下面是一个简单的例子: ......
  • 前端歌谣的刷题之路-第七十四题-直角三角形
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • 【scipy 基础】--插值
    插值运算是一种数据处理方法,主要用来填补数据之间的空白或缺失值。因为在实际应用中,数据往往不是完整的,而是存在着空白或缺失值,这些空白或缺失值可能是由于数据采集困难、数据丢失或数据处理错误等原因造成的。如果直接使用这些空白或缺失值进行分析和预测,将会对结果造成很大的影......
  • 根据三条边的长度在线生成三角形(generate triangles by edge lengths)
     网址:https://www.geogebra.org/m/JHgTXKrt 方法:鼠标拖放端点可以改变端点的长度和位置。 网址:https://www.mathwarehouse.com/triangle-calculator/online.php 方法:输入三条边的长度,生成三角形。 ......
  • B - 数字三角形
    73 88 1 02 7 4 44 5 2 6 5(图1)图1给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的那个......
  • MATLAB 使用离散数据点实现三维曲面插值
    依靠若干离散点实现三维曲面插值是工程应用中的常见问题,也是数据处理工作的常见需求。MATLAB实现上述功能主要依靠 griddata函数,该函数支持基于三角形的三次插值(仅支持内插值,估计是一种保形插值)和双调和样条插值(支持外插值)。案例数据如下图所示:案例数据空间分布如下:案例代......
  • LeetCode 611. 有效三角形的个数
    有效三角形的个数题目链接611.有效三角形的个数给定一个包含非负整数的数组nums,返回其中可以组成三角形三条边的三元组个数。示例1:输入:nums=[2,2,3,4]输出:3解释:有效的组合是:2,3,4(使用第一个2)2,3,4(使用第二个2)2,2,3示例2:输入:nums=[4,2,3,4]输出:......