网格梯度离散化 gradient

欢迎关注更多精彩

关注我,学习常用算法与数据结构,一题多解,降维打击。

参考自polygon mesh proccessing这本书

重心坐标定理

定理证明点击前往

已经三角形三点上的函数值分别为gi,gj,gk。

可以利用插值得到g处的函数值。

g = α g i + β g j + γ g k g=\alpha g_i+\beta g_j+ \gamma g_k g=αgi+βgj+γgk
α + β + γ = 1 , \alpha + \beta + \gamma = 1, α+β+γ=1,
α , β , γ > 0 \alpha,\beta,\gamma>0 α,β,γ>0

α = s i s i + s j + s k \alpha = \frac {s_i} {s_i+s_j+s_k} α=si+sj+sksi
β = s j s i + s j + s k \beta = \frac {s_j} {s_i+s_j+s_k} β=si+sj+sksj
γ = s k s i + s j + s k \gamma = \frac {s_k} {s_i+s_j+s_k} γ=si+sj+sksk

s i 是 g i 对面与 g 组成的小三角形, s j , s k 类似 s_i 是g_i对面与g组成的小三角形,s_j, s_k类似 si是gi对面与g组成的小三角形,sj,sk类似

函数定义

利用上述原理,x处的函数值
f ( x ) = α f i + β f j + γ f k f(x) = \alpha f_i+\beta f_j + \gamma f_k f(x)=αfi+βfj+γfk

梯度定义

梯度是对函数进行求导, f i , f j , f k 是已知量,只要对 α , β , γ 求导即可。 梯度是对函数进行求导,f_i,f_j,f_k 是已知量,只要对\alpha, \beta, \gamma求导即可。 梯度是对函数进行求导,fi,fj,fk是已知量,只要对α,β,γ求导即可。

∇ x f ( x ) = f i ∇ x α + f j ∇ x β + f k ∇ x γ \nabla_xf(x)=f_i\nabla_x\alpha+f_j\nabla_x\beta+f_k\nabla_x\gamma ∇xf(x)=fi∇xα+fj∇xβ+fk∇xγ

梯度求解

利用三角形面积底高公式

以 α 为例,对于 A i 面积,底是 ∥ x k − x j ∥ 2 , 高是向量 ( x − x j ) 在 ( x k − x j ) 垂直方向上的投影 以\alpha为例,对于A_i面积,底是\|x_k-x_j\|_2, 高是向量(x-x_j)在(x_k-x_j)垂直方向上的投影 以α为例,对于Ai面积,底是∥xk−xj∥2,高是向量(x−xj)在(xk−xj)垂直方向上的投影

α = A i A T = ( ( x − x j ) ⋅ ( x k − x j ) ⊥ ∥ x k − x j ∥ 2 ) ⋅ ∥ x k − x j ∥ 2 2 A T \alpha = \frac {A_i}{A_T}=\frac {\left( (x-x_j)\cdot \frac {(x_k-x_j)^\perp}{\|x_k-x_j\|_2}\right) \cdot\|x_k-x_j\|_2}{2A_T} α=ATAi=2AT((x−xj)⋅∥xk−xj∥2(xk−xj)⊥)⋅∥xk−xj∥2
= ( x − x j ) ⋅ ( x k − x j ) ⊥ 2 A T =\frac { (x-x_j)\cdot (x_k-x_j)^\perp }{2A_T} =2AT(x−xj)⋅(xk−xj)⊥

上式中变量只有x, 求导如下

∇ x α = ( x k − x j ) ⊥ 2 A T \nabla_x\alpha = \frac { (x_k-x_j)^\perp }{2A_T} ∇xα=2AT(xk−xj)⊥
∇ x β = ( x i − x k ) ⊥ 2 A T \nabla_x\beta= \frac { (x_i-x_k)^\perp }{2A_T} ∇xβ=2AT(xi−xk)⊥
∇ x γ = ( x j − x i ) ⊥ 2 A T \nabla_x\gamma = \frac { (x_j-x_i)^\perp }{2A_T} ∇xγ=2AT(xj−xi)⊥

致此,梯度已经得到

∇ x f ( x ) = f i ( x k − x j ) ⊥ 2 A T + f j ( x i − x k ) ⊥ 2 A T + f k ( x j − x i ) ⊥ 2 A T \nabla_xf(x)=f_i\frac { (x_k-x_j)^\perp }{2A_T}+f_j \frac { (x_i-x_k)^\perp }{2A_T}+f_k\frac { (x_j-x_i)^\perp }{2A_T} ∇xf(x)=fi2AT(xk−xj)⊥+fj2AT(xi−xk)⊥+fk2AT(xj−xi)⊥

公式化简

三角形三条边为向量走一遍最后回到起点,可以得到

( x k − x j ) + ( x i − x k ) + ( x j − x i ) = 0 (x_k-x_j)+(x_i-x_k)+(x_j-x_i)=0 (xk−xj)+(xi−xk)+(xj−xi)=0

把所有向量转90度再相加,结果不变。

( x k − x j ) ⊥ + ( x i − x k ) ⊥ + ( x j − x i ) ⊥ = 0 (x_k-x_j)^\perp+(x_i-x_k)^\perp+(x_j-x_i)^\perp=0 (xk−xj)⊥+(xi−xk)⊥+(xj−xi)⊥=0

将梯度公式中xk-xj替换得到

∇ x f ( x ) = ( f j − f i ) ( x i − x k ) ⊥ 2 A T + ( f k − f i ) ( x j − x i ) ⊥ 2 A T \nabla_xf(x)=(f_j-f_i) \frac { (x_i-x_k)^\perp }{2A_T}+(f_k-f_i)\frac { (x_j-x_i)^\perp }{2A_T} ∇xf(x)=(fj−fi)2AT(xi−xk)⊥+(fk−fi)2AT(xj−xi)⊥


本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。

相关推荐
ttod_qzstudio11 天前
Unity中Mesh重叠顶点合并参考及其应用
unity·图形学
Ian102525 天前
《Learn Three.js》学习(3)光源
前端·javascript·学习·webgl·图形学·三维·三维光源
哈市雪花1 个月前
图像处理 之 凸包和最小外围轮廓生成
图像处理·人工智能·图形学·最小外围轮廓·最小外包
zaizai10072 个月前
WebGL编程指南 - 颜色与纹理续
图形学
zaizai10072 个月前
WebGL编程指南 - 绘制和变换三角形
图形学
zaizai10072 个月前
WebGL编程指南 - 入门续
图形学
闲人编程3 个月前
使用Python实现图形学的阴影贴图算法
python·算法·图形学·贴图·阴影贴图
闲人编程3 个月前
使用Python实现图形学的纹理映射算法
开发语言·python·算法·图形学·纹理映射
闲人编程3 个月前
使用Python实现图形学的环境映射算法
开发语言·python·算法·图形学·环境映射
闲人编程3 个月前
Python实现图形学曲线和曲面的Bezier曲线算法
开发语言·python·算法·图形学·曲线·曲面·bezier