libigl cot laplacian 计算方式

速记一下

用libigl计算

c++:
https://github.com/libigl/libigl/blob/master/tutorial/205_Laplacian/main.cpp

Eigen::SparseMatrix<double> L;
igl::cotmatrix(V,F,L); // V, F 分别为顶点和面片,见代码

python:
https://github.com/libigl/libigl/blob/master/python/tutorial/205_Laplacian.py

L = igl.eigen.SparseMatrixd()

# Load a mesh in OFF format
igl.readOFF(TUTORIAL_SHARED_PATH + "cow.off", V, F)

# Compute Laplace-Beltrami operator: #V by #V
igl.cotmatrix(V, F, L)

基本概念

https://blog.csdn.net/hjimce/article/details/46415239
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

libigl 计算方式

因为 cot = cos / sin,
cos 可以用余弦定理
在这里插入图片描述
sin 用向量叉积 ∣ a ∣ ∣ b ∣ s i n θ |a||b|sin\theta absinθ , 和面积有关
因此发现计算出每条边的长度的平方和区域的面积就好办了. ligigl 就是这么做的

主程序在, 关注sample_size=3 这个分支:
https://github.com/libigl/libigl/blob/master/include/igl/cotmatrix_entries.cpp

算长度平方: https://github.com/libigl/libigl/blob/master/include/igl/squared_edge_lengths.cpp

igl::squared_edge_lengths(V,F,l2);

算面积 https://github.com/libigl/libigl/blob/master/include/igl/doublearea.cpp

//doublearea(l,0.,dblA);

const Scalar arg =
        (l(i,0)+(l(i,1)+l(i,2)))*
        (l(i,2)-(l(i,0)-l(i,1)))*
        (l(i,2)+(l(i,0)-l(i,1)))*
        (l(i,0)+(l(i,1)-l(i,2)));
      dblA(i) = 2.0*0.25*sqrt(arg);

应该是类似这个公式
https://en.wikipedia.org/wiki/Heron%27s_formula
A = 1 4 ( a + b + c ) ( − a + b + c ) ( a − b + c ) ( a + b − c ) A=\frac{1}{4}\sqrt{(a+b+c)(-a+b+c)(a-b+c)(a+b-c)} A=41(a+b+c)(a+b+c)(ab+c)(a+bc)

发现L 是 按照主对角线是负数的

int source = F(i,edges(e,0));
      int dest = F(i,edges(e,1));
      IJV.push_back(Triplet<Scalar>(source,dest,C(i,e)));
      IJV.push_back(Triplet<Scalar>(dest,source,C(i,e)));
      IJV.push_back(Triplet<Scalar>(source,source,-C(i,e)));
      IJV.push_back(Triplet<Scalar>(dest,dest,-C(i,e)));
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值