C#三角函数/数学函数

时间:2018-12-14 21:40:29

标签: c# function trigonometry math-functions

我正在写一个应该计算角度(以度为单位)的类,经过长时间尝试后我仍然无法使用它。

  

当r = 45&h = 0时,总和应为77,14°

但返回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工作表中获得了公式。

编辑:好的,我的问题是在创建对象或获取用户输入时出现解析错误,显然是偶然解决了该错误。正如尼克·德奇亚拉(Nick Dechiara)所说,我不得不添加一个简单的例外情况。非常感谢您的快速回复,谢谢。

EDIT2:我的Excel工作表中的例外是:

if(h < 2) {h = 2}

所以这说明了一切,我一点也不注意。再次感谢您提供所有答案。

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

2 个答案:

答案 0 :(得分:6)

调试这类问题的一种好方法是将方程式分解成较小的部分,以便于调试。

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的{​​{1}},其值为0 - 45 + 45,因此0变为0。您的数学可能有错误在那里。

对于b,我们有a,它的计算结果也为2 * h * r - h * h

您可能是A)方程式有误,或者B)0时需要包含特殊情况,因为这在这里破坏了数学。

答案 1 :(得分: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时返回一个值。

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