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

garkin 20.01.2010 13:13

Как все печально.

random13 20.01.2010 13:24

ну и что мне с этим печально сделать... в топик по крайней мере три формулы написали и какую точно использовать так и не сказали

Psycho Tiger 20.01.2010 16:49

Всё для вас.

Zebestov 20.01.2010 17:20

Цитата:

Сообщение от random13 (Сообщение 880549)
ну и что мне с этим печально сделать... в топик по крайней мере три формулы написали и какую точно использовать так и не сказали

Ну ты с ейчас пошутил правда?
Первый же ответ в этом топике является окончательным:
Цитата:

Сообщение от Division (Сообщение 876434)
Math.atan2

А потом начали наваливать хлама и философии. Какие три формулы?

P.S.
Аж неловко оттого, что я повторяюсь... то же самое, только короче и сдержанней, писал выше =)

FieryWall 13.11.2010 19:11

А если угол надо найти с вершиной в точке(Point)?
В моем случае нужен угол перемещения курсора после нажатия относительно точки.

expl 14.11.2010 15:16

Вложений: 3
ИМХО всетки, чтобы в любой ситуации получить именно наименьший угол между векторами и без всяких делений на ноль(за исключением случая с векторами нулевой длинны) надо делать так:
Вложение 25477

Цитата:

Код AS3:
Math.asin((x2-x1)/(y1-y2))*(180/Math.PI);
Можно огрести со 2-й и 3-й четверями, плюс при 90 и -90 градусах будет деление на ноль, плюс работает только если первый вектор совпадает с осью координат

FieryWall 14.11.2010 17:08

Не прокатило :(
Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.geom.Point;
        public class Main extends Sprite {
                var pot:Sprite;
                var point:Point;
                var save1:Point;
                var save2:Point;
                var angle:Number;
                public function Main() {
                        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);
 
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownListener);
                        stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpListener);
                }
                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 mouseDownListener(event:MouseEvent):void {
                        save1=new Point(mouseX,mouseY);
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveListener);
                }
                private function mouseMoveListener(event:MouseEvent):void{
                        save2=new Point(mouseX,mouseY);
                        var dssX1:Number=save1.x-point.x;
                        var dssX2:Number=save2.x-point.x;
                        var dssY1:Number=save1.y-point.y;
                        var dssY2:Number=save2.y-point.y;
                        //var modul1:Number=Math.sqrt(dssX1*dssX1+dssY1*dssY1);
                        //var modul2:Number=Math.sqrt(dssX2*dssX2+dssY2*dssY2);
                        //var a:Number=Math.atan2((dssX1*dssY1+dssX2*dssY1)/(modul1*modul2),(dssX1*dssY2-dssX2*dssY1)/(modul1*modul2));
                        var a:Number=Math.atan2((dssX1*dssY1+dssX2*dssY1),(dssX1*dssY2-dssX2*dssY1));
                        angle=a*180/Math.PI;
                        trace(angle);
                }
                private function mouseUpListener(event:MouseEvent):void{
                        removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveListener);
                }
        }
}


expl 14.11.2010 18:58

Да, поднакосячил маленько, еще оказалось что atan2(y, x), а подсказка во FlashBulder сказала x, y :(
Плюс в скалярном произведении идексы попутал (по определению (x0, y0) * (x1, y1) == x0 * x1 + y0 * y1).
Исправленное и дополненное:
Код AS3:

package 
{
        import flash.display.DisplayObject;
        import flash.display.Graphics;
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.geom.Point;
        import flash.text.TextField;
        import flash.text.TextFieldAutoSize;
        public class Main extends Sprite {
 
                private static const WIDTH:int = 800;
                private static const HEIGHT:int = 600;
 
                private var tfAngle:TextField;
 
                private var marker1:Marker;
                private var marker2:Marker;
                private var point0:Point;
                private var save1:Point;
                private var save2:Point;
                private var angle:Number;
                public function Main() {
                        point0 = new Point(200, 200);
 
                        drawPoint0();
 
                        tfAngle = new TextField();
                        tfAngle.autoSize = TextFieldAutoSize.LEFT;
                        addChild(tfAngle);
 
                        addChild(marker1 = new Marker());
                        addChild(marker2 = new Marker());
                        marker1.setPosition(point0);
                        marker2.setPosition(point0);
 
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
                        stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
                }
 
                private function drawPoint0():void
                {
                        var g:Graphics = graphics;
                        g.lineStyle(0, 0x000000);
                        g.moveTo(0, point0.y);
                        g.lineTo(WIDTH, point0.y);
                        g.moveTo(point0.x, 0);
                        g.lineTo(point0.x, HEIGHT);
                }
 
                private function onMouseDown(event:MouseEvent):void {
                        marker1.x = mouseX;
                        marker1.y = mouseY;
 
                        marker2.x = mouseX;
                        marker2.y = mouseY;
 
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
                }
 
                private function onMouseUp(event:MouseEvent):void {
                        stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
                        updateAngle();
                }
 
                private function onMouseMove(event:MouseEvent):void {
                        updateAngle();
                }
 
                private function updateAngle():void {
                        marker2.x = mouseX;
                        marker2.y = mouseY;
 
                        var g:Graphics = graphics;
                        g.clear();
                        drawPoint0();
                        g.lineStyle(0, 0xff0000);
                        g.moveTo(point0.x, point0.y);
                        g.lineTo(marker1.x, marker1.y);
                        g.moveTo(point0.x, point0.y);
                        g.lineTo(marker2.x, marker2.y);
 
                        var angle:Number = angleBetwin2Vectors(point0, new Point(marker1.x, marker1.y), new Point(marker2.x, marker2.y));
                        tfAngle.text = "Последний посчитанный угол: " + angle + " градусов";
                }
 
                private function angleBetwin2Vectors(p0:Point, p1:Point, p2:Point):Number {
                        var p01:Point = p1.clone().subtract(p0);//01 - значит вектор от точки 0 к точке 1
                        var p02:Point = p2.clone().subtract(p0);
                        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)
                        );
                        return a * 180 / Math.PI;
                }
        }
}
 
import flash.display.Sprite;
import flash.geom.Point;
 
// Только рисует квадратик - ничего больше
class Marker extends Sprite
{
        public function Marker()
        {
                graphics.beginFill(0xFF0000);
                graphics.drawRect(-5,-5,10,10);
        }
 
        public function setPosition(point:Point):void
        {
                x = point.x;
                y = point.y;
        }
}


FieryWall 15.11.2010 00:19

БОООЛЬШОЕ СПАСИБО !!!!! :drinks:

FieryWall 23.11.2010 19:13

Кто может подробно прокомментировать это:
Код AS3:

var p01:Point = p1.clone().subtract(p0);
                        var p02:Point = p2.clone().subtract(p0);
                        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)
                        );



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

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