C# 三角函数/数学函数

C# trigonometric functions / math functions

我正在写一个 class,它应该计算角度(以度为单位),经过长时间的尝试我没有让它工作。

When r = 45 & h = 0 sum should be around 77,14°

但它 returns NaN - 为什么?我知道它一定是 Math.Atan-Method 和无效值。

我的代码:

    private int r = 0, h = 0;
    public Schutzwinkelberechnung(int r, int h)
    {
        this.r = r;
        this.h = h;
    }
    public double getSchutzwinkel()
    {
        double sum = 0;

        sum = 180 / Math.PI * Math.Atan((Math.Sqrt(2 * h * r - (h * h)) - r * Math.Sin(Math.Asin((Math.Sqrt(2 * h * r)) / (2 * r)))) / (h - r + r * (Math.Cos(Math.Asin(Math.Sqrt(2 * h * r) / (2 * r))))));

        return sum;
    }

有人看出我的错误了吗?我从 excel sheet.

中得到了公式

编辑:好的,我的问题是我在创建对象或获取用户输入时遇到解析错误,显然是偶然解决的。正如 Nick Dechiara 所说,Ofc 我必须添加一个简单的例外。非常感谢您的快速回复,我很感激。

EDIT2:我的 excel sheet 中的异常是:

if(h < 2) {h = 2}

所以这解释了一切,我根本没有注意。再次感谢所有的回答。

int r = 45, h = 2;
sum = 77.14°

调试此类问题的一个好方法是将等式分解成更小的部分,这样更容易调试。

double r = 45;
double h = 0;

double sqrt2hr = Math.Sqrt(2 * h * r);
double asinsqrt2hr = Math.Asin((sqrt2hr) / (2 * r));

double a = (Math.Sqrt(2 * h * r - (h * h)) - r * Math.Sin(asinsqrt2hr));
double b = (h - r + r * (Math.Cos(asinsqrt2hr)));

double sum = 180 / Math.PI * Math.Atan(a / b);

现在,如果我们在 sum 处放置一个断点并让代码 运行,我们会看到 ab 都等于零。这在最后一行给了我们 a / b = 0 / 0 = NaN

现在我们可以问,为什么会这样?那么在 b 的情况下,你有 h - r + r,即 0 - 45 + 45,计算结果为 0,因此 b 变为 0。你的数学可能有错误那里。

a 的情况下,我们有 2 * h * r - h * h,其计算结果也为 0

您可能 A) 公式中有错误,或者 B) 需要包括 h = 0 时的特殊情况,因为这会破坏您的数学运算。

一定要把表达式分解成

var a = Asin(Sqrt(2 * h * r) / (2 * r));
var b = Sqrt(2 * h * r - h * h) - r * Sin(a);
var c = h - r + r * Cos(a);
var sum = 180 / PI * Atan(b / c);

你会发现 b=0c=0。您可以考虑将最后一个表达式更改为

var sum = 180 / PI * Atan2(b , c);

b=0c=0 时将 return 一个值。

PS。另外,在代码的开头使用 using static System.Math; 来缩短此类数学表达式。