#c #opencv #math #linear-algebra #ellipse
#c #opencv #математика #линейная алгебра #эллипс
Вопрос:
У меня есть три точки, скажем, C в качестве центральной точки, а P1 и P2 — две другие точки. Я вычислил угол между C и P1, известный как angle1, а c p2 называется углом 2. вот код, который я использую для его вычисления
angle1 = atan2(p1.y - c.y, p1.x - c.x);
angle2 = atan2(p2.y - c.y, p2.x - c.x);
после этого я изменил их на градусы, используя это.
if (angle1 >= 0)
angle1 = angle1 * (180 / PI);
else
angle1 = (angle1 2 * PI) * (180 / PI);
if(angle2 >= 0)
angle2 = angle2 * (180 / PI);
else
angle2 = (angle2 2 * PI) * (180 / PI);
Затем я использую этот метод OpenCV для вычисления рисования дуги, некоторое время дуга идеальна между двумя точками, а иногда она заполняет весь круг, кроме двух точек, которые я размещаю здесь. изображение.
radius = sqrt(pow(c.x - p1.x, 2.0) pow(c.y - p1.y, 2.0));
ellipse(outPutMat, c, cv::Size(radius, radius), 0, angle1, angle2, Scalar(0, 0, 0), -1, 8, 0);
красные точки — это точки, а черный — цвет, заполненный эллипсом. Для 1-го изображения agngle1 = 42.1376, а angle2 = 338,962 Для 2-го изображения agngle1 = 152,447, а angle2 = 223,363
2-е изображение дало правильные результаты, но первое неверно. Я просто хочу заполнить область между точками.
Ответ №1:
После короткой проверки кажется, что функция OpenCV вычисляет средний угол as ma = (angle1 angle2) / 2
и рисует дугу через эту точку.
Оба (-45,45) и (45, -45) дают одну и ту же 90-градусную дугу через ноль, оба (315,45) и (45,315) дают одну и ту же 270-градусную дугу.
Чтобы получить желаемый результат, вы не должны сопоставлять отрицательный угол с положительным значением ( (angle1 2 * PI)
), а использовать 42
-21
значения и в первом случае.
Комментарии:
1. Я уже исправил эту проблему. Спасибо за ответ. ваш ответ также правильный.