Java 内角的余弦定律
我试图用Java创建一个程序,当用户输入边长时,计算任何三角形的内角。我见过一些类似的问题,但我的问题无法解决 我想用这个来计算角度,但它总是给我错误的答案,或者不是一个数字(NaN)。我试着把它全部放在一个等式中,以防它只是四舍五入的错误,但它给出了相同的答案。后来我又把它改成这种格式,使它更容易阅读Java 内角的余弦定律,java,math,trigonometry,Java,Math,Trigonometry,我试图用Java创建一个程序,当用户输入边长时,计算任何三角形的内角。我见过一些类似的问题,但我的问题无法解决 我想用这个来计算角度,但它总是给我错误的答案,或者不是一个数字(NaN)。我试着把它全部放在一个等式中,以防它只是四舍五入的错误,但它给出了相同的答案。后来我又把它改成这种格式,使它更容易阅读 public class Triangles { // variables already declared and user inputs double sideOne, sideTw
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+twossq-threeSq的括号)
我提出了完整的修改代码,但它仍然给出了错误的答案,对于一个所有边都相同的三角形,三个边都应该返回60,但返回89.49999365358626 除了不使用双倍值之外,您的计算可能不正确 根据余弦定律 cosγ=(a^2+b^2-c^2)/2ab 所以改变ang=oneSq+threeSq-twossq/(2*sideOne*sideThree);到
在修正了比率的计算之后,仍然有一件事要做:丢掉这些线
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。首先,您使用的是整数,这意味着您将得到整数算术。也就是说,您应该使用
double
而不是int
@EsaLakaniemi-也可以使用double
,因为这就是trig函数所使用的。我对Java中的trig函数不是最新的(没有真正使用过它们)-感谢您提到这一点。请看我的回答,您正在执行一个不必要的除法,大约60,这将ACO的结果限制在接近90°。
M*(pi/2-x/M)=90-x,