AS3 — определение направления движения по акселерометру

Код ниже перемещает мувиклип на основе акселерометра. Как определить, в каком направлении он движется или стоит на месте?

import flash.sensors.Accelerometer; 
 import flash.events.AccelerometerEvent;

 var my_acc:Accelerometer = new Accelerometer();
my_acc.setRequestedUpdateInterval(50);

 my_acc.addEventListener(AccelerometerEvent.UPDATE, onAccUpdate);
 function onAccUpdate(e:AccelerometerEvent):void{

 my_dot.x -= (e.accelerationX*10);


if (my_dot.x < 0) { 
 my_dot.x = 0; 
 } else if (my_dot.x > stage.stageWidth) { 
 my_dot.x = stage.stageWidth; 
 } 


}

person Tom    schedule 23.11.2012    source источник


Ответы (1)


Вы получаете реальный вектор ускорения с

Sqrt(accelerationX^2 + accelerationY^2)

Затем вы получаете направление в градусах с помощью

Cos^-1 (accelerationX / realAcceleration)

Попробуйте следующее:

var accVector = Math.sqrt(Math.pow(e.accelerationX,2) +
                          Math.pow(e.accelerationY,2))

var direction = Math.acos(e.accelerationX / accVector)

и обратите внимание, что вы получаете direction в радианах!

Если вы хотите степени: var directionDeg = direction * 180/Math.PI

Если ваш accelerationY отрицательный, вам нужно изменить знак directionDeg и (если хотите) добавить 360, чтобы всегда получать положительное число.

person Teejay    schedule 23.11.2012
comment
Также: var accVector = Math.atan2(accelY, accelX), что эквивалентно. - person ejbytes; 26.01.2017
comment
@ejbytes Да, но я думаю, вы хотели написать direction = Math.atan2(...), а не accVector. Википедия утверждает, что atan2(y, x) — это угол в радианах между положительной осью x плоскости и точкой, заданной координатами (x, y) на ней. - person Teejay; 27.01.2017
comment
var accVector = Math.atan2(accelY, accelX) * 180/Math.PI; что эквивалентно. Как известно из физики, угол вектора скорости равен вектору пути. Это более короткий расчет, поэтому я разместил свой комментарий. - person ejbytes; 27.01.2017
comment
Да, но в моем примере accVector — это длина, в вашем примере — угол. direction равно atan2(accelY,accelX), а не accVector! Я что-то упускаю? - person Teejay; 27.01.2017
comment
Да, ты прав. Я разместил этот комментарий, глядя на что-то подобное, исследуя какой-то другой код, и это было ОЧЕНЬ поздно, или я должен сказать рано :) - person ejbytes; 27.01.2017
comment
Все в порядке, это было просто для уверенности. Я никогда не использовал atan2, поэтому хотел убедиться, что правильно понял то, что вы сказали. - person Teejay; 27.01.2017