我试图计算一些角度,取决于使用某些奇数轴的某些3d坐标(有时向下是+ ve,有时正确是-ve等)并且已经提出以下开关案例结构
private double RobOrientX(double robY, double robZ)
{
double AngleX;
switch (robY)
{
case robY>0:
switch (robZ)
{
case robZ>0:
AngleX = Math.Atan2(robZ,robY);
break;
case robZ<0:
AngleX = 360 + Math.Atan2(robZ, robY);
break;
case robZ=0:
AngleX = 0;
break;
}
break;
case robY<0:
switch (robZ)
{
case robZ>0:
AngleX = 180 + Math.Atan2(robZ, robY);
break;
case robZ<0:
AngleX = 180 + Math.Atan2(robZ, robY);
break;
case robZ=0:
AngleX = 180;
break;
}
break;
case robY=0:
switch (robZ)
{
case robZ>0:
AngleX = 90;
break;
case robZ<0:
AngleX = 270;
break;
case robZ=0:
AngleX = 0;
break;
}
break;
}
return AngleX;
}
但是switch (robY)
上有一个错误,说明一个开关表达式需要使用一个可以为空的类型,我认为它是双重类型。
switch (robZ)
没有错误。我在这里缺少什么,或者我应该将它们全部更改为一系列If else语句?
非常感谢
答案 0 :(得分:0)
这与可空值无关,偶然double
不可为空(double?
可以为空)。问题是在C#case
语句中必须使用常量,而不是布尔测试。您可能只想使用if
/ else
块。
if(robX > 0)
{
//...
}
else if (robX < 0)
{
//...
}
else if (robX == 0)
{
//...
}
else
{
// NaN etc?
}
不相关,但大多数数学函数(包括Math.Atan2
)在弧度中说话 - 但你似乎是将它们与度数混合在一起。这将产生非常奇怪的结果。 180度是Math.PI
弧度。