我想求解一个三角形,我知道它的 3 条边的长度(SSS 三角形)。因此,我想确定由 3 条线组成的形状的 3 个“内”角是否 = 180。如果是,则该形状必须是三角形。
我正在使用在这个 The Law of Cosines 上找到的公式页来解决的角度。 在我的代码中,我执行以下操作:
private bool CalculateIfTriangle(float line1Length, float line2Length, float line3Length)
{
double angle1 = MathHelper.ToDegrees((float)Math.Cos(((line2Length * line2Length) + (line3Length * line3Length) - (line1Length * line1Length)) / (2 * line2Length * line3Length)));
double angle2 = MathHelper.ToDegrees((float)Math.Cos(((line3Length * line3Length) + (line1Length * line1Length) - (line2Length * line2Length)) / (2 * line3Length * line1Length)));
double angle3 = MathHelper.ToDegrees((float)Math.Cos(((line1Length * line1Length) + (line2Length * line2Length) - (line3Length * line3Length)) / (2 * line1Length * line2Length)));
double total = angle1 + angle2 + angle3;
if (total == 180)
return true;
else return false;
}
但是,我没有得到正确的答案(即使形状肯定是三角形)。
我正在用 C# (XNA) 编写我的应用程序,但我不确定我是否正确使用了 MathHelper.ToDegrees 方法。
最佳答案
法律是
c2 = a2 + b2 - 2abcos(C)
重新排列:
cos(C) = (a2 + b2 - c2)/2ab
C = cos-1 [(a2 + b2 - c2)/2ab]
那么你为什么要使用 Math.Cos而不是 Math.Acos?
无论如何,正如其他人所说,这是您的错误之一,您使用的是 float ,因此由于舍入错误,比较相等性有点碰运气。
此外,您不需要将度数转换回 180 degees == pi radians。
另外,你只需要比较边的长度。在真正的三角形中,一侧的长度总是比另一侧的长度之和短(参见罗林的回答)。我怀疑,您的公式可能会给出 NaN 作为非三角形的答案,因为您最终会尝试获取不在 [-1 .. 1] 范围内的数字的 cos-1。即
(a2 + b2 - c2)/2ab > 1 或 < -1
其实我怀疑上面的公式在合适范围内的条件恰好是在什么时候
c <= a + b
关于c# - 使用余弦定律求解三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9784788/