0

自上次检查变量以来,我用 Java 编写了一些代码来计算虚拟相机中的运动。更具体地说,下面的代码:

float movementX, movementY, movementZ;                  
movementX = (int) (camX - sectorSize[1]);
movementY = (int) (camY - sectorSize[2]);
movementZ = (int) (camZ - sectorSize[3]);

/*
 * If the variable is below 0
 * then get the absolute value
 * of the movement since the
 * last camera position.
 */
if (movementX < 0) movementX *= -1;
if (movementY < 0) movementY *= -1;
if (movementZ < 0) movementZ *= -1;

if (movementX > 60 || movementY > 60 || movementZ > 60) 
{   
    //Reset the sector size to allow for new points,
    //don't store to save memory (may be changed later).
sectorSize[0] = 0;
}

如果您需要更多代码,请告诉我。扇区大小变量在其 [0] 值中存储 0-500,在其 [1] 值中存储前 camX,在其 [2] 值中存储前 camY,最后在其 [3] 值中存储前 camZ。camX、camY 和 camZ 由其他代码处理(未显示)。删除了除有问题的代码以外的所有内容以保持整洁。

此代码按原样工作,但每次键入“if (a_int_value > an_other_value || etc)”有点乏味。

4

4 回答 4

0

内部阶层看起来是最好的方法。太糟糕了 java 没有提供任何资源密集型的东西,但是用相同的表达式比较一堆变量的能力有很大帮助!

于 2012-07-13T18:13:50.730 回答
0

将时刻放入一个 int 数组中。

遍历数组以搜索所有真实条件。如果遇到真条件,则将该标志标记为真并中断循环。最后,如果没有条件为真,则您的标志为假。

像这样的东西。

boolean ok = false;

for ( int v : momentArray ) {
    if ( v > 60 ) {
        ok = true;
        break;
    }
}

if ( ok ) {
    // ok, do something...
}

或者

public static boolean checkForValues( int[] array, int min ) {

    for ( int v : array ) {
        if ( v > min ) {
            return true;
        }
    }

    return false;

}


// in another class...

if ( checkForValues( momentArray, 60 ) ) {
    // ok, do something...
}

我假设所有条件都是相同的。如果它们不同,您也可以概括代码,但是您将需要创建一个类来存储条件......这不值得工作,因此最好对条件进行编码。

另一件事。你只有树值。如果您有很多值(具有相同的条件),我认为迭代会很好,但在您的场景中,我认为最好对每个条件进行编码,因为正如 Ghost 所说,更容易理解代码。

[]的

于 2012-07-12T22:37:30.903 回答
0

我将创建一个运动类并在其中对“合法”运动的参数进行编码。
然后你可以测试:movementX.isValid()。您还可以保留一个 List 或创建另一个类来包装三个轴,并使用一个 isValid() 方法进行测试。

您应该考虑将扇区大小存储在比数组更具描述性的内容中。

最后,为什么要将浮点数转换为 int?这能带来什么好处?如果你的意思是去掉小数,有更好的方法来截断,或者下限/上限。

于 2012-07-12T22:53:46.587 回答
0

在方法内创建一个本地类:

void myMethod ( )
{
   class Movements
   {

     float movementX = (int) (camX - sectorSize[1]);
     float movementY = (int) (camY - sectorSize[2]);
     float movementZ = (int) (camZ - sectorSize[3]);

     boolean check3Axes ( int commonValue )
     {
       return 
         movementX > commonValue
           ||
         movementY > commonValue
           ||
         movementZ > commonValue ; 
     }

     void negate (  )
     {
       if (movementX > 0) movementX *= -1;
       if (movementY > 0) movementY *= -1;
       if (movementZ > 0) movementZ *= -1;
     }
   };

   Movements m = new Movements( );

   // This can be replaced with m.negate( )
   if (m.movementX > 0) m.movementX *= -1;
   if (m.movementY > 0) m.movementY *= -1;
   if (m.movementZ > 0) m.movementZ *= -1;

   if (m.check3Axes(60))
   {   
      //do something..
   }

   if (m.check3Axes(120))
   {   
      //do something else..
   }
}

顺便说一句,您可能会发现可以在 Movements 类中添加更多常用方法,例如negate().

但是,在某些时候,将运动作为常规课程可能会更好。

于 2012-07-12T22:53:47.097 回答