2014-05-21 3 views
-3

몇 가지 홀수 축을 사용하는 일부 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; 
    } 

그러나 스위치 표현은 내가했다 두 번 생각하는의 nullable 형식을 사용할 필요가 없다는 switch (robY)에 오류가 표시 될 수 있습니다.

switch (robZ)에는 오류가 없습니다. 여기에 누락 된 내용이 있습니까? 아니면 If else 문을 모두 변경해야합니까?

많은 감사

+6

경우에 따라 조건식을 사용할 수 없으므로 상수는 –

+1

이므로 두 번 nullable로 설정할 수 있습니다. "double? robY" – EaziLuizi

+1

도 및 라디안을 혼합하는 것처럼 보입니다 ... 의도적입니까? 즉, '180 + Math.Atan2 (...)' –

답변

0

이 널 (NULL) 값과는 아무 상관이 없으며, 부수적 double이 널 (NULL) 입력 가능하지 (double?이 널 (NULL)). 문제는 C# case 문이 부울 테스트가 아닌 상수를 사용해야한다는 것입니다. 아마도 블록 if/else만을 사용하고 싶을 것입니다. (Math.Atan2 포함)

if(robX > 0) 
{ 
    //... 
} 
else if (robX < 0) 
{ 
    //... 
} 
else if (robX == 0) 
{ 
    //... 
} 
else 
{ 
    // NaN etc? 
} 

관련없는,하지만 대부분의 수학 함수는 라디안에 이야기 -하지만 당신도 그들을 혼합 것으로 보인다. 이것은 매우 이상한 결과를 가져올 것입니다. 180도는 Math.PI 라디안입니다.

+0

감사합니다. if else를 사용하여 버전을 만들고 라디안을도 단위로 변환합니다. – MechatronicsStudent