参考文献: P. L. Rosin, “A note on the least squares fitting of ellipses,” Pattern Recognition Letters, vol. 14, no. 10, pp. 799–808, 1993.
源码:This is the source code for the paper [Arc-support Line Segments Revisited: An Efficient and High-quality Ellipse Detection]
/*----------------------------------------------------------------------------*/
/** Approximate the distance between a point and an ellipse using Rosin distance.
*/
#define DBL_MAX 1.7976931348623158e+308 // max value
inline double d_rosin(double* param, double x, double y)
{
double ae2 = param[2] * param[2];
double be2 = param[3] * param[3];
x = x - param[0];
y = y - param[1];
double xp = x * cos(-param[4]) - y * sin(-param[4]);
double yp = x * sin(-param[4]) + y * cos(-param[4]);
double fe2;
fe2 = ae2 - be2;
double X = xp * xp;
double Y = yp * yp;
double delta = (X + Y + fe2) * (X + Y + fe2) - 4 * X * fe2;
double A = (X + Y + fe2 - sqrt(delta)) / 2.0;
double ah = sqrt(A);
double bh2 = fe2 - A;
double term = (A * be2 + ae2 * bh2);
double xi = ah * sqrt(ae2 * (be2 + bh2) / term);
double yi = param[3] * sqrt(bh2 * (ae2 - A) / term);
double d[4], dmin;
d[0] = dist(xp, yp, xi, yi);
d[1] = dist(xp, yp, xi, -yi);
d[2] = dist(xp, yp, -xi, yi);
d[3] = dist(xp, yp, -xi, -yi);
dmin = DBL_MAX;
for (int i = 0; i < 4; i++)
{
if (d[i] <= dmin)
dmin = d[i];
}
// if (X+Y>xi*xi+yi*yi)
// return dmin;
// else return -dmin;
return dmin;
}