使用余弦定律求解三角形

时间:2012-03-20 10:13:39

标签: c# geometry cosine

我正在寻找一个三角形,我知道三边的长度(一个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方法。

5 个答案:

答案 0 :(得分:5)

法律

c 2 = a 2 + b 2 - 2abcos(C)

重新排列:

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

C = cos -1 [(a 2 + b 2 - c 2 < / sup>)/ 2ab]

那你为什么要使用Math.Cos而不是Math.Acos?

无论如何,这是你的一个错误,就像其他人所说的那样,你正在使用浮点数,因此由于舍入误差,比较相等是有​​点击中和错过。

此外,您无需转换回180度degees == pi radians。

此外,您只需比较两侧的长度。在一个真正的三角形中,一边的长度总是短于另一边的长度之和(参见罗林的回答)。我怀疑,你的公式可能会给NaN作为非三角形的答案,因为你最终会尝试取一个不在[-1 .. 1]范围内的数字的cos -1 。即

(a 2 + b 2 - c 2 )/ 2ab&gt; 1或者&lt; -1

事实上,我怀疑上述公式的条件恰好在

c&lt; = a + b

答案 1 :(得分:3)

要检查三个长度是否可以形成三角形,您只需要检查

A + B > C
A + C > B
B + C > A

(或等于三角形的等式)。

计算由这种三角形形成的角度是不必要的。如果三个长度不形成三角形,我不确定角度是否有意义。

答案 2 :(得分:1)

我看到总数是一个浮点数,你将它与180比较。 因为这通常不是一个好主意,因为浮点数可以有精确的舍入问题。

因此,使用带范围检查的检查,即

if ((total > 179.9) && (total < 180.1)) 

或一般:

accuracy = 0.1;
if ((total > 180.0 - accuracy) && (total < 180.0 + accuracy))

答案 3 :(得分:1)

如果有3条线相交2到2,则不需要使用三角法来确定它们是否形成三角形。通过不使用trig,可以避免比较浮点值的相等性(例如total==180)。由于您没有指定错误的性质,只是您没有得到正确的答案,并且由于您的代码看起来没问题,这可能是您问题的根源。

Unasked-for advice:为什么还要转换到学位直到你绝对必须?如果你以弧度工作,你可以让事情更简洁(也更容易理解),直到你想以度数呈现结果。

答案 4 :(得分:-1)

所有fp数学都不太可能产生180度。会出现少量错误。