Форум 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

Комментарии

Старый 21.03.2011 23:04 GBee вне форума
GBee
 
Аватар для GBee
Почему бы все параметры не отдавать в метод поворота сразу, да и мартицу самому вытянуть можно.

В инете нашел:
Код AS3:
var myMatrix : Matrix = disObj.transform.matrix;
myMatrix.translate(-rx, -ry);
myMatrix.rotate(angleRad);
myMatrix.translate(rx, ry);
disObj.transform.matrix = myMatrix;
Старый 21.03.2011 23:07 dimarik вне форума
dimarik
 
Аватар для dimarik
dis(play)Obj(ect).transform.matrix - это клонирующий геттер. В связи с этим не совсем понятны создания объектов в стадии $cinit:

Код AS3:
private static var _defaultMatrix:Matrix = new Matrix();
private static var _localMatrix:Matrix = new Matrix();
Вы точно уверены, что нуль-трансформная матрица была на объекте изначально? Может стоило модифицировать именно матрицу объекта?

UPD. Аха, чуть опередили )
Старый 21.03.2011 23:16 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Почему бы все параметры не отдавать в метод поворота сразу, да и мартицу самому вытянуть можно.
Можно, но зачем постоянно их туда передавать , если например матрица не меняется? каждый раз дергать геттер? Не выход.

Цитата:
Вы точно уверены, что нуль-трансформная матрица была на объекте изначально?
КОнечно нет, для этого и создан сеттер матрицы. Но если его не задали - значит матрица нулевая. как то так. КОнечно можно модифицировать класс и далее, сделать не для одного объекта а для многих, тут много чего можно понаделать. Но задача выполнена и так
Старый 21.03.2011 23:25 in4core вне форума
in4core
 
Аватар для in4core
Кстати чтобы не создавать тему узнаю здесь : после поворота меняются координаты x и y нашего объекта а так же угол поворота соотв. Как можно вернуть ему дефолтную матрицу, тоесть сделать так - чтобы объект не поменял свои координаты , а так же не изменил угол поворота, но при этом остался как повернутый ?
Обновил(-а) in4core 21.03.2011 в 23:43
Старый 22.03.2011 00:08 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Цитата:
не изменил угол поворота, но при этом остался как повернутый
Нужно не меняя угол поворота как бы повернуть объект
Старый 22.03.2011 00:12 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Нужно не меняя угол поворота как бы повернуть объект
Спасибо КЭП, а как ?
Старый 22.03.2011 00:22 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Кэп негодует, очевидно же, что никак =)
Старый 22.03.2011 00:29 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Кэп негодует, очевидно же, что никак =)
Спасибо кэп. Но все же, проблема я думаю решаема. На данный момент не могу понять как : ( тема обсуждается в АС3 ) повернуть объект на угол скажем 90 градусов, а затем вернуть координаты х и у обратно в левый верхний угол.
Старый 22.03.2011 08:44 cleptoman вне форума
cleptoman
 
