角度上的模运算给出不正确的结果

时间:2013-02-09 19:43:24

标签: java

我正在制作一个非常简单的Java程序,用于计算在不同角度和速度下发射时射弹的行进距离。虽然在谈论发射角时没有必要包括180度以上的角度,但我想知道为什么我的代码没有按照我期望的方式工作,特别是以下部分:

if((int)(angle / 180.0) % 2 != 0)
{
     myDataArray[i][j] = 0.0;
}

如果angle是180到360(不包括)之间的值,那么它应该满足条件,任何等效角度都应该满足(例如540到720不包括)。基本上,每当射击角落入地面时,距离值应为零。

其余代码工作正常,但所有角度值180及以上都满足此部分,这意味着所有这些距离都为零。 (这没有意义,因为365度发射角应该与5度发射角相同)。

我做错了什么,或者是否有可以用来获得所需结果的替代条件?

编辑:巨大的叹息.... 计算没问题,我只是个白痴。我将角度增量器放在else语句中,这意味着if语句读取的第一个角度将用于程序的其余部分。这是我的整个方法代码:

public void calcDistanceValues()
{
    double angleStart = myAngleDegrees;
    double speedStart = mySpeedMPH;

    for(int i = 0; i < myNumRows; i++)
    {
        for(int j = 0; j < myNumColumns; j++)
        {
            if((int)(myAngleDegrees / 180.0) % 2 != 0)
            {
                myDataArray[i][j] = 0.0;
            }
            else
            {
                myDataArray[i][j] = 5280 *  (Math.pow(mySpeedMPH,2)*Math.sin(2*Math.toRadians(myAngleDegrees))/78973);
                myAngleDegrees += myUnitIncrement; //the problem is here*
            }

        }            
        mySpeedMPH += myUnitIncrement;
        myAngleDegrees = angleStart;            
    }
    mySpeedMPH = speedStart;    
}

1 个答案:

答案 0 :(得分:3)

我认为测试是正确的,错误在于如何使用它。我写了一个简单的测试程序来试试:

public class Test {

  public static void main(String[] args) {
    test(0);
    test(179);
    test(180);
    test(181.0001);
    test(359);
    test(360.0001);
    test(180+360);
  }

  private static void test(double angle){
    System.out.println("Raw angle: "+angle+" modded: "+modAngle(angle));
  }

  private static double modAngle(double angle) {
    if ((int) (angle / 180.0) % 2 != 0) {
      return 0;
    } else {
      return angle;
    }
  }
}

结果是:

Raw angle: 0.0 modded: 0.0
Raw angle: 179.0 modded: 179.0
Raw angle: 180.0 modded: 0.0
Raw angle: 181.0001 modded: 0.0
Raw angle: 359.0 modded: 0.0
Raw angle: 360.0001 modded: 360.0001
Raw angle: 540.0 modded: 0.0

如果我了解您的要求,它似乎正在发挥作用。