Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Алгоритм поворота объекта маркером относительно точки (http://www.flasher.ru/forum/showthread.php?t=146622)

FieryWall 13.11.2010 11:32

Алгоритм поворота объекта маркером относительно точки
 
Здравствуйте уважаемые as программисты. Такой вопрос: какой обычно применяют алгоритм поворота объекта угловым маркером вокруг заданной точки, как например это реализовано в инструменте Free Transform Tool .fla файла?

medvedya2 13.11.2010 12:02

если я правильно понял.
mtx и mty точка относительно которой вращать
angle угол в радианнах
Код AS3:

        graphic.rotation=angle * 180 / Math.PI;
                                x1=(graphic.x-mtx)*Math.cos(angle)-(graphic.y-mty)*Math.sin(angle)+mtx;
                                y1=(graphic.x-mtx)*Math.sin(angle)+(graphic.y-mty)*Math.cos(angle)+mty;
                                graphic.x=x1;
                                graphic.y=y1;

Напишите по понятней что должно получиться.

FieryWall 13.11.2010 13:17

Вот такое надо реализовать
http://xmages.net/storage/10/1/0/5/0...d/1df0b51c.jpg
если бы точка трансформации стояла в центре - то квадрат вращался бы вокруг своей оси

samana 13.11.2010 15:16

Может поможет такой вариант. Тут создаётся прямоугольник, который постоянно крутиться, а клик по сцене - задаёт новую точку вокруг которой он будет крутится.
Код AS3:

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;
                }
        }
}


Wolsh 13.11.2010 15:57

Алгоритм прост.
Код AS3:

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);
        }
}


-De- 13.11.2010 16:12

Wolsh, то же, что и в 2, только хуже. Например из-за Math.asin(dX / dg)

Wolsh 13.11.2010 19:29

Согласен. Тогда так
Код AS3:

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;
        }
}


FieryWall 13.11.2010 21:48

А можете пожалуйста прокомментировать? Я практик, мне надо, очень надо :umnik2:

-De- 13.11.2010 22:08

Ваш ВУЗ гуманитарный? Матрицы поворота должны на 2-м курсе проходить.
А так - гуглить преобразование поворота, матрицы поворота, аффинные преобразования.
Тут только аккуратное их применение. Начала аналита ж.

FieryWall 13.11.2010 22:31

Цитата:

Сообщение от -De- (Сообщение 949608)
Ваш ВУЗ гуманитарный? Матрицы поворота должны на 2-м курсе проходить.
А так - гуглить преобразование поворота, матрицы поворота, аффинные преобразования.
Тут только аккуратное их применение. Начала аналита ж.

Вы абсолютно правы))) Я как раз на втором курсе :rolleyes:

Добавлено через 2 часа 8 минут
Мне как бы надо что бы для поворота надо было градус курсора относительно Point, т.е. градус объекта равен градус курсора. А в ваших примерах используется значение на которое изменяется градус объекта, это не подходит для реализации такого поворота.


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

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