我是靠谱客的博主 朴实老虎,最近开发中收集的这篇文章主要介绍java 向量上的坐标点_线性插值、重心坐标、Edge-Equation中的插值,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

线性插值

f7236b39acd3d89899cc18addea3db28.png

令:

得到:

double lerp(double t, double y1,double y2){
    return (1-t)*y1+t*y2;
}

另外,根据式

可知,如果给定了
的值:

这与式

是对称的。
double getT(double y, double y1,double y2){
    return (y-y1)/(y2-y1);
}

三角形五心(复习几何知识)

重心:三条中线交点,重心分中线比例1:2

垂心:三条高交点

内心:三条角平分线交点,内切圆圆心

外心:三边垂直平分线交点,外接圆圆心

旁心:一个内角平分线,两个外角平分线的交点,三角形有三个旁心,旁心对应旁切圆

中心:正三角形,垂心、重心、内心、外心是一个点,称为中心,此时没有旁心

e4693768104bda553390f985db4de1c5.png

重心坐标(Barycentric coordinates)

概念

d8e0cf3cc41dfcce466eb5615849f77d.png

空间中任意一点

通过基底
表示:

此时,

在平面
上与
互为充要条件
证明: (1)若
是平面上任意一点,
是平面上的向量,所以
(2)已知

证毕.

所以,换言之,不满足
的点都在平面外,平面外的点都不满足该条件

如果要限制
在三角形
内部,需要令

如果某个系数等于
,则此时
在边界上; 如果某个系数在
外部,则
在三角形
外部 这组系数
可以很好的描述三角形内部任意一点,被称为重心坐标

求解重心坐标的方法

  • 方法一,直接列方程

如果

都是二维平面上的点,可以直接列出三个方程式

应用Cramer法则:

最终

  • 方法二,利用直线方程

因为

,都是常数,所以直线两侧的数值分布是线性的:

6c0361dcb94cfc01ca082d2c5236fa90.png

因为直线两侧数值分布是线性的,所以利用比例关系可以直接求得重心坐标:

接下来需要求解直线方程

因为向量

是函数
的梯度,梯度垂直于等值线,而直线本身就是值为
的等值线 所以向量
垂直于直线

向量

与向量
的点积为

由于参数

有无穷组,可以只取其中显而易见的一组

代入

点或
点坐标到方程
中解出
的值

最后,解出来全部重心坐标为

  • 方法三,利用面积比例 受到方法二的启发,可知,通过内部小三角形面积占比也可以求出来重心坐标

75ba28acf248312c94244a46cb69275b.png

290b88408bd86297bb8202eea2433ccb.png

一个典型的例子:

因为三角形重心分中线比例1:2,每个小三角形都是大三角形面积的三分之一,所以重心的重心坐标为

计算三角形面积可以采用叉积,两个三维向量叉积,结果向量垂直于叉积向量平面,模长是两叉积向量围城平行四边形面积

子三角形按特定顺序计算叉积得到面积,与大三角形方向相同即为正,反之为负

其中,叉积的计算可以转换为矩阵的乘法

光栅化过程中利用重心坐标插值

透视除法破坏了三角形坐标值的线性关系,不能直接利用重心坐标插值
  • 解决方案: 设三维空间中的点的重心坐标为

透视除法后,窗口坐标系中,计算得到的重心坐标为

,即

抽取其中一组,

相当于,

即,

因为

所以,

其中

是未知的,可以利用
计算得到:

最后,

对于某个参数

进行插值

其中

可以通过
求得

Edge-Equation中的插值

  • Edge-Equation中的插值与重心坐标中的插值不同
    • 重心坐标插值法需要先计算插值点的重心坐标,然后代入顶点参数,得到插值点的参数。插值点每改变一次,重心坐标需要重新计算一次,但一组重心坐标可以插值任意满足线性关系的参数。
    • 而Edge-Equation中的插值是先针对某个参数计算得到一组线性关系,然后将插值点坐标代入线性关系的方程中即可得到插值点针对该参数的插值。待插值的参数发生改变,线性关系需要重新计算,但所有插值点的参数都满足该线性关系。
  • Edge-Equation中的插值法对透视除法的处理 透视除法前:

其中,

表示三维空间中的坐标,
表示线性映射,即:

透视除法后:

其中

表示投影到窗口坐标系后的坐标,也就是三维空间中的点经过透视除法等变换后的坐标。

由此可见,

保持线性关系。

所以在Edge-Equation算法中插值的计算过程是:

1. 计算 1/w 与 x的线性关系
2. 计算 p/w 与 x的线性关系
3. 计算插值点处的 1/w 与 p/w,然后恢复 插值点处的 p

最后

以上就是朴实老虎为你收集整理的java 向量上的坐标点_线性插值、重心坐标、Edge-Equation中的插值的全部内容,希望文章能够帮你解决java 向量上的坐标点_线性插值、重心坐标、Edge-Equation中的插值所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部