EllipseFit2<Real>::EllipseFit2 (int numPoints, const Vector2<Real>* points, Vector2<Real>& center, Matrix2<Real>& rotate, Real diag[2], Real& error) : mNumPoints(numPoints), mPoints(points) { // Energy function is E : R^5 -> R where // V = (V0, V1, V2, V3, V4) // = (D[0], D[1], U.X(), U.Y(), atan2(R[1][0],R[1][1])). mTemp = new1<Vector2<Real> >(numPoints); MinimizeN<Real> minimizer(5, Energy, 8, 8, 32, this); InitialGuess(numPoints, mPoints, center, rotate, diag); Real angle = Math<Real>::ACos(rotate[0][0]); Real e0 = diag[0]*Math<Real>::FAbs(rotate[0][0]) + diag[1]*Math<Real>::FAbs(rotate[0][1]); Real e1 = diag[0]*Math<Real>::FAbs(rotate[1][0]) + diag[1]*Math<Real>::FAbs(rotate[1][1]); Real v0[5] = { ((Real)0.5)*diag[0], ((Real)0.5)*diag[1], center.X() - e0, center.Y() - e1, (Real)0 }; Real v1[5] = { ((Real)2)*diag[0], ((Real)2)*diag[1], center.X() + e0, center.Y() + e1, Math<Real>::PI }; Real vInitial[5] = { diag[0], diag[1], center.X(), center.Y(), angle }; Real vMin[5]; minimizer.GetMinimum(v0, v1, vInitial, vMin, error); diag[0] = vMin[0]; diag[1] = vMin[1]; center.X() = vMin[2]; center.Y() = vMin[3]; rotate.MakeRotation(vMin[4]); delete1(mTemp); }