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

mikhailk 15.11.2010 21:18

а откуда он поступает?
рукоятку крутите?

FieryWall 15.11.2010 21:40

Именно, и градус объекта относительно точки должен быть равен градусу курсора относительно той же точки

i.o. 15.11.2010 21:46

что-то мне подсказывает, что все идет к Math.atan2()

mikhailk 15.11.2010 21:46

а саму рукоятку сделать-то удалось?
потому что если удалось, то снимать угол можно с нее
а если не удалось, то решите сначала эту задачу - когда сможете показать рукоятку, угол получите автоматически

FieryWall 15.11.2010 21:54

Собственно такой код (демо) с некоторыми результатами (отдельное спасибо другим as-программистам:drinks:). Все что осталось - корректный поворот вокруг точки на заданном радиусе и указать точку поворота самого object в его центре:
Код AS3:

package {
        import flash.display.Sprite;
        import flash.display.DisplayObject;
        import flash.events.MouseEvent;
        import flash.geom.Point;
        public class Main extends Sprite {
                var pot:Sprite;
                var rect:Sprite;
                var rec:Sprite;
                var point:Point;
                var save1:Point=new Point(0,0);
                var save2:Point=new Point(0,0);;
                var angle:Number;
                public function Main() {
                        rect=new Sprite();
                        rect.graphics.lineStyle(1);
                        rect.graphics.drawRect(0,0,100,100);
                        rec=new Sprite();
                        rec.graphics.beginFill(0x000000);
                        rec.graphics.drawRect(-5,-5,10,10);
                        addChild(rect);
                        rect.addChild(rec);
                        rect.x=300;
                        rect.y=170;
 
                        point=new Point(100,100);
                        pot=new Sprite;
                        pot.graphics.beginFill(0xFF0000);
                        pot.graphics.drawRect(-5,-5,10,10);
                        addChild(pot);
                        pot.x=point.x;
                        pot.y=point.y;
 
                        pot.addEventListener(MouseEvent.MOUSE_DOWN, potDownListener);
                        pot.addEventListener(MouseEvent.MOUSE_UP, potUpListener);
 
                        rec.addEventListener(MouseEvent.MOUSE_DOWN, onRecDown);
                        stage.addEventListener(MouseEvent.MOUSE_UP, onRecUp);
                }
                private function potDownListener(event:MouseEvent):void{
                        pot.startDrag(false);
                }
                private function potUpListener(event:MouseEvent):void{
                        point.x=pot.x;
                        point.y=pot.y;
                        pot.stopDrag();
                }
 
                private function onRecDown(event:MouseEvent):void{
                        rect.startDrag(false);
                        save1.x=mouseX;
                        save1.y=mouseY;
                        addEventListener(MouseEvent.MOUSE_MOVE, onRecMove);
                }
                private function onRecMove(event:MouseEvent):void{
                        save2.x = mouseX;
                        save2.y = mouseY;
                        var p01:Point = save1.clone().subtract(point);//01 - значит вектор от точки 0 к точке 1
                        var p02:Point = save2.clone().subtract(point);
                        var modul01:Number = p01.length;
                        var modul02:Number = p02.length;
                        var a:Number = Math.atan2(
                                (p01.x * p02.y - p02.x * p01.y) / (modul01 * modul02),
                                (p01.x * p02.x + p01.y * p02.y) / (modul01 * modul02)
                        );
                        angle=a * 180 / Math.PI;
                        rect.rotation=angle;
                }
 
                private function onRecUp(event:MouseEvent):void{
                        rect.stopDrag();
                        removeEventListener(MouseEvent.MOUSE_MOVE, onRecMove);
                }
        }
}

Добавлено через 13 минут
Цитата:

Сообщение от OFFmind (Сообщение 949730)
Может оффтопик:

Почему бы не использовать класс TransformTool от senocular. Это если важен только результат, а не сам принцип... просто сам недавно сталкивался с подобной проблемой, используя этот можно в Runtime изменять объект как в стандартом Flash редакторе.

А для поворота при нажатии кнопки идеально подходит TweenLite.

Еще раз извините, если это офф-топ, и тут главное - реализовать своими руками)))

И как эти классы включить в RunTime ?

-De- 15.11.2010 22:56

