protected double[] getEllipseBoundingRectsData(double sf) { double xx = u20(); double xy = u11(); double yy = u02(); double theta = 0.5 * Math.atan2(2*xy, xx-yy); double trace = xx + yy; double det = (xx*yy) - (xy*xy); double [] eigval = QuadraticEquation.solveGeneralQuadratic(1, -1*trace, det); double a = 1.0 + Math.sqrt(Math.abs(eigval[1])) * sf * 4; double b = 1.0 + Math.sqrt(Math.abs(eigval[0])) * sf * 4; double [] data = {Math.max(a, b), Math.min(a, b), theta}; return data; }
protected double[] getEllipseBoundingRectsData(double sf) { double xx = u20(); double xy = u11(); double yy = u02(); double theta = 0.5 * Math.atan2(2*xy, xx-yy); double trace = xx + yy; double det = (xx*yy) - (xy*xy); double [] eigval = QuadraticEquation.solveGeneralQuadratic(1, -1*trace, det); double a = 1.0 + Math.sqrt(Math.abs(eigval[1])) * sf * 4; double b = 1.0 + Math.sqrt(Math.abs(eigval[0])) * sf * 4; double [] data = {Math.max(a, b), Math.min(a, b), theta}; return data; }
/** * Construct ellipse from covariance matrix, scale-factor and centroid. * * @param x * x-ordinate of centroid * @param y * y-ordinate of centroid * @param sm * covariance matrix * @param sf * scale-factor * @return an ellipse */ public static Ellipse ellipseFromCovariance(float x, float y, Matrix sm, float sf) { final double xy = sm.get(1, 0); final double xx = sm.get(0, 0); final double yy = sm.get(1, 1); final double theta = 0.5 * Math.atan2(2 * xy, xx - yy); final double trace = xx + yy; final double det = (xx * yy) - (xy * xy); final double[] eigval = QuadraticEquation.solveGeneralQuadratic(1, -trace, det); final double a = Math.sqrt(eigval[1]) * sf; final double b = Math.sqrt(eigval[0]) * sf; return ellipseFromEquation(x, y, a, b, theta); }