Cleanup: simplify checks calculating tangents
This commit is contained in:
30
extern/curve_fit_nd/intern/curve_fit_cubic.c
vendored
30
extern/curve_fit_nd/intern/curve_fit_cubic.c
vendored
@@ -450,22 +450,24 @@ 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);
|
if (tan_dot > 1.0 - eps) {
|
||||||
double scale;
|
/* no angle difference (use fallback, length wont make any difference) */
|
||||||
if (tan_dot > -1.0) {
|
return (1.0 / 3.0) * 0.75;
|
||||||
const double angle = acos(tan_dot) / 2.0;
|
}
|
||||||
const double angle_cos = cos(angle);
|
else if (tan_dot < -1.0 + eps) {
|
||||||
scale = (1.0 - angle_cos) / (angle_sin * 2.0);
|
/* parallele tangents (half-circle) */
|
||||||
}
|
return (1.0 / 2.0);
|
||||||
else {
|
|
||||||
scale = 1.0 / 2.0;
|
|
||||||
}
|
|
||||||
return (scale / angle_sin);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return (1.0 / 3.0) * 0.75;
|
/* 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user