/
MeanCurvatureEnergy.cpp
69 lines (55 loc) · 1.94 KB
/
MeanCurvatureEnergy.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*=========================================================================
Program: SparseFieldLevelSetContour
Module: $HeadURL$
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Brigham and Women's Hospital (BWH) All Rights Reserved.
See License.txt or http://www.slicer.org/copyright/copyright.txt for details.
==========================================================================*/
#include "MeanCurvatureEnergy.h"
double MeanCurvatureEnergy::eval_energy(const std::vector<int> &vtkNotUsed(C))
{
double E = 0.0;
return E;
}
std::valarray<double> MeanCurvatureEnergy::getforce( const std::list<int>& C_,
const std::list<int>& vtkNotUsed(L_p1),
const std::list<int>& vtkNotUsed(L_n1),
const std::vector<double>& phi)
{
std::valarray<double> force( C_.size() );
// exp( -lambda * H ) * ( nhat dot gradH + kappa )
std::valarray<double> ne1(C_.size());
std::valarray<double> ne2(C_.size());
std::valarray<double> kappa(C_.size());
std::vector<int> C = ListToSTDVector( C_ );
GetNormalsTangentPlane( C, phi, ne1, ne2, this->meshdata );
GetKappa( C, phi, kappa );
::size_t CN = C.size();
for( ::size_t i = 0; i < CN; i++ )
{
int idx = C[i];
double val = meshdata->dkde1[idx] * ne1[i] + meshdata->dkde2[idx] * ne2[i];
force[i] = val;
}
meshdata->kappa = kappa;
double alpha = 0.5;
double skap = abs(kappa).max();
if( skap > 1e-6 )
{
force = tanh(force);
kappa = tanh(kappa);
force = ((1-alpha)*force / (1e-9+abs(force).max()) + alpha*kappa / (1e-2+abs(kappa).max()));
return force;
}
else
{
return force / (abs(force)).max();
}
}
std::valarray<double> MeanCurvatureEnergy::getforce( const std::list<int>& vtkNotUsed(C))
{
std::cout<<"Err!\n";
return std::valarray<double>(0);
}