内角的余弦定律

时间:2014-05-03 15:01:47

标签: java math cosine

我正在尝试用Java创建一个程序,以便在用户输入边长时计算任何三角形的内角。我已经看到了一些与此类似的问题,但我不能让我的工作。

我希望这个以度为单位计算角度,但它会一直给我错误的答案或不是数字(NaN)。我已经尝试将其全部放入一个等式中,以防它只是舍入错误,但它只给出了相同的答案。我已经把它重新用于这种格式,以便于阅读。

public class Triangles
{
    // variables already declared and user inputs double sideOne, sideTwo, sideThree  
    threeSq=sideThree*sideThree;
    twoSq=sideTwo*sideTwo;
    oneSq=sideOne*sideOne;

    public static double getAngleOne(double oneSq, double twoSq, double threeSq, double sideOne, double sideTwo, double sideThree)
    {
        double angOne;
        angOne = (oneSq + twoSq - threeSq) / (2 * sideOne * sideTwo);
        angOne = Math.toRadians(angOne);
        angOne = Math.acos(angOne);
        angOne = Math.toDegrees(angOne);
        return angOne;
    }

    public static double getAngleTwo(double oneSq, double twoSq, double threeSq, double   sideOne, double sideTwo, double sideThree)
    {
        double angTwo;
        angTwo = (twoSq + threeSq - oneSq) / (2 * sideTwo * sideThree);
        angTwo = Math.toRadians(angTwo);
        angTwo = Math.acos(angTwo);
        angTwo = Math.toDegrees(angTwo);
        return angTwo;
    }

    public static double getAngleThree(double oneSq, double twoSq, double threeSq, double   sideOne, double sideTwo, double sideThree)
    {
        double angThree;
        angThree = (oneSq + threeSq - twoSq) / (2 * sideOne * sideThree);
        angThree = Math.toRadians(angThree);
        angThree = Math.acos(angThree);
        angThree = Math.toDegrees(angThree);
        return angThree;
    }
} 

我正在使用余弦定律,但它没有给我正确的答案。例如,当我输入边长为3,3和3时,它给我71.68993312052173;当我输入5,6和7(分别为1,2和3)时,我得到了NaN。

编辑: 感谢您的建议,我已经将所有的内容更改为双打,我的数学是问题(忘记括号围绕oneSq + twoSq - threeSq)

我提出了完整的修改后的代码,但仍然给出了错误的答案,对于一个三面都相同的三角形,它应该为所有三个返回60,但它返回89.49999365358626。

2 个答案:

答案 0 :(得分:2)

在纠正比率的计算之后,仍然有一件事要做:丢掉线

angOne = Math.toRadians(angOne);  

此时,angOne不包含任何角度。如果双方服从三角不等式,那么angOne应该包含一个介于-1和1之间的数字,不需要转换。


等边三角形的面积比为0.5。转换为弧度,acos,转换为度的操作可以组合为

M*acos(x/M) = M*(pi/2-asin(x/M)),

乘数M = 180 / pi。由于x / M很小,结果大约是

M*(pi/2-x/M)=90-x, 

导致接近89.5的值,如上次试验中所获得的那样。


当然,期望的结果是M * acos(0.5)= M *(pi / 3)= 60。

答案 1 :(得分:0)

除了不使用双值外,您的计算可能不正确。

根据余弦法

cosγ=(a ^ 2 + b ^ 2 - c ^ 2)/ 2ab

所以改变ang = oneSq + threeSq - twoSq /(2 * sideOne * sideThree);到

double ang = (oneSq + twoSq - threeSq)*1.0 / (2 * sideOne * sideTwo);