217 Vec3r basis1, basis2, d, eig;
219 real aterm_da, bterm_da, cterm_da, const_da;
220 real aterm_db, bterm_db, cterm_db, const_db;
223 real *weights, *kappas, *d1s, *d2s;
239 N[0] =
N[1] =
N[2] = 0.0;
241 for (itE =
v->incoming_edges_begin(); itE !=
v->incoming_edges_end(); itE++) {
242 N =
Vec3r(
N + (*itE)->GetaFace()->GetNormal());
244 real normN =
N.norm();
253 basis1[0] = basis1[1] = basis1[2] = 0.0;
262 basis2 = (
N ^ basis1);
266 basis1 = (
N ^ basis2);
269 aterm_da = bterm_da = cterm_da = const_da = 0.0;
270 aterm_db = bterm_db = cterm_db = const_db = 0.0;
271 int nb_edges =
v->GetEdges().size();
273 weights = (
real *)malloc(
sizeof(
real) * nb_edges);
274 kappas = (
real *)malloc(
sizeof(
real) * nb_edges);
275 d1s = (
real *)malloc(
sizeof(
real) * nb_edges);
276 d2s = (
real *)malloc(
sizeof(
real) * nb_edges);
279 for (itE =
v->incoming_edges_begin(); itE !=
v->incoming_edges_end(); itE++) {
282 real weight, kappa, d1, d2;
316 vec_edge =
Vec3r(-1 *
e->GetVec());
319 vdotN = vec_edge *
N;
322 kappa = 2.0 * vdotN / ve2;
338 weight += ve2 * f1->
getArea() / 4.0;
341 weight += ve2 * f1->
getArea() / 8.0;
351 weight += ve2 * f1->
getArea() / 4.0;
354 weight += ve2 * f1->
getArea() / 8.0;
359 d[0] = vec_edge[0] - vdotN *
N[0];
360 d[1] = vec_edge[1] - vdotN *
N[1];
361 d[2] = vec_edge[2] - vdotN *
N[2];
369 weights[edge_count] = weight;
370 kappas[edge_count] = kappa;
371 d1s[edge_count] = d1;
372 d2s[edge_count] = d2;
376 aterm_da += weight * d1 * d1 * d1 * d1;
377 bterm_da += weight * d1 * d1 * 2 * d1 * d2;
378 cterm_da += weight * d1 * d1 * d2 * d2;
379 const_da += weight * d1 * d1 * (-kappa);
381 aterm_db += weight * d1 * d2 * d1 * d1;
382 bterm_db += weight * d1 * d2 * 2 * d1 * d2;
383 cterm_db += weight * d1 * d2 * d2 * d2;
384 const_db += weight * d1 * d2 * (-kappa);
388 aterm_da -= cterm_da;
389 const_da += cterm_da * normKh;
391 aterm_db -= cterm_db;
392 const_db += cterm_db * normKh;
395 if (((aterm_da * bterm_db - aterm_db * bterm_da) != 0.0) &&
396 ((const_da != 0.0) || (const_db != 0.0)))
398 linsolve(aterm_da, bterm_da, -const_da, aterm_db, bterm_db, -const_db, &a, &
b);
422 err_e1 = err_e2 = 0.0;
424 for (
e = 0;
e < edge_count;
e++) {
425 real weight, kappa, d1, d2;
434 temp1 =
fabs(eig[0] * d1 + eig[1] * d2);
435 temp1 = temp1 * temp1;
436 temp2 =
fabs(eig[1] * d1 - eig[0] * d2);
437 temp2 = temp2 * temp2;
440 delta = K1 * temp1 + K2 * temp2 - kappa;
441 err_e1 += weight * delta * delta;
444 delta = K2 * temp1 + K1 * temp2 - kappa;
445 err_e2 += weight * delta * delta;
453 if (err_e2 < err_e1) {
460 e1[0] = eig[0] * basis1[0] + eig[1] * basis2[0];
461 e1[1] = eig[0] * basis1[1] + eig[1] * basis2[1];
462 e1[2] = eig[0] * basis1[2] + eig[1] * basis2[2];
static void linsolve(real m11, real m12, real b1, real m21, real m22, real b2, real *x1, real *x2)