Аватар для cleptoman
в AS ветке уже все объяснили..меняем матрицу - меняются и x c y. по-другому никак.не хочешь трогать x/y - крути внутренности.
Старый 23.03.2011 00:53 nOobCrafter вне форума
nOobCrafter
in4core а зачем целый класс? О_о
Код AS3:
private function transformObject($obj:Sprite, $scale:Number, $angle:Number, $relativeToObjectSize:Point, $relativeToObjectXY:Point):void
{
	var mtx:Matrix 				= new Matrix()
		mtx.tx 				= -$relativeToObjectSize.x;
		mtx.ty 				= -$relativeToObjectSize.y;
		mtx.rotate($angle * Math.PI / 180);
		mtx.scale($scale, $scale); 
		mtx.translate($relativeToObjectSize.x, $relativeToObjectSize.y)
		mtx.translate($relativeToObjectXY.x - $relativeToObjectSize.x, $relativeToObjectXY.y - $relativeToObjectSize.y);
 
	$obj.transform.matrix = mtx;
}
Цитата:
вращаем \ скейлим обьект относительно какой то точки.
$relativeToObjectSize - точка внутри обьекта относительно которой будет применяться трансформация
$relativeToObjectXY - точка в контейнере обьекта относительно которой будет применяться трансформация
по поводу клонирующих геттеров и отсутствия необходимости делать новую матрицу, когда писал это столкнулся с неприятным моментом когда изза дефолтных значений матрицы (которую брал напрямую с обьекта) некоторые расчеты происходили не верно, много крови поппило в условиях дедлайна, посему имхо лучше делать новую, как то оно надежнее будет, хотя бы понятно будет откуда ноги могут расти.
З.Ы. тю, какой класс, у вас там целый пакет гляжу выделен!
Обновил(-а) nOobCrafter 23.03.2011 в 01:09
Старый 23.03.2011 01:01 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
in4core а зачем целый класс? О_о
Ну обычно для того чтобы пользоваться повседневно чтоль когда потребуется и не вспоминать че там и куда. А так у вас есть функция, ну забыли вы что там было, заново писать? Все ж прощее ее в какой нить мини класс добавить и пользовать потом
Старый 23.03.2011 01:08 nOobCrafter вне форума
nOobCrafter
Код AS3:
by.lord_xaoca.utils.Utils#transformObject
я к тому что просто статик метода хватило бы...)
Старый 23.03.2011 02:00 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
я к тому что просто статик метода хватило бы...)
а у меня как ? о_О Если вы о том что function(...rest) - то мне такие методики не прильщают. Один флешовый твин чего стоит, вроде да удобно, но писать все в одном методе дико по мне. Это все равно что :

var sp:Sprite = new Sprite(x,y,z,...getBounds....and so on) . Имхо
Обновил(-а) in4core 23.03.2011 в 02:02
Старый 23.03.2011 15:01 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Ух ты, and so on. Скоро упоминание о нашем etc стихнут пеленой мрака)

Цитата:
А так у вас есть функция, ну забыли вы что там было, заново писать?
Пожалуйста, не путайте понятия "функция" и "метод". Во втором случае Ваша фраза имеет смысл, в первом — нет. Вы же не знаете как работает функция navigateToURL, но успешно ей пользуетесь?

P.S. com — это коммерческие организации. По какой лицензии Вы распространяете код?
Старый 23.03.2011 15:31 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Цитата:
com — это коммерческие организации
это просто буквы =)
Ну и, если серьезно, то __рекомендуется__ так называть пакеты. Это не правило и, тем более, не аксиома
Старый 23.03.2011 16:38 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Пакеты это имя "сайта" наоборот =)
То есть не com.flasher, а ru.flasher. com — домен для коммерческих организаций, собственно.
Старый 23.03.2011 16:54 incvizitor вне форума
incvizitor
 
Аватар для incvizitor
Psycho Tiger, ну а если у человека нету еще сайта, а в будущем планируется?)
Старый 23.03.2011 17:07 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
incvizitor, а так бывает? )
Старый 23.03.2011 17:34 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
Пакеты это имя "сайта" наоборот
Пакеты, это структура каталогов. И называться они могут как угодно. Просто для удобства используют сайты, чтобы добиться уникальности.
Старый 23.03.2011 17:34 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
in4core.com (to me)?
У меня просто Mr. Dick от E-rotic играет )

Если планируется сайт в домене com, то он явно коммерческий. Значит, и код тоже )

@iNils, не придирайся к словам речь именно про этот случай шла. У меня вообще пакета ru/com/org/and so on нету.
Старый 23.03.2011 19:02 Котяра вне форума
Котяра
 
