在 AS3 開發中,Math.atan2(y, x) 比 Math.atan(value) 更實用,因其能正確處理象限判斷,直接得到向量角度,是物體朝向滑鼠、目標點旋轉的標準解法。本文詳細對比兩者差異,並提供旋轉應用範例。
| 函數 | 參數 | 返回值範圍 | 幾何意義 |
|---|---|---|---|
Math.atan(val) | 單一數值(對邊/鄰邊比值) | -π/2 ~ π/2 (-90°~90°) | 僅能判斷第 1/4 象限,無法區分 (x,y) 與 (-x,-y) |
Math.atan2(y, x) | y, x 分量 | -π ~ π (-180°~180°) | 根據 (x,y) 象限返回完整角度,適合向量方向計算 |
| 輸入 | atan(y/x) 弧度/角度 | atan2(y, x) 弧度/角度 | 說明 |
|---|---|---|---|
| (1, 2) | 0.4636 / 26.57° | 0.4636 / 26.57° | 第 1 象限,兩者一致 |
| (-1, 2) | -0.4636 / -26.57° | -0.4636 / -26.57° | 第 4 象限,兩者一致 |
| (-1, -2) | 0.4636 / 26.57° ❌ | -2.6779 / -153.43° ✅ | 第 3 象限,atan 錯誤返回第 1 象限值 |
| (1, -2) | -0.4636 / -26.57° ❌ | 2.6779 / 153.43° ✅ | 第 2 象限,atan 錯誤返回第 4 象限值 |
結論:atan 因只接收比值,無法分辨分子分母正負組合,導致第 2、3 象限角度錯誤;atan2 直接接收分量,完整覆蓋 360°。
// 弧度轉角度 degree = radians * 180 / Math.PI; // 角度轉弧度 radians = degree * Math.PI / 180;
// 於 ENTER_FRAME 或滑鼠移動事件中 var dx:Number = mouseX - sprite.x; var dy:Number = mouseY - sprite.y; // 注意:Flash Y 軸向下為正,與數學座標系相反 // atan2 參數順序為 (y, x) sprite.rotation = Math.atan2(dy, dx) * 180 / Math.PI;
關鍵提醒:Flash 坐標系 Y 軸向下,數學標準 Y 軸向上。若需嚴格符合數學角度(逆時針為正),需將 dy 取反:Math.atan2(-dy, dx)。但 Flash 顯示物件 rotation 屬性亦遵循 Y 向下座標系(順時針為正),故直接使用 dy 即可得到視覺正確的旋轉方向。
atan2(x, y) ❌ → atan2(y, x) ✅atan(dy/dx) 導致第 2/3 象限旋轉錯誤(如角色面向左側時轉向錯亂)。rotation 屬性單位為度,Math.atan2 返回弧度,必須乘 180/Math.PI。