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) >}With .atan2() you don't need the if (Vy < 0) { part - in fact, as it is, the correction may be done twice. Try to comment that part out (like I did here).