PDA

Просмотр полной версии : Как правильно расчитать угол по координатам?


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
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 секунды
Это же означает возвратить?

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

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

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

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

Akopalipsis
16.01.2014, 00:53
Если работает ЗАкомментированный код, то звездочёты куда-то улетают.
Первое что мне бросилось, это -
Settings.mainContainer.stageWidth/2
это Вы делите на два...
.2 * (CENTER.x + Math.cos(ANGLE) * RADIUS)
а это Вы делите на .2. я это к тому, что я раньше не знал этого:)

Dip52
16.01.2014, 00:57
Первое что мне бросилось, это -
Settings.mainContainer.stageWidth/2
это Вы делите на два...
.2 * (CENTER.x + Math.cos(ANGLE) * RADIUS)
а это Вы делите на .2. я это к тому, что я раньше не знал этого:)

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

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

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

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

Добавлено через 12 минут
STARGAZER.x = CENTER.x + Math.cos(ANGLE) * 200;

Так у Вас работает, а так нет.
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
const STARGAZERPOINT:Point = new Point(STARGAZER.x,STARGAZER.x);
А здесь два икса это так надо?

Добавлено через 45 секунд
Но вот как Вы хотите, это невозможно.
Че за бред?

Dip52
16.01.2014, 03:15
const STARGAZERPOINT:Point = new Point(STARGAZER.x,STARGAZER.x);
А здесь два икса это так надо?


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

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

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

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

x * 0.2;


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

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


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