離散高斯曲率:
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=Ai2π−Σ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();
}
平均曲率:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL9UkeNl3aq5kMBRVT3V1MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1kjNxAjNxADM1EzNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
高斯曲率: