Итак, мы хотим сохранить две противоположные вершины прямоугольника и диагональ между ними.
Пусть полуширина прямоугольника w
, полувысота h
, радиус круга r
. Пусть начало координат находится в центре круга.
Угол между диагональю и OX равен
theta = atan(h/w)
После преобразования угол между диагональю и нижним краем нового прямоугольника будет
fi = alpha + theta
Таким образом, мы можем найти полуширину нового прямоугольника
nw = r * cos(fi)
И координаты смещенной вершины
2*nw*cos(alpha) - w, -h - 2*nw*sin(alpha)
Мы хотим найти аффинную трансформацию M , которая преобразует два вершины в те же точки и третью вершину в координаты выше
|-w w w| |-w w 2*nw*cos(alpha) - w |
M * |-h h -h| = |-h h -h - 2*nw*sin(alpha)|
|1 1 1| |1 1 1|
Чтобы найти M , мы делаем инверсию левой матрицы и умножаем обе стороны на эту обратную.
M = |nw*cos(alpha)/w w/h - nw*cos(alpha)/h 0|
|-nw*sin(alpha)/w 1 + nw*sin(alpha)/h 0|
|0 0 1|
Теперь мы можем преобразовать все координаты с помощью этой матрицы и получить повернутый прямоугольник.
Пример преобразования координат из моей Delphi программы, генерирующей картинку ниже:
nX := Round(cx + x * cos(alpha)*nw/w + y * (w/h - cos(alpha)*nw / h));
nY := Round(cy - x * nw/w*sin(alpha) + y * (1 + nw/h * sin(alpha)));
введите описание изображения здесь