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

Dip52 16.01.2014 00:07

Как правильно расчитать угол по координатам?
 
Здравствуйте.
Я пытаюсь сделать так: добавляю определённое количество объектов на сцену, определяю их угол, относительно определённой точки, определяю расстояние от определённого объекта до центра, после всего этого я присваиваю новые координаты каждому определённому объекту по такой системе: "определённыйОбъект.x = центр.x + Math.cos(угол) * расстояниеОтОбъектаДоТочки,
определённыйОбъект.y = центр.y + Math.sin(угол) * расстояниеОтОбъектаДоТочки". В итоге некоторые объекты куда-то уезжают, а другие остаются...

А цель вообще такая: добавить объекты через косинусы\синусы, определяя по изначальным координатам их угол, туда, где они изначально были.

Что я делаю неправильно?

Akopalipsis 16.01.2014 00:24

А что Вы в итоге хотите? я просто не понял цель:( Вам нужно просто точку под углом или повернуть объект на угол относительно центра к другой точки?

Dip52 16.01.2014 00:30

Пока я хочу, просто добавить объект туда же, где он был изначально, но только с помощью косинусов\синусов. После этого я попытаюсь изменять угол, чтобы создать эффект вращения объекта вокруг центра.

Akopalipsis 16.01.2014 00:37

Вопрос о вращении во круг центра - на три темы ниже. А какие значения есть для возврата?

Dip52 16.01.2014 00:39

Так я могу сделать так, чтобы они вращались (у меня вокруг определенных объектов вращаются звезды).
Есть радиус, угол. Хотя, если честно, я не понимаю, что обозначает "возврат".

Akopalipsis 16.01.2014 00:41

Цитата:

добавить объект туда же, где он был изначально
Это же означает возвратить? Получается что объект был в точки А, потом оказался в В и его нужно вернуть в А.
А какие для этого есть значения.

Dip52 16.01.2014 00:41

Код AS3:

package classes.orders
{
        import flash.display.MovieClip;
        import classes.init.Settings;
        import flash.geom.Point;
        import flash.events.Event;
 
        public class MotionStargazers extends MovieClip
        {
                public function MotionStargazers()
                {
                        this.addEventListener(Event.ENTER_FRAME,motion);
                }
                private function motion(event:Event):void
                {
                        const STARGAZERS:Array = Settings.STARGAZERS;                                //Ссылка на массив звездочётов:
                        const LENGTHSTARGAZERS:int = Settings.STARGAZERS.length;        //Длина массива звездочётов:
                        const CENTER:Point = new Point(Settings.mainContainer.stageWidth/2,Settings.mainContainer.stageHeight/2);
                        for(var stargazer:int = 0; stargazer < LENGTHSTARGAZERS; stargazer++)
                        {
                                const STARGAZER:MovieClip = STARGAZERS[stargazer][0];                                                //Ссылка на звездочёта:
                                const STARGAZERPOINT:Point = new Point(STARGAZER.x,STARGAZER.x);                        //Точка звездочёта:
                                const RADIUS:Number = Point.distance(STARGAZERPOINT,CENTER);                                //Радиус:
                                const ANGLE:Number = Math.atan2(STARGAZER.y-CENTER.y,STARGAZER.x-CENTER.x);        //Угол:
                                //STARGAZER.x = CENTER.x + Math.cos(ANGLE) * RADIUS;
                                //STARGAZER.y = CENTER.y + Math.sin(ANGLE) * RADIUS;
                                STARGAZER.x = CENTER.x + Math.cos(ANGLE) * 200;
                                STARGAZER.y = CENTER.y + Math.sin(ANGLE) * 200;
                        }
                }
        }
}

Добавлено через 44 секунды
Цитата:

Сообщение от Akopalipsis (Сообщение 1157441)
Это же означает возвратить?

Всё верно, извините.

Добавлено через 1 минуту
Если работает прокомментированный код, то звездочёты куда-то улетают.

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

Сообщение от Akopalipsis (Сообщение 1157441)
Это же означает возвратить? Получается что объект был в точки А, потом оказался в В и его нужно вернуть в А.
А какие для этого есть значения.

Получается, что объект был в точке A, потом определив его координаты мы добавляем его туда же, но только через косинусы\синусы.

Akopalipsis 16.01.2014 00:53

Цитата:

Если работает ЗАкомментированный код, то звездочёты куда-то улетают.
Первое что мне бросилось, это -
Код AS3:

Settings.mainContainer.stageWidth/2

это Вы делите на два...
Код AS3:

.2 * (CENTER.x + Math.cos(ANGLE) * RADIUS)

а это Вы делите на .2. я это к тому, что я раньше не знал этого:)

Dip52 16.01.2014 00:57

Цитата:

