function compassHeading2(alpha, beta, gamma , absolute) { var _x = beta ? beta * degtorad : 0; // beta value var _y = gamma ? gamma * degtorad : 0; // gamma value var _z = alpha ? alpha * degtorad : 0; // alpha value var cX = Math.cos(_x); var cY = Math.cos(_y); var cZ = Math.cos(_z); var sX = Math.sin(_x); var sY = Math.sin(_y); var sZ = Math.sin(_z); // Calculate Vx and Vy components var Vx = -cZ * sY - sZ * sX * cY; var Vy = -sZ * sY + cZ * sX * cY; // Calculate compass heading //var compassHeading = Math.atan(Vx / Vy); var compassHeading = Math.atan2(Vx ,Vy); // Convert compass heading to use whole unit circle if (Vy < 0) { compassHeading += Math.PI; } else if (Vx < 0) { compassHeading += 2 * Math.PI; } return compassHeading * (180 / Math.PI); // Compass Heading (in degrees) }called from orientation changed event:
lastOrientation = compassHeading2(data.alpha, data.beta, data.gamma, data.absolute); console.log('result: ' + lastOrientation + 'alpha:'+data.alpha+ ' beta: '+data.beta + ' gamma: '+data.gamma);