數學模型
已知直角三角形對邊長 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)?
| 函數 | 缺陷 | atan2 優勢 |
| Math.atan(a/b) | b=0 除零異常;無法區分象限(只返回 -π/2~π/2) | 處理 x=0;根據符號自動判斷象限,返回完整 [-π, π] |
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 幾何角度計算不再踩坑。
- 上一篇文章: Java URL.openConnection() 源碼追蹤:Handler 工廠機制與協議特定實現類加載全過程
- 下一篇文章: Oracle 字符串含特殊符號 ~ 轉數字並參與運算:DECODE/CASE 表達式處理非數值字符
Copyright ©
程式碼之家 All Rights Reserved