LINUX.ORG.RU

Поворот изображения вокруг центра

 


0

1

У меня такая проблема: Есть либа для работы с графикой, в ней есть функция поворота, которая поворачивает изображение вокруг ее левого верхнего угла. Как посчитать смещение, на которое после поворота надо сдвинуть картинку, что бы получился поворот вокруг центра изображения?

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

новые координаты центра картинки. Разница между новым центром и старым и будет необходимым смещением.

true_admin ★★★★★
()

функция применения матрицы переноса к двумерному массиву чисел пишется за 2 с половиной минуты.

nanoolinux ★★★★
()

пусть центр картинки имеет координаты (x,y) относительно верхнего левого угла. при повороте они переходят в координаты (x1,y1) => надо перенести картинку на вектор (x-x1, y-y1).

dikiy ★★☆☆☆
()

В каком смысле поворачивается картинка? Как массив пикселей, как прямоугольник с текстурой?

note173 ★★★★★
()
Ответ на: комментарий от Aswed

если запросить у картинки координаты, то она возвращает те же, что и до поворота

ок. а как ты задаешь поворот? Углом?

Если да, то новые координаты будут

(x1,y1)=(x cos(a)+y sin(a), -x sin(a) + y cos(a))

a - угол поворота

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

2 ОП. Обрати внимание, что здесь записан поворот по часовой стрелке(обычно в либах вращение CCW). Либо подставляй a=-alpha, либо меняй знаки при синусах. x = width/2, y = height/2.

maggotroot
()

Япона мать! Ну сдвинь ты сначала изображение, потом поверни, а потом сдвинь обратно!!!

Если ты хочешь сдвигать после поворота, то тебе придется аппроксимацию делать, т.к. вероятность того, что сдвигать придется на целое количество пикселей, будет очень небольшой!

anonymous
()
Ответ на: комментарий от maggotroot

2 ОП. Обрати внимание, что здесь записан поворот по часовой стрелке(обычно в либах вращение CCW). Либо подставляй a=-alpha, либо меняй знаки при синусах. x = width/2, y = height/2.

нифига. поворот записан против часовой. посмотри внимательнее.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Ну почему? Вот выписаны матрицы для поворота против часовой стрелки: https://en.wikipedia.org/wiki/Rotation_matrix

У тебя транспонированное преобразование. Либо ты записал преобразование координат, но опу надо другое.

maggotroot
()
Ответ на: комментарий от dikiy

Поворот задаю углом. Поворот по часовой стрелке. Я понял, что смещение надо считать так: x = x - (w * cos(a) + h * sin(a)) y = y - ((-w) * sin(a) + h * cos(a)) где w - половины ширины изображения, h - половина высоты. Я правильно вас понял? Если да, то это не прокатывает.

Aswed ★★★★★
() автор топика
Ответ на: комментарий от maggotroot

У тебя транспонированное преобразование. Либо ты записал преобразование координат, но опу надо другое.

ах блин. Теперь я увидел. Я имел в виду конечно преобразование против часовой стрелки, просто неправильно в уме перемножил матрицу на вектор.

dikiy ★★☆☆☆
()
Ответ на: комментарий от Aswed

знак у синуса поменяй. И прочти мое сообщение.

И вообще если ты делаешь транслейт, то так

w = width / 2;
h = height / 2;
Tx = w * cos(a) - h * sin(a);
Ty = w * sin(a) + h * cos(a);
image.Translate(-Tx, -Ty); //Если задается смещение

Если ты задаешь координаты левого верхнего угла, то (x0-Tx, y0-Ty), где (x0, y0) — изначальные координаты левого верхнего угла. А вообще возьми листок бумаги, ручку и нарисуй все сам. Сразу станет понятно.

maggotroot
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.