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

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

Оценить эту запись

Класс вращения объекта вокруг произвольной точки

Запись от in4core размещена 21.03.2011 в 22:48
Обновил(-а) in4core 21.03.2011 в 22:52

Спасибо выражается Wolsh за направление.

Код AS3:
package com.in4core.transformation 
{
	import fl.motion.MatrixTransformer;
	import flash.display.DisplayObject;
	import flash.geom.Matrix;
	import flash.geom.Point;
	/**
	 * $(c)2011
	 * 
	 * @author in4core
	 * 
	 * About :
	 * 
	 * RotationPoint is a static class for rotation DisplayObject around freePoint.
	 * For define internal Point use RotationPoint.internalPoint property.
	 * For define internal Matrix use RotationPoint.internalMatrix property.
	 * For begin rotation use RotationPoint.rotateAroundPoint method.
	 * 
	 * ...
	 * version 1.0
	 */
	public class RotationPoint 
	{
		private static var _defaultPoint:Point = new Point(0, 0);
 
		private static var _defaultMatrix:Matrix = new Matrix();
 
		private static var _localMatrix:Matrix = new Matrix();
 
		public static function set internalPoint ( p : Point  ):void {
 
			_defaultPoint = p;
		}
 
		public static function set internalMatrix ( m : Matrix ) : void {
 
			_defaultMatrix = m;
		}
 
		public static function rotateAroundPoint ( disObj : DisplayObject , angle : Number ):void {
 
			disObj.transform.matrix = _defaultMatrix;
 
			_localMatrix = disObj.transform.matrix;
 
			MatrixTransformer.rotateAroundInternalPoint ( _localMatrix  , _defaultPoint.x, _defaultPoint.y , angle );
 
			disObj.transform.matrix = _localMatrix;
 
		}
 
		private static const VERSION = 1.0;
	}
 
}
Использование

Код AS3:
RotationPoint.internalPoint = new Point(obj.width/2 , obj.height/2) // если точка в центре
RotationPoint.internalMatrix = obj.transform.matrix;
RotationPoint.rotateAroundPoint ( obj , 20 );
если точка вращения не меняется достаточно задать ее 1 раз. Если структура объекта не меняется ( ширина , высота, скейл...) матрицу задаем тоже только единожды, иначе матрицу нужно перезадавать.
Всего комментариев 55

Комментарии

Старый 22.04.2011 01:19 fish_r вне форума
fish_r
 
Аватар для fish_r
Кажется так: вокруг точки лежащей в координатной области плоскости вращаемого (неправильно) родительского (тоже неправильно) контейнера Дошло .
Обновил(-а) fish_r 22.04.2011 в 11:04
Старый 22.04.2011 03:45 in4core вне форума
in4core
 
Аватар для in4core
а чем вам мой класс не подходит? юзайте и все
Старый 22.04.2011 06:41 fish_r вне форума
fish_r
 
Аватар для fish_r
Ничего не имею против вашего класса. Но меня интересовал не результат, а процесс.
Старый 22.04.2011 18:54 incvizitor вне форума
incvizitor
 
Аватар для incvizitor
Код AS3:
disObj.transform.matrix = _defaultMatrix;
_localMatrix = disObj.transform.matrix;
А какова цель данного фрагмента?
Старый 23.04.2011 08:34 fish_r вне форума
fish_r
 
Аватар для fish_r
Вообще, говоря, сдаётся мне, что метод MatrixTransformer.rotateAroundInternalPoint и был написан для того, чтобы сократить код, ведь он всего то требует - матрицу, координаты и угол поворота. А вы это в целый класс размазали.

Какую, по сути, задачу решает ваш класс? В параметрах ему надо передать почти то же, что и в указанный метод. Да ещё и объект Point создавать ко всему прочему. Всё, что он выносит из вызывающего класса это - создание переменной содержащей изначальную матрицу (и это не так, потому, что в вызывающем классе её хранить все же придется, так как ваш класс её хранить не умеет) и присвоение результирующей матрицы объекту. И ради этого 50 строк кода? Не обижайтесь, in4core, но ваш код бесполезен с любой точки зрения, его можно рассматривать лишь как ваше собственное, синтаксическое упражнение по написанию кода.

Однако польза от вашего блога есть, он , в числе прочего, помог мне разобраться с what is the matrix.
Обновил(-а) fish_r 23.04.2011 в 14:38
 

 


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


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