![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Apr 2012
Сообщений: 44
|
Ситуация такова: есть изображение, которое лежит внутри контейнера фиксированного размера, оно может быть как больше так и меньше контейнера; у контейнра установлено свойство clipAndEnableScrolling, поэтому все, что за пределами контейнера невидимо. Надо уметь вращать изображение вокруг точки, которая является центром видимой зоны.
public static function rotateImageAroundCenterOfViewPort(image:Image, value:Number):void { var bounds:Rectangle = image.getBounds(image.parent); // Calculate rotation and shifts var angle:Number = value - image.rotation; var radians:Number = angle * (Math.PI / 180.0); var shiftByX:Number = image.parent.width / 2 - bounds.x; var shiftByY:Number = image.parent.height / 2 - bounds.y; // Perform rotation var matrix:Matrix = new Matrix(); matrix.translate(-shiftByX, -shiftByY); matrix.rotate(radians); matrix.translate(+shiftByX, +shiftByY); matrix.concat(image.transform.matrix); image.transform.matrix = matrix; } |
|
|||||
|
Banned
Регистрация: Mar 2013
Сообщений: 1,864
|
Попробуйте вот так, point это точка во круг которой крутится объект.
Если работать не будет, хотя вроде должно, то на форуме много тем, Вы напишите если что, я попробую найти.. Аааа, я Вас вспомнил я тоже сейчас делаю трансформацию и мне кажется, что подход предложенный мной, может не подойти.private static var DEG_TO_RAD:Number = 3.1415926535897932 / 180; public static function rotationPointMatrix(target:DisplayObject, angle:Number, point:Point = null):void { var matrix:Matrix = target.transform.matrix; matrix.translate( -point.x, -point.y); matrix.rotate( -target.rotation * DEG_TO_RAD); matrix.rotate(angle * DEG_TO_RAD); matrix.translate(point.x, point.y); target.transform.matrix = matrix; } |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 44
|
Пока не пробовал, но очень походе на мой способ. Мне кажется, что всю дело в:
Т.к. изображение к тому моменту уже как бы повернуто, то смешения должны задаваться относительно нового угла вращения, а не старого. |
|
|||||
|
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
помещайте изображение в контейнер в координаты
и вращайте сам контейнер |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 44
|
Во-первых, мне надо вращать изображение не вокруг его центра (как это сделать я знаю), а вокруг центра контейнера, в котором оно находится.
Во-вторых, я могу двигать изображение с помощью мыши, так что фиксировать его позицию никак нельзя. |
|
|||||
|
.
|
Цитата:
И, судя по clipAndEnableScrolling тема переезжает во флекс. |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 44
|
Цитата:
Это свойство я использую, и привел в пример только, чтобы пояснить, что контйенер скрывает части изображения, выступающие за его границы. Геометрия от этого не меняется, поэтому я создал тему в более популярном разделе AS 3.0. |
|
|||||
|
Banned
Регистрация: Mar 2013
Сообщений: 1,864
|
Способ с -х-у может подойти, но обяжет все расчёты делать с минусами и не позволит вращать во круг произвольно взятой точки, что обязательно должно присутствовать в трансформе. я как сделаю, то покужу в Вашей теме, что у меня получилось, но пока я застрял на неопределённое время с рамкой, как в FS.
|
|
|||||
|
Регистрация: Apr 2012
Сообщений: 44
|
public static function rotateImageAroundCenterOfViewPort(image:Image, value:int):void { trace("rotation Begin: x ", image.x, " y: ", image.y); var bounds:Rectangle = image.getBounds(image.parent); trace("rotation Begin: bounds.x ", bounds.x, " bounds.y: ", bounds.y); // Calculate rotation and shifts var angle:Number = value - Math.round(image.rotation); var radians:Number = angle * (Math.PI / 180.0); var shiftByX:Number; var shiftByY:Number; // Perform rotation switch(Math.round(image.rotation) / 90 % 4) { case 0: { shiftByX = image.parent.width / 2 - bounds.x; shiftByY = image.parent.height / 2 - bounds.y; break; }; case 1: { shiftByX = image.parent.height / 2 - bounds.y; shiftByY = bounds.width - (image.parent.width / 2 - bounds.x); break; }; case -2: case 2: { shiftByX = bounds.width - (image.parent.width / 2 - bounds.x); shiftByY = bounds.height - (image.parent.height / 2 - bounds.y); break; }; case -1: { shiftByX = bounds.height - (image.parent.height / 2 - bounds.y); shiftByY = image.parent.width / 2 - bounds.x; break; }; default: { break; } } var matrix:Matrix = new Matrix(); matrix.translate(-shiftByX, -shiftByY); matrix.rotate(radians); matrix.translate(+shiftByX, +shiftByY); matrix.concat(image.transform.matrix); image.transform.matrix = matrix; trace("rotation End: x ", image.x, " y: ", image.y); trace("rotation: xShift ", shiftByX, " yShift: ", shiftByY); } |
|
|||||
|
Banned
Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
Добавлено через 21 минуту И погрешности не только в rotation накапливаются, это касается и x,y и может ещё чего. |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:59. |
|
|
« Предыдущая тема | Следующая тема » |
|
|