[planegcs] Support circle-to-circle tangent when centers coincide

This simply implies avoiding some NaN's when computing error or gradient.
This commit is contained in:
Ajinkya Dahale
2024-08-25 23:20:41 +05:30
parent 4d447bcb24
commit 2c6817d796

View File

@@ -1588,10 +1588,10 @@ double ConstraintTangentCircumf::error()
double dx = (*c1x() - *c2x());
double dy = (*c1y() - *c2y());
if (internal) {
return scale * (sqrt(dx * dx + dy * dy) - std::abs(*r1() - *r2()));
return scale * ((dx * dx + dy * dy) - (*r1() - *r2()) * (*r1() - *r2()));
}
else {
return scale * (sqrt(dx * dx + dy * dy) - (*r1() + *r2()));
return scale * ((dx * dx + dy * dy) - (*r1() + *r2()) * (*r1() + *r2()));
}
}
@@ -1602,33 +1602,32 @@ double ConstraintTangentCircumf::grad(double* param)
|| param == r2()) {
double dx = (*c1x() - *c2x());
double dy = (*c1y() - *c2y());
double d = sqrt(dx * dx + dy * dy);
if (param == c1x()) {
deriv += dx / d;
deriv += 2 * dx;
}
if (param == c1y()) {
deriv += dy / d;
deriv += 2 * dy;
}
if (param == c2x()) {
deriv += -dx / d;
deriv += 2 * -dx;
}
if (param == c2y()) {
deriv += -dy / d;
deriv += 2 * -dy;
}
if (internal) {
if (param == r1()) {
deriv += (*r1() > *r2()) ? -1 : 1;
deriv += 2 * (*r2() - *r1());
}
if (param == r2()) {
deriv += (*r1() > *r2()) ? 1 : -1;
deriv += 2 * (*r1() - *r2());
}
}
else {
if (param == r1()) {
deriv += -1;
deriv += 2 * (*r1() + *r2());
}
if (param == r2()) {
deriv += -1;
deriv += 2 * (*r1() + *r2());
}
}
}