1

フィールド内を移動するオブジェクトをシミュレートするプログラムに取り組んでいます。フィールドの境界は1024x1024です。オブジェクトはx、y座標で0を下回ることはできず、1024を超えることもできません。オブジェクトを現在の方向に現在の速度で移動する「move()」というメソッドがあります。オブジェクトが境界に近づくと、新しい方向と同じ速度で向きを変えます。

私が抱えている問題は、オブジェクトの1つがxとyの両方の境界(フィールドのコーナー)に近づくと、コーナーでスタックすることです。まるで角から離れようとしているようですが、その後は元に戻ります。それはそのコーナーを愛さなければなりません。私は自分のコードを調べましたが、私の論理は正しいようです。新しい方向が負または359を超えていないことを確認します。新しい方向との新しいx、y座標も範囲内にあることを確認します。新しい方向性を設定する方法もあります。

このメソッドを別のロジックで再実装しようとしましたが、うまくいきませんでした。誰かが私のプログラミングに欠陥を見つけたり、それを引き起こしている可能性があるものを指摘したりする可能性がある場合は、それをいただければ幸いです。

プログラムをデバッグしてステップスルーしようとしましたが、プログラムがコーナーに到達すると、方向を変えて向きを変え、約3スペース移動してから、コーナーに戻ります。素晴らしいコーナーに違いない。

moveメソッドのコードは次のとおりです。

public void move(){

  localX = super.getX();
  localY = super.getY();

  float newX=0, newY=0;
  float testX, testY;
  boolean acceptX = false, acceptY = false;

  testX = (float) (Math.cos(direction)*10) + localX;
  testY = (float) (Math.sin(direction)*10) + localY;
  int testDirection;

  while(!acceptX){
   if(testX >= 0 && testX <= bound){
    newX = testX;
    acceptX = true;
   }//end if statement
   else{
    if(direction+180 > 359){
     setDirection(direction-180);
     testX = (float) (Math.cos(Math.toRadians(direction))*speed) + localX;
    }
    else{
     setDirection(direction+180);
     testX = (float) (Math.cos(Math.toRadians(direction))*speed) + localX;
    }
   }//end else
  }//end while that checks for X value

  while(!acceptY){
   if(testY >= 0 && testY <= bound){
    newY = testY;
    acceptY = true;
   }//end if statement
   else{
    if(direction+180 > 359){
     setDirection(direction-180);
     testY = (float) (Math.sin(Math.toRadians(direction))*speed) + localY;
    }
    else{
     setDirection(direction+180);
     testY = (float) (Math.sin(Math.toRadians(direction))*speed) + localY;
    }
   }//end else
  }//end while that checks for Y value

  super.setX(newX);
  super.setY(newY);

 }

これがsetDirectionのコードです

public void setDirection(int d) {
        direction = d;
    }
4

3 に答える 3

2

左上隅にオブジェクトがあり、上に上がっているとします。あなたの最初のテストはそれを好転させるので、それはダウンします。次に、2回目のチェックが行われます。これにより、再び上昇します...再び。

あなたのコードはまた、もう少し読みやすさを使用することができます。私が最初に気付いたのは、>359チェックを使用して新しい方向を正規化することです。ただし、すべてのケースに移動コードも含まれています。私は次のようなことをします:

setDirection(direction + 180);          //turn around
if (direction >= 360) direction -= 360; //normalize
testY = ...;                            //move

移動コードを方向から移動して、ブロックするかどうかを確認します。360は、使用するのに適したマジックナンバーでもあります。359度は何の意味もありません。提案されているように、最終的にはベクトルライブラリを使用して、ほとんどの計算を破棄する必要があります。

于 2010-11-12T00:53:53.970 に答える
1

問題:オブジェクトがエッジに当たったら、180度回転させます。両端に当たると、所定の位置で回転し、テスト座標は常に間違った場所に配置されます。

オブジェクトの1つがエッジに当たると、About Faceではなく、バウンスする必要があります。入射角==屈折角など。つまり、x座標をチェックしていてバウンドする場合は、xとyの両方ではなく、xの速度を無効にします。

于 2010-11-12T00:53:16.590 に答える
1

スカラーからベクトルを計算するのではなく、方向をベクトル(x、y)として保存することを強くお勧めします。私はそれがあなたのコードで非常に役立つと思います。

于 2010-11-12T00:48:48.747 に答える