Cleanup: simplify checks calculating tangents

This commit is contained in:
Campbell Barton
2016-05-17 01:58:07 +10:00
parent 688858d3a8
commit 2b02e03973

View File

@@ -450,23 +450,25 @@ static double points_calc_circle_tangent_factor(
const double tan_r[], const double tan_r[],
const uint dims) const uint dims)
{ {
const double angle_sin = len_vnvn(tan_l, tan_r, dims) / 2.0; const double eps = 1e-8;
if (angle_sin != 0.0) {
const double tan_dot = dot_vnvn(tan_l, tan_r, dims); const double tan_dot = dot_vnvn(tan_l, tan_r, dims);
double scale; if (tan_dot > 1.0 - eps) {
if (tan_dot > -1.0) { /* no angle difference (use fallback, length wont make any difference) */
const double angle = acos(tan_dot) / 2.0;
const double angle_cos = cos(angle);
scale = (1.0 - angle_cos) / (angle_sin * 2.0);
}
else {
scale = 1.0 / 2.0;
}
return (scale / angle_sin);
}
else {
return (1.0 / 3.0) * 0.75; return (1.0 / 3.0) * 0.75;
} }
else if (tan_dot < -1.0 + eps) {
/* parallele tangents (half-circle) */
return (1.0 / 2.0);
}
else {
/* non-aligned tangents, calculate handle length */
const double angle = acos(tan_dot) / 2.0;
/* could also use 'angle_sin = len_vnvn(tan_l, tan_r, dims) / 2.0' */
const double angle_sin = sin(angle);
const double angle_cos = cos(angle);
return ((1.0 - angle_cos) / (angle_sin * 2.0)) / angle_sin;
}
} }
/** /**