template<typename Real> std::array<Real, 6> EllipseAsQuadric(cv::RotatedRect ellipse) {
Real xc = static_cast<Real>(ellipse.center.x);
Real yc = static_cast<Real>(ellipse.center.y);
Real a = static_cast<Real>(ellipse.size.width / 2);
Real b = static_cast<Real>(ellipse.size.height / 2);
Real r = static_cast<Real>(ellipse.angle * CV_PI / 180.0);
std::array<Real, 6> equ;
Real A, B, C, D, E, F;
float sinr = sin(r);
float cosr = cos(r);
A=equ[0] = a*a*sinr*sinr + b*b*cosr*cosr;
B=equ[1] = 2 * (b*b - a*a)*sinr*cosr;
C=equ[2] = a*a*cosr*cosr + b*b*sinr*sinr;
D = equ[3] = -2 * A*xc - B*yc;
E = equ[4] = -B*xc - 2 * C*yc;
F = equ[5]=A*xc*xc + B*xc*yc + C*yc*yc - a*a*b*b;
return equ;
}
std::vector<cv::Point> IntersectConicAndLine(float A, float B, float C, float D, float E, float F, cv::Point pt1, cv::Point pt2) {
http://csharphelper.com/blog/2014/11/see-where-a-line-intersects-a-conic-section-in-c/
float x1 = pt1.x;
float y1 = pt1.y;
float x2 = pt2.x;
float y2 = pt2.y;
float dx = x2 - x1;
float dy = y2 - y1;
float a = A * dx * dx + B * dx * dy + C * dy * dy;
float b = A * 2 * x1 * dx + B * x1 * dy + B * y1 * dx +
C * 2 * y1 * dy + D * dx + E * dy;
float c = A * x1 * x1 + B * x1 * y1 + C * y1 * y1 +
D * x1 + E * y1 + F;
std::vector<cv::Point> solutions;
float det = b * b - 4 * a * c;
if (det == 0) {
float t = -b / (2 * a);
solutions.push_back(cv::Point(x1 + t * dx, y1 + t * dy));
} else if (det > 0) {
float root = (float)std::sqrt(b * b - 4 * a * c);
float t1 = (-b + root) / (2 * a);
solutions.push_back(cv::Point(x1 + t1 * dx, y1 + t1 * dy));
float t2 = (-b - root) / (2 * a);
solutions.push_back(cv::Point(x1 + t2 * dx, y1 + t2 * dy));
}
return solutions;
}
https://www.desmos.com/calculator/42lngkxil6