Как рассчитать третью точку на линии с помощью atan2? - PullRequest
1 голос
/ 10 мая 2011

Я пытаюсь оживить некоторые растровые изображения относительно центральной точки.Не все они начинаются в этой центральной точке, но я хочу, чтобы они вылетели, как будто сила из этой центральной точки врезалась в них и вытолкнула их радиально наружу, так что они полностью улетели со сцены.

Итак: я знаю центральную точку и положение x и y каждого растрового изображения, расположенного вокруг нее.Для каждого я могу нарисовать линию от центра к этой точке x, y.Затем я смогу получить угол, образованный этой линией, к горизонтали, а затем установить точку назначения дальше на этой линии.Растровое изображение будет к этому моменту отключено.Я считаю, что это то, для чего предназначен Math.atan2.

Вот что я получил, когда перебираю массив растровых изображений (я - объект):

var angle:Number = Math.atan2(i.bitmap.y - centerY, i.bitmap.x - centerX) * 180 / Math.PI;
var dist:Number = 200;              //arbitrary number, just to test
 destX = centerX  + dist * Math.cos(angle);  //destination x
 destY = centerY  + dist * Math.sin(angle);  //destination y

Вместоэти вещи скользят радиально, они прыгают.

У меня проблемы с пониманием atan2 и именно то, что я делаю неправильно.

Спасибо,

Дэвид

Ответы [ 4 ]

1 голос
/ 10 мая 2011

Вы можете добиться того же эффекта без тригонометрических функций, используя только векторные операции:

var dist:Number = 200;              //arbitrary number, just to test
var dx:Number = i.bitmap.x - centerX;
var dy:Number = i.bitmap.y - centerY;
var length:Number = Math.sqrt( dx*dx + dy*dy );
var normalizeddx:Number = dx / length;
var normalizeddy:Number = dy / length;
 destX = centerX  + dist * normalizeddx;  //destination x
 destY = centerY  + dist * normalizeddy;  //destination y

Это должно быть намного быстрее, чем при использовании тригонометрических функций.Я не знаю языковой специфики actioncript, поэтому, вероятно, это можно оптимизировать больше.

0 голосов
/ 02 января 2014

Вы должны избавиться от части * 180 / Math.PI.Угол должен быть в радианах.Поэтому первая строка будет выглядеть так:
var angle:Number = Math.atan2(i.bitmap.y - centerY, i.bitmap.x - centerX); Остальное должно быть в порядке.

0 голосов
/ 10 мая 2011

Попробуйте удалить * 180 / PI, чтобы сохранить угол в радианах.

var angle:Number = Math.atan2(i.bitmap.y-centerY, i.bitmap.x - centerX);

Затем измените destX и destY на

destX = i.bitmap.x  + dist * Math.cos(angle);
destY = i.bitmap.y  + dist * Math.sin(angle);
0 голосов
/ 10 мая 2011
Полагаю, что в этой ситуации может работать

atan2, но я бы просто использовал atan:

var angle: Number = Math.atan ((i.bitmap.y - centerY) / (i.bitmap.x -centerX));

ДОПОЛНЕНИЕ:

Код, который я только что видел на другом форуме, который, кажется, делает то, что вы хотите (есть только небольшое отличие от того, что вы написали в первую очередь)

var angle:Number = Math.atan2(mouseX,mouseY-180)-Math.PI/2;
var xNew:Number = 20*Math.cos(angle);
var yNew:Number = -20*Math.sin(angle);
...