2 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 // + This file is part of enGrid. +
6 // + Copyright 2008-2013 enGits GmbH +
8 // + enGrid is free software: you can redistribute it and/or modify +
9 // + it under the terms of the GNU General Public License as published by +
10 // + the Free Software Foundation, either version 3 of the License, or +
11 // + (at your option) any later version. +
13 // + enGrid is distributed in the hope that it will be useful, +
14 // + but WITHOUT ANY WARRANTY; without even the implied warranty of +
15 // + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +
16 // + GNU General Public License for more details. +
18 // + You should have received a copy of the GNU General Public License +
19 // + along with enGrid. If not, see <http://www.gnu.org/licenses/>. +
21 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
23 #include "optimisenormalvector.h"
25 void OptimiseNormalVector::addConstraint(vec3_t n
)
27 m_Constraints
.append(n
);
30 void OptimiseNormalVector::addFace(vec3_t n
)
35 double OptimiseNormalVector::func(vec3_t n
)
41 foreach (vec3_t nc
, m_Constraints
) {
44 hc
= max(h
, fabs(hc
));
46 foreach (vec3_t nf
, m_Faces
) {
51 return sqr(hc
) + sqr(1 - hf
);
54 vec3_t
OptimiseNormalVector::optimise(vec3_t n
)
57 computeDerivatives(n
);
60 while (count
< 100 && scale
> 2e-4) {
61 double ag
= grad_f
.abs();
62 double err1
= func(n
);
63 vec3_t dn
= -1.0*grad_f
;
65 if (grad_f
.abs() > 1e-10) {
68 double relax
= min(scale
, scale
*grad_f
.abs());
72 double err2
= func(n
);
77 computeDerivatives(n
);
82 vec3_t
OptimiseNormalVector::operator()(vec3_t n
)
84 vec3_t n_opt
= optimise(n
);
85 if (!checkVector(n_opt
)) {