c# - 使用余弦定律求解三角形

标签 c# geometry trigonometry

我想求解一个三角形,我知道它的 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/

相关文章:

c# - 解码大型 Base64 字符串

c# - AjaxControlToolkit NoBotState 始终为 InvalidBadResponse

javascript - 将相交的多边形合并为单个多边形

c++ - 试图在二维数组中创建一个圆

trigonometry - 三角函数计算成本高吗?

c# - 在 case 语句中返回不同的对象类型?

c# - 在 C# 和 Objective-C 之间维护通用代码的好方法是什么?

java - 当圆形和正方形的中心对齐时,如何判断它们是否重叠

java - 正弦波在Java中交替失真

audio - pygame音频延迟和重复循环