Рамка после поворота кадра: пересчёт координат Python

После поворота кадра прямоугольную разметку нужно пересобрать вокруг преобразованных углов. Реализуйте поворот рамки по заданной формуле и верните координаты описанного прямоугольника; обрезка по кадру в этой задаче не выполняется.

Откройте программу платного курса Computer Vision Engineer, чтобы продолжить практику с данными, моделями и CV-сервисом.

Рамка после поворота

Задание

Кадр поворачивают вокруг его центра. Рамка разметки задана двумя углами и обязана остаться параллельной сторонам кадра, поэтому её пересобирают: поворачивают четыре угла исходной рамки и описывают вокруг них новый прямоугольник. Это и есть способ largest_box, принятый в библиотеках аугментации по умолчанию.

Реализуйте функцию rotate_box, которая по рамке, углу поворота и размеру кадра возвращает пересобранную рамку.

Точка кадра переходит при повороте по формулам, где (cx, cy) — центр кадра, а a — угол в радианах:

x2 = cx + (x - cx) * cos(a) - (y - cy) * sin(a)
y2 = cy + (x - cx) * sin(a) + (y - cy) * cos(a)

Рамка на входе и на выходе — кортеж (x_min, y_min, x_max, y_max) в пикселях. Обрезать результат по границам кадра не нужно: после поворота рамка может выйти за кадр, и это нормально.

Пример

rotate_box((0, 0, 100, 100), 45, 200, 200)
# (29.29, -41.42, 170.71, 100.0)

Квадратная рамка со стороной 100 после поворота на 45° превращается в рамку 141,42 на 141,42 — площадь выросла ровно вдвое.

Примечание

Угол приходит в градусах, положительное значение соответствует формулам выше. Размер кадра нужен только для того, чтобы найти его центр: cx = width / 2, cy = height / 2.

Координаты сверяются с точностью до сотых, поэтому округлять результат самостоятельно не нужно. Вызывать функцию вручную тоже не нужно — проверка запускает её сама.

Что проверяется

Код проверок скрыт, так что вот полный список того, что в них разбирается:

  • формат ответа: четыре координаты (x_min, y_min, x_max, y_max);
  • пример из условия — поворот на 45°;
  • нулевой угол: рамка не меняется;
  • поворот на 90°;
  • поворот на 15° на неквадратном кадре, где центр смещён относительно рамки;
  • отрицательный угол;
  • рамка во весь кадр — после поворота она выходит за его границы;
  • вырожденная рамка нулевой ширины.
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи