Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Партизан

Рейтинг: 5.00. Голосов: 2.

TransformUtil

Запись от Партизан размещена 20.05.2012 в 16:49

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

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

TransformUtil.scaleFromPoint работает аналогично. Собственно это две обертки для одной и той же приватной функции, для удобства.


З.Ы. Вот тут, к повороту автор подошел более творчески, нежели я. Есть там много интересного, что неплохо бы знать, когда нужно что-то повернуть


Код AS3:
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);
		}
	}
 
}
Вложения
Тип файла: rar TransformUtil.rar (337.4 Кб, 103 просмотров)
Всего комментариев 2

Комментарии

Старый 20.05.2012 19:38 dimarik вне форума
dimarik
 
Аватар для dimarik
дежавю
Старый 25.05.2012 15:08 ~~~ вне форума
~~~
 
Аватар для ~~~
 
Последние записи от Партизан

 


Часовой пояс GMT +4, время: 10:24.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.