"/ (modul01 * modul02)" - не надо, если длины катетов вырастут в одинаковое число раз, то углы в тр-ке не изменятся.
И я таки считаю, что нефик студенту помогать, если что из математики и пригодится после армии, то это вот эта геометрия.
И почему тупо от прошлого угла новый угол не отнимать? Вродь попроще.
Код AS3:

package {
        import flash.display.Sprite;
        import flash.display.DisplayObject;
        import flash.events.MouseEvent;
        import flash.geom.Point;
        public class Main extends Sprite {
                public var pot:Sprite;
                public var rect:Sprite;
                public var rec:Sprite;
                public var point:Point;
                public var saveRot1:Number = 0;//rotation
                public var saveRot2:Number = 0;//baseAngle
                public var saveRot3:Number = 0;//newAngle
 
                public function Main() {
                        rect=new Sprite();
                        rect.graphics.lineStyle(1);
                        rect.graphics.drawRect(0,0,100,100);
                        rec=new Sprite();
                        rec.graphics.beginFill(0x000000);
                        rec.graphics.drawRect(-5,-5,10,10);
                        addChild(rect);
                        rect.addChild(rec);
                        rect.x=300;
                        rect.y=170;
 
                        point=new Point(100,100);
                        pot=new Sprite;
                        pot.graphics.beginFill(0xFF0000);
                        pot.graphics.drawRect(-5,-5,10,10);
                        addChild(pot);
                        pot.x=point.x;
                        pot.y=point.y;
 
                        pot.addEventListener(MouseEvent.MOUSE_DOWN, potDownListener);
                        pot.addEventListener(MouseEvent.MOUSE_UP, potUpListener);
 
                        rec.addEventListener(MouseEvent.MOUSE_DOWN, onRecDown);
                        stage.addEventListener(MouseEvent.MOUSE_UP, onRecUp);
                        saveRot2 = Math.atan2(rect.y - pot.y, rect.x - pot.x);
                }
                private function potDownListener(event:MouseEvent):void {
                        pot.startDrag(false);
                        saveRot1 = saveRot1 + saveRot3;
                }
                private function potUpListener(event:MouseEvent):void{
                        saveRot2 = Math.atan2(rect.y - pot.y, rect.x - pot.x);
                        pot.stopDrag();
                }
 
                private function onRecDown(event:MouseEvent):void{
                        rect.startDrag(false);
                        addEventListener(MouseEvent.MOUSE_MOVE, onRecMove);
                }
                private function onRecMove(event:MouseEvent):void{
                        saveRot3 = Math.atan2(mouseY - pot.y, mouseX - pot.x) - saveRot2;
                        rect.rotation = (saveRot1 + saveRot3) * 180 / Math.PI;
                }
 
                private function onRecUp(event:MouseEvent):void{
                        rect.stopDrag();
                        removeEventListener(MouseEvent.MOUSE_MOVE, onRecMove);
                }
        }
}


FieryWall 19.11.2010 00:59

Всем опять привет!!
Решил я єту задачу, вот такая значит там основная система:
Объект является чилдом спрайта который в свою очередь является чилдом еще одного спрайта, точка поворота - центр основного спрайта, и вложенный спрайт с объектом вращается только относительно ее. Объект в дополнительном спрайте, на случай если с ним нужно что нибудь сделать, типа Трансформации.
Может возникнуть проблема относительно переноса точки поворота, в этом случаи нужно на момент перетаскивания точки сохранить размещение вложенного спрайта в глобальном контейнере (относительно основной оси координат) с помощью localToGlobal, и возвращать его значение уже в главном контейнере с помощью globalToLocal соответственно.
Простите что нету кода, с классами я еще работать не научился и весь код у меня в одном классе, а там очень много не по теме.
Всем спасибо за помощ :drinks:

makanmel 19.11.2010 21:47

Возможно оффтоп, но тема наиболее подходящая, не хочу создавать отдельную для одного вопроса.

Использую TransformTool для поворота объектов в редакторе на любой угол.
Также мне нужно вращать отдельной кнопкой по 90 градусов (относительно центра). Пробую задавать напрямую объекту rotation но тогда сетка TransformTool "съезжает".

Код AS3:

selectedElement.transformX = selectedElement.width / 2;
selectedElement.transformY = selectedElement.height / 2;
selectedElement.rotation += 90;
SelectElement(selectedElement);

http://i52.tinypic.com/5v8xty.jpg

Как лучше сделать? Может вызывать TransformTool.toolMatrix.rotate()?


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

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