|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Алгоритм поворота объекта маркером относительно точки
Здравствуйте уважаемые as программисты. Такой вопрос: какой обычно применяют алгоритм поворота объекта угловым маркером вокруг заданной точки, как например это реализовано в инструменте Free Transform Tool .fla файла?
Последний раз редактировалось FieryWall; 13.11.2010 в 11:35. Причина: уточнение |
|
|||||
[+1 09.03.11]
Регистрация: Mar 2010
Сообщений: 128
|
если я правильно понял.
mtx и mty точка относительно которой вращать angle угол в радианнах Напишите по понятней что должно получиться. |
|
|||||
Вот такое надо реализовать
если бы точка трансформации стояла в центре - то квадрат вращался бы вокруг своей оси |
|
|||||
Может поможет такой вариант. Тут создаётся прямоугольник, который постоянно крутиться, а клик по сцене - задаёт новую точку вокруг которой он будет крутится.
package { import fl.motion.MatrixTransformer; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Matrix; import flash.geom.Point; /** * ... * @author Samana */ public class Main extends Sprite { //точка трансформации для mc private var center:Point = new Point(300, 300); //матрица private var matrix:Matrix = new Matrix(); //угол на который будет поворачиваться mc private var ang:Number = 3; //сам спрайт mc private var mc:Sprite; public function Main():void { //нарисовал спрайт прямоугольник mc = new Sprite(); mc.graphics.beginFill(0x00FFcc); mc.graphics.drawRect(0, 0, 150, 80); mc.graphics.endFill(); //передвинул сюда mc.x = 300; mc.y = 300; addChild(mc); stage.addEventListener(MouseEvent.CLICK, newPoint) stage.addEventListener(Event.ENTER_FRAME,rotate) } private function newPoint(e:MouseEvent):void { //новая точка трансформации для поворота center.x = mouseX; center.y = mouseY; } private function rotate(e:Event):void { //беру текущую матрицу mc matrix = mc.transform.matrix; //задаю нувую точку для поворота матрицы, и угол MatrixTransformer.rotateAroundExternalPoint(matrix, center.x, center.y, ang); //применяю изменившуюся матрицу к mc mc.transform.matrix = matrix; } } } |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Алгоритм прост.
package ru.wolsh.display { import flash.display.DisplayObject; import flash.geom.Point; /* * * * * * * * * * * * * @author wolsh * * * \* * * * * * * * * */ public function pointRotate (object:DisplayObject, center:Point, angle:Number) : void { var ra:Number = angle * Math.PI / 180; var dX:Number = center.x - object.x; var dY:Number = center.y - object.y; var dg:Number = Math.sqrt(dX * dX + dY * dY); var da:Number = Math.asin(dX / dg); object.rotation = angle; object.x = center.x - dg * Math.sin(da - ra); object.y = center.y - dg * Math.cos(da - ra); } }
__________________
Reality.getBounds(this); |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Wolsh, то же, что и в 2, только хуже. Например из-за Math.asin(dX / dg)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Согласен. Тогда так
package ru.wolsh.display { import flash.display.DisplayObject; import flash.geom.Point; /* * * * * * * * * * * * * @author wolsh * * * \* * * * * * * * * */ public function pointRotate (object:DisplayObject, center:Point, angle:Number) : void { var r:Number = angle * Math.PI / 180; var s:Number = Math.sin(r); var c:Number = Math.cos(r); var dX:Number = object.x - center.x; var dY:Number = object.y - center.y; object.rotation = angle; object.x = center.x + dX * c - dY * s; object.y = center.y + dX * s + dY * c; } }
__________________
Reality.getBounds(this); |
|
|||||
А можете пожалуйста прокомментировать? Я практик, мне надо, очень надо
|
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Ваш ВУЗ гуманитарный? Матрицы поворота должны на 2-м курсе проходить.
А так - гуглить преобразование поворота, матрицы поворота, аффинные преобразования. Тут только аккуратное их применение. Начала аналита ж.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
Цитата:
Добавлено через 2 часа 8 минут Мне как бы надо что бы для поворота надо было градус курсора относительно Point, т.е. градус объекта равен градус курсора. А в ваших примерах используется значение на которое изменяется градус объекта, это не подходит для реализации такого поворота. Последний раз редактировалось FieryWall; 14.11.2010 в 01:38. |
Часовой пояс GMT +4, время: 11:12. |
|
« Предыдущая тема | Следующая тема » |
Теги |
AS3 , алгоритмы , маркер , поворот , трансформация |
|
|