Как я могу точно нарисовать мое повернутое растровое изображение? - PullRequest
4 голосов
/ 28 января 2010

У меня есть контейнер с замаскированным растровым изображением. Масштаб и вращение этого контейнера изменяются во время выполнения, и мне нужно нарисовать замаскированное растровое изображение, но я не могу определить соответствующие матричные вычисления для этого.

Мой код работает правильно, чтобы отразить положение, масштаб, смещение для центрирования без вращения. При повороте угол правильный, но расположение неправильное - я считаю, потому что размеры меняются при повороте прямоугольника.

Может кто-нибудь помочь мне понять, как компенсировать это при позиционировании - вот код:

 // Adjust the transformation matrix to account for the position of the container
        var tMatrix:Matrix = _imgContainer.transform.matrix;

        //Offset for container
        tMatrix.translate(this.x,this.y);

        //Offset for bounds centering
        tMatrix.translate(-_imgContainer.width/2,-_imgContainer.height/2);   

       // Compensate for rotation
       // ????

   var result_bitmap:BitmapData = new BitmapData(_maskedImg.width,_maskedImg.height,true,0x00FFFFFF);
   result_bitmap.lock();
   result_bitmap.draw(_maskedImg,tMatrix,null,null,null,true);
   result_bitmap.unlock();

Заранее благодарим за любую помощь, которую вы можете оказать -

B

EDIT: Извините, если я не объясняю это правильно, позвольте мне попробовать еще раз с изображением для поддержки. У меня есть замаскированное растровое изображение в контейнере, который я использую в качестве источника для рисования нового растрового изображения. этот контейнер может быть масштабирован / повернут пользователем во время выполнения до захвата. Для этого я передаю метод draw матрицу преобразования, основанную на матрице контейнера, и корректирую значения tx и ty для учета ненулевого начала (из-за центрирования). До этого момента он работал нормально и отражал то, что я ожидал.

Однако - после того, как этот контейнер повернут, ПОЛОЖЕНИЕ захвата теперь снова отключено - вероятно, из-за изменения размеров, поэтому смещения tx / ty теперь некорректны для новых размеров контейнера. Мне просто нужно компенсировать это, но я не могу понять, как.

Кто-нибудь имеет опыт работы с матрицей преобразования, которая может помочь ?? Еще раз спасибо за усилия!

Хостинг imgur.com

Хостинг imgur.com

Ответы [ 4 ]

1 голос
/ 30 января 2010

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

Это было вместо копирования матрицы преобразования из контейнера. Так что вместо

var tMatrix:Matrix = _imgContainer.transform.matrix;

Я устанавливаю значения непосредственно в следующем порядке:

tMatrix.scale (_imgContainer.scaleX, _imgContainer.scaleY);
tMatrix.rotate (_imgContainer.rotation * (Math.PI/180));
tMatrix.translate (_imgContainer.x, _imgContainer.y);

Спасибо за усилия -

б

0 голосов
/ 28 января 2010

Я не уверен, что полностью понял ваш вопрос, но ничего не стоит, если вы поверните объект 100x200 на 90 градусов, это даст 200x100 для ширины и высоты.

Есть несколько способов обойти это, но я обычно использую scaleX / scaleY, так как они не подвержены поворотам, и умножают их на исходную ширину / высоту клипа.

0 голосов
/ 29 января 2010

Я также не понял, что вы пытаетесь сделать на 100%, но я понял основную проблему, заключающуюся в том, что вращение, которое вы применили, это изменение tx / ty, которое вы должны использовать при применении матрицы преобразования.

На этом основании, возможно, это поможет: http://www.senocular.com/flash/tutorials/transformmatrix/ Посмотрите на раздел "Управление матрицами преобразования", в частности, на часть о игнорировании значений перевода с помощью deltaTransformPoint. Это AS2, но, надеюсь, принципы помогут вам выбрать правильный путь.

0 голосов
/ 28 января 2010

Если растровое изображение содержится внутри контейнера, любые преобразования, примененные к контейнеру, должны также применяться к содержащимся в нем вещам.

Я бы не применял никаких преобразований к растровому изображению, я бы применилих просто в контейнер.

...