首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 計算直角三角形角度:Math.atan2 避免除零與象限判斷

     編輯:程式設計疑難解答

數學模型

已知直角三角形對邊長 a、鄰邊長 b,求夾角 θ(弧度/度數)。

正確 API:Math.atan2(y, x)

// 參數順序:y (對邊), x (鄰邊)
double angleRad = Math.atan2(a, b);        // 返回 [-π, π]
double angleDeg = Math.toDegrees(angleRad); // 轉角度 [0, 180] 或 [-180, 180]

為何不用 Math.atan(a/b)?

Android 代碼最佳實踐

public double calculateAngle(double opposite, double adjacent) {
    if (adjacent == 0 && opposite == 0) return 0; // 退化情況
    double rad = Math.atan2(opposite, adjacent);
    double deg = Math.toDegrees(rad);
    // 歸一化到 [0, 360)
    return deg < 0 ? deg + 360 : deg;
}

// 使用示例:觸摸滑動角度判斷
float dx = event.getX() - startX;
float dy = event.getY() - startY;
double angle = calculateAngle(dy, dx); // 注意參數順序:y, x
if (angle < 45 || angle > 315) { /* 向右 */ }
else if (angle < 135) { /* 向上 */ }
...

常見參數順序錯誤

❌ Math.atan2(adjacent, opposite) — 參數顛倒
✅ Math.atan2(opposite, adjacent) — y 先,x 後

擴展:向量夾角通用公式

// 任意兩向量夾角
public static double angleBetween(double x1, double y1, double x2, double y2) {
    double dot = x1*x2 + y1*y2;
    double det = x1*y2 - y1*x2; // 行列式(叉積模長)
    return Math.toDegrees(Math.atan2(det, dot)); // [-180, 180]
}

牢記 Math.atan2(y, x) 參數順序與「自動處理除零、全象限」兩大優勢,Android 幾何角度計算不再踩坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
函數缺陷atan2 優勢
Math.atan(a/b)b=0 除零異常;無法區分象限(只返回 -π/2~π/2)處理 x=0;根據符號自動判斷象限,返回完整 [-π, π]