2010-01-28 4 views
4

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

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

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

// 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(); 

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

б

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

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

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

Hosted by imgur.com

Hosted by imgur.com

+0

Не думаю, что я понимаю, что ты пытаясь сделать: можете ли вы сделать снимок или снимок экрана? –

+0

Обновлен вопрос с лучшим объяснением и 2 изображениями для справки - спасибо за усилия. – WillyCornbread

ответ

1

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

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

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

Эта проблема возникает, потому что когда вы выполняете перевод, точка, в которой происходит поворот, изменяется в соответствии с этим переводом. Порядок операций, которые вы использовали здесь, на самом деле не является решением общего назначения; вместо этого он специфичен для порядка преобразований, примененных пользователем, которые ваш код захвата должен точно отражать (хотя и с разными значениями). – Dustman

+0

Dustman - ваше утверждение о том, что порядок переводов строго зависит от того, что пользователь преобразовал исходный битмап-контейнер, неверен. Независимо от порядка, в котором шкала, положение и вращение источника применяется пользователем, порядок преобразования в указанном выше коде последовательно отображается правильно. -b – WillyCornbread

0

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

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

+0

Все преобразования применяются к контейнеру, мой вопрос конкретно касается матрицы преобразования при рисовании растрового изображения и способа компенсации вращения во время рисования. – WillyCornbread

+0

Зачем вращать растровое изображение в любом случае? Хотя я думаю, что вращение отключено от другой «центральной точки», поэтому вы можете проверить выравнивание – Daniel

+0

Проблема не в ротации растрового изображения - при рисовании нового растрового изображения из источника битмапдаты, преобразования (масштаб, вращение и т. д.) к источнику не учитываются. Вы передаете матрицу преобразования, чтобы преобразовать источник. Эта матрица преобразования в отношении значений .tx и .ty при вращении источника - это то, с чем я столкнулся. Благодарю. -b – WillyCornbread

0

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

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

0

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

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

+0

Спасибо, я посмотрю. Я возвращаюсь и переписываю часть этого, чтобы проверить, могу ли я упростить свой тестовый пример и приблизиться к решению. Я уточню, если я это выясню ... – WillyCornbread

Смежные вопросы