# Draw arc passing in three points

Hello I am looking for a function with this header :
double drawArc(cv::Mat& image, const cv::Point& pointA, const cv::Point& pointB, const cv::Point& pointC, const cv::Scalar& color, int thickness);
which draw a circle arc beginning at point A, ending at point B and passing at point C
it return the arc angle in degrees
I have asking chatGPT but it fails to find a solution.
Thank you very much
Best regards

finally after fighting 4 hours with chatGPT 4 I obtained the following code which seems to work :

``````double drawArc(cv::Mat& image, const cv::Point& pointA, const cv::Point& pointB, const cv::Point& pointC, const cv::Scalar& color, int thickness) {
// Calculer le centre du cercle passant par les trois points
double ax = pointA.x, ay = pointA.y;
double bx = pointB.x, by = pointB.y;
double cx = pointC.x, cy = pointC.y;

double d = 2.0 * (ax * (by - cy) + bx * (cy - ay) + cx * (ay - by));

double ux = ((ax * ax + ay * ay) * (by - cy) + (bx * bx + by * by) * (cy - ay) + (cx * cx + cy * cy) * (ay - by)) / d;
double uy = ((ax * ax + ay * ay) * (cx - bx) + (bx * bx + by * by) * (ax - cx) + (cx * cx + cy * cy) * (bx - ax)) / d;

cv::Point center(ux, uy);

// Calculer le rayon du cercle
double radius = std::hypot(pointA.x - center.x, pointA.y - center.y);

// Calculer les angles des points par rapport au centre du cercle
double angleA = std::atan2(pointA.y - center.y, pointA.x - center.x) * 180 / CV_PI;
double angleB = std::atan2(pointB.y - center.y, pointB.x - center.x) * 180 / CV_PI;
double angleC = std::atan2(pointC.y - center.y, pointC.x - center.x) * 180 / CV_PI;

// Ajuster les angles si nécessaire
if (angleA < 0) angleA += 360;
if (angleB < 0) angleB += 360;
if (angleC < 0) angleC += 360;

// Déterminer l'angle de début et de fin pour le dessin
double startAngle, endAngle;
// Organiser les angles dans l'ordre croissant
std::vector<double> angles = { angleA, angleB, angleC };
std::sort(angles.begin(), angles.end());

// Si l'angle de C est l'angle intermédiaire, alors C est entre A et B
if (angles[1] == angleC) {
startAngle = angleA;
endAngle = angleB;
}
else {
// Si non, dessiner l'arc complémentaire
if (angleA > angleB) {
startAngle = angleA;
endAngle = angleB + 360;
}
else {
startAngle = angleA + 360;
endAngle = angleB;
}
}

// Dessiner l'arc

// Calculer et retourner l'angle de l'arc
double arcAngle = endAngle - startAngle;
if (arcAngle < 0) arcAngle += 360;

return arcAngle;
}
``````

since OpenCV does not have a `"fitCircle"` (only `fitEllipse`), this would require solving for the circle parameters manually:

OK thank you but what I wanted was not simply draw a circle passing by 3 points but an arc beginning at A, ending at B and passing at C

but the code of chatGPT works