Аватар для Котяра
Я кладу в ru.k0t0vich, но сайта k0t0vich.ru не существует в природе.
Старый 23.03.2011 19:36 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
ru — означает принадлежность к нации. "Я русский программист, я кладу это в ru". Домены русских сайтов тоже заканчиваются на ru. Это такая памятка. Я, наверное, неточно выразился: домены строятся по тому же принципу, но не пакеты в этом случае строятся по принципу доменов. com в таких случаях всегда отражает коммерческое назначение.
Старый 23.03.2011 20:21 fljot вне форума
fljot
Psycho Tiger, ребёнок опять напился и несёт оффтоповую ерунду?)
Старый 23.03.2011 21:35 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Это Вы у ребёнка спросите.
Старый 23.03.2011 23:05 drnet_ua вне форума
drnet_ua
 
Аватар для drnet_ua
фотопну пожалуй

Цитата:
* RotationPoint is a static class for rotation of DisplayObject around a freePoint.
* For To define internal Point use RotationPoint.internalPoint property.
* For To define internal Matrix use RotationPoint.internalMatrix property.
* For To begin start rotation, use RotationPoint.rotateAroundPoint method.
and so on...

ну или For definition of ..

сорри
Старый 23.03.2011 23:38 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Как бы не так
Цитата:
* RotationPoint is a static class for rotating of a DisplayObject around a freePoint.
Старый 23.03.2011 23:39 TanaTiX вне форума
TanaTiX
 
Аватар для TanaTiX
Psycho Tiger, какое отношение имеет namespace в откомпилированной программе к сайту?
Старый 24.03.2011 00:47 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Я объяснил выше, что выразился неточно. И namespace это немного другое.
Старый 24.03.2011 13:23 incvizitor вне форума
incvizitor
 
Аватар для incvizitor
Цитата:
incvizitor, а так бывает? )
Докажете противоположное?
Старый 24.03.2011 14:38 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Цитата:
Докажете противоположное?
Ты не из Одессы? Отвечать вопросом на вопрос — это запатентованная манера одесситов )
Старый 24.03.2011 14:47 Tails вне форума
Tails
 
Аватар для Tails
Zebestov
А как-же Евреи ?
Старый 24.03.2011 15:16 incvizitor вне форума
incvizitor
 
Аватар для incvizitor
Цитата:
Ты не из Одессы? Отвечать вопросом на вопрос — это запатентованная манера одесситов )
Нет, из Минска. Но у меня в Одессе есть родственники, так что часть патента принадлежит и мне
Старый 24.03.2011 15:22 i.o. вне форума
i.o.
 
Аватар для i.o.
Цитата:
А как-же Евреи ?
Только не превращайте тему в обычный мейл.ру холивар по принадлежности к нации, чистоте крови и т.д и т.п..
Старый 24.03.2011 15:58 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
i.o., ты слишком серьезен
Но оффтоп пора прекратить, согласен.
Старый 24.03.2011 16:15 i.o. вне форума
i.o.
 
Аватар для i.o.
Цитата:
i.o., ты слишком серьезен
я просто наблюдателен
Обычно после таких шуточных заявлений и начинается плевание друг в дружку продуктом дефекации.
Старый 24.03.2011 16:15 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
Только не превращайте тему в обычный мейл.ру холивар по принадлежности к нации, чистоте крови и т.д и т.п..
За это можно и в бан сразу попасть. Но в данном случаи, это просто фольклор.
Старый 24.03.2011 19:00 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
iNils, за изречение i.o. или за выяснений национальных особенностей?
Старый 24.03.2011 19:04 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Очевидно за "Разжигание межнациональной розни".
Старый 25.03.2011 03:17 andrew911 вне форума
andrew911
Psycho Tiger
http://ru.wikipedia.org/wiki/.com
.com — общий домен верхнего уровня для коммерческих организаций (сейчас используется без ограничений).
Старый 25.03.2011 10:23 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
andrew911, я где-то говорил что нельзя делать пакет com?)
Старый 25.03.2011 12:53 VitaliyKrivtsov вне форума
VitaliyKrivtsov
 
