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