package org.opencv.core;
/**
* <p>class CV_EXPORTS TermCriteria <code></p>
*
* <p>// C++ code:</p>
*
*
* <p>public:</p>
*
* <p>enum</p>
*
*
* <p>COUNT=1, //!< the maximum number of iterations or elements to compute</p>
*
* <p>MAX_ITER=COUNT, //!< ditto</p>
*
* <p>EPS=2 //!< the desired accuracy or change in parameters at which the
* iterative algorithm stops</p>
*
* <p>};</p>
*
* <p>//! default constructor</p>
*
* <p>TermCriteria();</p>
*
* <p>//! full constructor</p>
*
* <p>TermCriteria(int type, int maxCount, double epsilon);</p>
*
* <p>//! conversion from CvTermCriteria</p>
*
* <p>TermCriteria(const CvTermCriteria& criteria);</p>
*
* <p>//! conversion to CvTermCriteria</p>
*
* <p>operator CvTermCriteria() const;</p>
*
* <p>int type; //!< the type of termination criteria: COUNT, EPS or COUNT + EPS</p>
*
* <p>int maxCount; // the maximum number of iterations/elements</p>
*
* <p>double epsilon; // the desired accuracy</p>
*
* <p>};</p>
*
* <p>The class defining termination criteria for iterative algorithms. You can
* initialize it by default constructor and then override any parameters, or the
* structure may be fully initialized using the advanced variant of the
* constructor.
* </code></p>
*
* @see <a href="http://docs.opencv.org/modules/core/doc/basic_structures.html#termcriteria">org.opencv.core.TermCriteria</a>
*/
public class TermCriteria {
/**
* The maximum number of iterations or elements to compute
*/
public static final int COUNT = 1;
/**
* The maximum number of iterations or elements to compute
*/
public static final int MAX_ITER = COUNT;
/**
* The desired accuracy threshold or change in parameters at which the iterative algorithm is terminated.
*/
public static final int EPS = 2;
public int type;
public int maxCount;
public double epsilon;
/**
* Termination criteria for iterative algorithms.
*
* @param type
* the type of termination criteria: COUNT, EPS or COUNT + EPS.
* @param maxCount
* the maximum number of iterations/elements.
* @param epsilon
* the desired accuracy.
*/
public TermCriteria(int type, int maxCount, double epsilon) {
this.type = type;
this.maxCount = maxCount;
this.epsilon = epsilon;
}
/**
* Termination criteria for iterative algorithms.
*/
public TermCriteria() {
this(0, 0, 0.0);
}
public TermCriteria(double[] vals) {
set(vals);
}
public void set(double[] vals) {
if (vals != null) {
type = vals.length > 0 ? (int) vals[0] : 0;
maxCount = vals.length > 1 ? (int) vals[1] : 0;
epsilon = vals.length > 2 ? (double) vals[2] : 0;
} else {
type = 0;
maxCount = 0;
epsilon = 0;
}
}
public TermCriteria clone() {
return new TermCriteria(type, maxCount, epsilon);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(type);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(maxCount);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(epsilon);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof TermCriteria)) return false;
TermCriteria it = (TermCriteria) obj;
return type == it.type && maxCount == it.maxCount && epsilon == it.epsilon;
}
@Override
public String toString() {
if (this == null) return "null";
return "{ type: " + type + ", maxCount: " + maxCount + ", epsilon: " + epsilon + "}";
}
}