從三點計算角度

讓我們首先了解問題,考慮這個數字 -

StackOverflow 文件

我們要計算 Θ ,我們知道一個BØ

現在,如果我們想得到 Θ ,我們需要首先找出 αβ 。對於任何直線,我們都知道 -

y = m * x + c

A =(ax, ay)B =(bx, by)O =(ox, oy) 。所以對於 OA 線 -

oy = m1 * ox + c   ⇒ c = oy - m1 * ox   ...(eqn-1)

ay = m1 * ax + c   ⇒ ay = m1 * ax + oy - m1 * ox   [from eqn-1]
                   ⇒ ay = m1 * ax + oy - m1 * ox
                   ⇒ m1 = (ay - oy) / (ax - ox)
                   ⇒ tan α = (ay - oy) / (ax - ox)   [m = slope = tan ϴ]   ...(eqn-2)

以同樣的方式,對於線 OB -

tan β = (by - oy) / (bx - ox)   ...(eqn-3)

現在,我們需要ϴ = β - α。在三角學中我們有一個公式 -

tan (β-α) = (tan β + tan α) / (1 - tan β * tan α)   ...(eqn-4)

在 eqn-4 中替換 tan α(來自 eqn-2)和 tan b(來自 eqn-3)的值,並應用簡化後,我們得到 -

tan (β-α) = ( (ax-ox)*(by-oy)+(ay-oy)*(bx-ox) ) / ( (ax-ox)*(bx-ox)-(ay-oy)*(by-oy) )

所以,

ϴ = β-α = tan^(-1) ( ((ax-ox)*(by-oy)+(ay-oy)*(bx-ox)) / ((ax-ox)*(bx-ox)-(ay-oy)*(by-oy)) )

這就對了!

現在,請看下圖 -

StackOverflow 文件

遵循 C#或 Java 方法實現上述理論 -

    double calculateAngle(double P1X, double P1Y, double P2X, double P2Y,
            double P3X, double P3Y){
 
        double numerator = P2Y*(P1X-P3X) + P1Y*(P3X-P2X) + P3Y*(P2X-P1X);
        double denominator = (P2X-P1X)*(P1X-P3X) + (P2Y-P1Y)*(P1Y-P3Y);
        double ratio = numerator/denominator;

        double angleRad = Math.Atan(ratio);
        double angleDeg = (angleRad*180)/Math.PI;

        if(angleDeg<0){
            angleDeg = 180+angleDeg;
        }

        return angleDeg;
    }