Сообщение от Akopalipsis (Сообщение 1157448)
Первое что мне бросилось, это -
Код AS3:

Settings.mainContainer.stageWidth/2

это Вы делите на два...
Код AS3:

.2 * (CENTER.x + Math.cos(ANGLE) * RADIUS)

а это Вы делите на .2. я это к тому, что я раньше не знал этого:)

Я поправил код. Такого не должно быть. Делю на два затем, чтобы узнать центр сцены.

Dip52 16.01.2014 01:26

Туда, где он был изначально, но только с помощью косинуса\синуса\угла\радиуса.

Akopalipsis 16.01.2014 01:28

Если это так, то скажите, как Вы его туда и по каким критериям перемещаете. Возможно что и угол не нужен.

Добавлено через 42 секунды
я немного глуповат и мне немного тяжело понять по коду весь замысел, но если я Вас ещё немного порасспрашиваю, то возможно и смогу помочь:) Вы находите центр сцены, затем координаты звездочета.
Затем Вы находите радиус и угол.. Но куда Вы звездочёта вернуть хотите?

Добавлено через 12 минут
Код AS3:

STARGAZER.x = CENTER.x + Math.cos(ANGLE) * 200;

Так у Вас работает, а так нет.
Код AS3:

STARGAZER.x = CENTER.x + Math.cos(ANGLE) * RADIUS;

А чему у Вас тогда равен радиус? Или Вы знаете, что изначально звездочет был на расстоянии равное радиусу 200, и подойдя под углом N, сократя радиус на ( допустим половину ), вернуть его обратно на тот же радиус?

Добавлено через 3 минуты
Или он был перемещён по окружности на расстояния радиуса и Вы хотите обратить угол в спять и вернуть его обратно, при этом радиус в начальной точке и в той в которой он сейчас, неизменен?

Dip52 16.01.2014 01:31

Нет, я 200 поставил, чтобы убедиться в работоспособности моего кода.
Координаты x,y задаются случайные.
Но мне интересно именно такое решение, которое я написал выше.

Akopalipsis 16.01.2014 01:35

Если в начале звездочёт был удалён на радиус 200, а потом его рандомно куда-то поставили и Вы не знаете не первоначального угла и радиуса, Вы не сможете его вернуть назад.

Добавлено через 55 секунд
Нужно же знать хоть что-то.

Dip52 16.01.2014 01:39

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

Akopalipsis 16.01.2014 01:52

Нет, так нельзя. Полярные координаты служат для того, чтобы перемещать объект по окружности, либо в её пределах. То есть, зная начальные координаты и конечные, можно узнать угол или что-то подобное. Но вот как Вы хотите, это невозможно.

Dukobpa3 16.01.2014 03:11

Код AS3:

const STARGAZERPOINT:Point = new Point(STARGAZER.x,STARGAZER.x);

А здесь два икса это так надо?

Добавлено через 45 секунд
Цитата:

Но вот как Вы хотите, это невозможно.
Че за бред?

Dip52 16.01.2014 03:15

Цитата:

Сообщение от Dukobpa3 (Сообщение 1157470)
Код AS3:

const STARGAZERPOINT:Point = new Point(STARGAZER.x,STARGAZER.x);

А здесь два икса это так надо?

Спасибо. Выручили.

Akopalipsis 16.01.2014 03:32

Цитата:

Че за бред?
Если честно сказать, то я сомневаюсь что правильно понял. Но если учесть, что я не смог выудить информацию о движении объекта, то мне показалось что надо - объект был в (0,0), потом задали координаты случайные, а потом нужно узнать, где объект был До этого. И если учесть что -
Цитата:

Или он был перемещён по окружности на расстояния радиуса и Вы хотите обратить угол в спять и вернуть его обратно, при этом радиус в начальной точке и в той в которой он сейчас, неизменен?
было проигнорировано, то получается что отката угла в ноль не надо.

Isfet 16.01.2014 04:42

Цитата:

Сообщение от Akopalipsis (Сообщение 1157448)
а это Вы делите на .2. я это к тому, что я раньше не знал этого:)

конечно не знал, потому что здесь делится на 5, и это эквивалентно записи
Код AS3:

 x * 0.2;

я так понимаю, тема уже не актуальна, но так для заметки

Цитата:

Сообщение от Dip52 (Сообщение 1157442)
Код AS3:

const CENTER:Point = new Point(Settings.mainContainer.stageWidth/2,Settings.mainContainer.stageHeight/2);


не делайте вот такие записи, они не нужны, Settings.mainContainer.stageWidth/2 - это константа, которая уже известна после инициализации, не нужно ее высчитывать по mouseMove, достаточно высчитать ее один раз,
можно даже ее сделать статичной.


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

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