TransformUtil
Запись от Партизан размещена 20.05.2012 в 16:49
Иногда необходима такая возможность, как вращение объекта вокруг произвольной точки. Кода для этого нужно пара-другая строк, но написание их, как правило, столкнет с изучением класса Matrix(можно конечно и другими способами воспользоваться, к примеру, вращением родителя). Частенько более-менее разобравшись что к чему, через какое-то время читаешь все заново

Последний раз, когда мне понадобился поворот вокруг произвольной точки, было написание редактора фото, который собирал коллаж из трех фотографий в одну, для последующего аплоада в группу вконтакте. Кроме поворота возникла необходимость масштабирования, так же, по произвольной точке. Вот собственно история создания простенького класса отвечающего этим задачам.
В архиве лежит флешка в которой можно "пощупать" класс. Небольшой сдвиг после поворота мною замечен, однако при написании класса я взял первую попавшуюся фотографию размер которой 1024*768, и тестил с изначальным масштабированием(scaleX,scaleY= 0.5-0.6) этой фотографии. Результаты меня устроили, хотя и заметен небольшой сдвиг фотографии после нескольких преобразований. Отчего этот сдвиг происходит, сейчас мне лень тестить


Кстати, как юзать:
Здесь photo - DisplayObject который нужно повернуть.
point:Point Это точка, в родительских координатах (если последний параметр true) или локальных(если false) для photo.
ну и 90 здесь соответственно угол в градусах на который нужно повернуть.
Возвращает метод Point - это координаты локальной для photo точки point после преобразования.
TransformUtil.scaleFromPoint работает аналогично. Собственно это две обертки для одной и той же приватной функции, для удобства.
З.Ы. Вот тут, к повороту автор подошел более творчески, нежели я. Есть там много интересного, что неплохо бы знать, когда нужно что-то повернуть

package utils { import flash.display.DisplayObject; import flash.geom.Matrix; import flash.geom.Point; /** * ... * @author Mikhail Klabukov q_qwert@mail.ru */ public class TransformUtil { public function TransformUtil() { } static public function rotateAroundPoint(object:DisplayObject, pnt:Point, angle:Number, useParentCoords:Boolean = true):Point { return transform(object, pnt, object.scaleX, object.scaleY, angle, useParentCoords); } static public function scaleFromPoint(object:DisplayObject, pnt:Point, scaleX:Number, scaleY:Number, useParentCoords:Boolean = true):Point { return transform(object, pnt, scaleX, scaleY, object.rotation, useParentCoords); } static private function transform(object:DisplayObject, pnt:Point, scaleX:Number, scaleY:Number, angle:Number, useParentCoords:Boolean = true):Point { var local:Point; if (object.parent && useParentCoords) { var global:Point = object.parent.localToGlobal(pnt); local = object.globalToLocal(global); } else { local = pnt; } var matrix:Matrix = object.transform.matrix; matrix.identity(); matrix.rotate(d2r(angle)); matrix.scale(scaleX, scaleY); var newPos:Point = matrix.transformPoint(local); object.transform.matrix = matrix; object.x = pnt.x - newPos.x; object.y = pnt.y - newPos.y; return newPos; } static private function d2r(degrees:Number):Number { return degrees * (Math.PI / 180); } } }
Всего комментариев 2
Комментарии
![]() ![]() |
|
дежавю
|
![]() ![]() |
|
Последние записи от Партизан
- TransformUtil (20.05.2012)
- Between2Nums (28.11.2010)
- Termination (27.11.2010)
- KeyChecker v0.2 (27.11.2010)
- KeyChecker (26.11.2010)