天天看點

【數字幾何處理】離散高斯曲率和平均曲率 源碼+介紹

離散高斯曲率:

K i = 2 π − Σ f ∈ f a c e s ( i ) θ i f A i K_{i}=\frac{2\pi-\Sigma_{f\in faces(i)}\theta_{if}}{A_{i}} Ki​=Ai​2π−Σf∈faces(i)​θif​​

離散平均曲率:

Δ f ≈ M − 1 L f \Delta f\approx M^{-1}Lf Δf≈M−1Lf

H n ≈ H = M − 1 L V Hn\approx H=M^{-1}LV Hn≈H=M−1LV

#include "mean_curvature.h"
#include "cotmatrix.h"
#include "massmatrix.h"
#include "per_vertex_normals.h"
void mean_curvature(
  const Eigen::MatrixXd & V,
  const Eigen::MatrixXi & F,
  Eigen::VectorXd & H)
{
	Eigen::MatrixXd N;
	Eigen::SparseMatrix<double> L, M;

	cgpl::cotmatrix(V, F, L);
	cgpl::massmatrix(V, F, M);
	cgpl::per_vertex_normals(V, F, N);

	Eigen::MatrixXd Hn = Eigen::SimplicialLDLT<Eigen::SparseMatrix<double>>(M).solve(L * V);
	H = -(Hn * N.transpose()).diagonal();
}
           
#include "angle_defect.h"
#include "internal_angles.h"

#include"squared_edge_lengths.h"
#include"massmatrix.h"

void angle_defect(
  const Eigen::MatrixXd & V,
  const Eigen::MatrixXi & F,
  Eigen::VectorXd & D)
{
	D = Eigen::VectorXd::Ones(V.rows()) * 2.0 * 3.14159265358979;
	
	Eigen::MatrixXd A;
	internal_angles(V,F, A);

	for(int i = 0; i < F.rows(); i++) {
		for(int j = 0; j < 3; j++) {
			int v_i = F(i, j);
			D[v_i] -= A(i, j);
		}
	}

	Eigen::SparseMatrix<double> M;
	cgpl::massmatrix(V,F,M);
	Eigen::VectorXd Area = M.diagonal();

	D=D.array()/Area.array();
}

           

平均曲率:

【數字幾何處理】離散高斯曲率和平均曲率 源碼+介紹

高斯曲率:

【數字幾何處理】離散高斯曲率和平均曲率 源碼+介紹