У меня есть три точки, скажем, 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-е изображение дает правильные результаты, но первое неверно. Я просто хочу заполнить область между точками.
После короткой проверки — кажется, что функция OpenCV вычисляет средний угол как ma = (angle1 + angle2) / 2
и рисует дугу через эту точку.
Оба (-45,45) и (45, -45) дают одинаковую дугу 90 градусов через ноль, а оба (315,45) и (45,315) дают одинаковую дугу 270 градусов.
Чтобы получить желаемый результат, вы не должны сопоставлять отрицательный угол с положительным значением ((angle1 + 2 * PI)
) и использовать 42
а также -21
значения в первом случае.
Других решений пока нет …