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
处放置一个断点并让代码 运行,我们会看到 a
和 b
都等于零。这在最后一行给了我们 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=0
和 c=0
。您可以考虑将最后一个表达式更改为
var sum = 180 / PI * Atan2(b , c);
当 b=0
和 c=0
时将 return 一个值。
PS。另外,在代码的开头使用 using static System.Math;
来缩短此类数学表达式。
我正在写一个 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
处放置一个断点并让代码 运行,我们会看到 a
和 b
都等于零。这在最后一行给了我们 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=0
和 c=0
。您可以考虑将最后一个表达式更改为
var sum = 180 / PI * Atan2(b , c);
当 b=0
和 c=0
时将 return 一个值。
PS。另外,在代码的开头使用 using static System.Math;
来缩短此类数学表达式。