Аватар для VitaliyKrivtsov
лично я отказался делать пакет com, лиш по одной причине: много полезных фреймворков в которых корневой пакет com. Использовать фреймворки в одном проекте становиться затруднительно.
Старый 31.03.2011 15:22 Anton Riot вне форума
Anton Riot
Когда в посте обсуждать особо нечего, начинается обгладывание его костей.
Старый 21.04.2011 16:53 fish_r вне форума
fish_r
 
Аватар для fish_r
Код AS3:
var myMatrix : Matrix = disObj.transform.matrix;
myMatrix.translate(-rx, -ry);
myMatrix.rotate(angleRad);
myMatrix.translate(rx, ry);
disObj.transform.matrix = myMatrix;
GBee а что здесь ry,rx?
Старый 21.04.2011 17:08 in4core вне форума
in4core
 
Аватар для in4core
коориднаты по x и y объекта
Старый 21.04.2011 17:37 fish_r вне форума
fish_r
 
Аватар для fish_r
Но в таком случае получается вращение объекта не вокруг произвольной точки, а вокруг точки регистрации. Так? В чем тогда смысл?
Старый 21.04.2011 18:22 fish_r вне форума
fish_r
 
Аватар для fish_r
Вот пример кода:

Код AS3:
 
package
{
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.TimerEvent;
	import flash.geom.Matrix;
	import flash.utils.Timer;
	import fl.motion.MatrixTransformer;
 
 
	public class MatrixExample extends Sprite
	{
		private var _t:Timer = new Timer(20, 0);
		private var _pX:Number;
		private var _pY:Number;
 
		public function MatrixExample()
		{
			super();
 
			this.addEventListener(Event.ADDED_TO_STAGE, init)
		}
 
		private function init(e:Event):void 
		{
 
			removeEventListener(Event.ADDED_TO_STAGE, init);
                        _pX = sim1.width / 2;
			_pY = sim1.height / 2;
 
			_t.addEventListener(TimerEvent.TIMER, initTransform);
			_t.start();
 
 
 
		}
 
		private function initTransform(e:TimerEvent):void 
		{
 
			sim1.transform.matrix = MatrixRotate();
 
 
		}
 
		private function MatrixRotate():Matrix
		{
 
			var matr:Matrix = sim1.transform.matrix;
			MatrixTransformer.rotateAroundInternalPoint(matr, _pX, _pY, 15);
 
			return matr;
		}
	}
}
Вот здесь: http://narod.ru/disk/10770937001/MatrixExample.swf.html - результат его работы.




Что здесь происходит. Полупрозрачный квадрат, мувик, вращается с помощью включенной опции rotate в ИДЕ. Непрозрачный квадрат вращается с помощью приведённого кода. Начинают вращение находясь по одним и тем же координатам, причем полупрозрачный мувик - копия непрозрачного (то есть полностью идеинтичен). Через некоторое время после начала вращения (10-15 сек.) становится заметно смещение непрозрачного к нулевым координатам. Что конечно не есть хорошо.

Может я что то упускаю? Не так делаю?
Обновил(-а) fish_r 21.04.2011 в 23:15
Старый 21.04.2011 22:52 fish_r вне форума
fish_r
 
Аватар для fish_r
вот здесь нашёл ответ: http://www.flasher.ru/forum/showpost...85&postcount=2
Старый 21.04.2011 23:42 GBee вне форума
GBee
 
Аватар для GBee
Цитата:
GBee а что здесь ry,rx?
Координаты точки, вокруг которой вращаем, наверно.
Старый 22.04.2011 00:12 GBee вне форума
GBee
 
Аватар для GBee
Собственно вот

Белый квадратик - изначальное положение вращаемого квадратика.
Красный кружок - точка вращения, по клику меняется.

Исходник

Все в ЕнтерФрейме происходит.
Обновил(-а) GBee 22.04.2011 в 00:15
Старый 22.04.2011 00:13 Mur4ik вне форума
Mur4ik
Я так понял что не "вокруг произвольной точки", а около точки принадлежащей области объекта, верно?
 

 


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


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