0

2 つの点が互いに回転していることを達成したいと考えています。したがって、回転行列を使用します。ただし、ポイント間の距離が大きくなっているという問題が発生しています(添付のビデオ1を参照)。ただし、距離はシミュレーション全体で一定に保つ必要があります。

速度の計算に使用するコードは次のとおりです。

ここで、p1 と p2 は 2 つのポイントです。

double xPos = p0.x+p1.x;
double yPos = p0.y+p1.y;
//The center between p1 and p2
xPos /=2;
yPos /=2;
//the rotating angle
double omega = 0.1;
//calculate the new positions
double x0new = xPos + (p0.x-xPos)*std::cos(omega) - (p0.y-yPos)*std::sin(omega);
double y0new = yPos + (p0.x-xPos)*std::sin(omega) + (p0.y-yPos)*std::cos(omega);
double x1new = xPos + (p1.x-xPos)*std::cos(omega) - (p1.y-yPos)*std::sin(omega);
double y1new = yPos + (p1.x-xPos)*std::sin(omega) + (p1.y-yPos)*std::cos(omega);
//the speed is exatly the difference as I integrate one timestep
p0.setSpeed(p0.x-x0new, p0.y-y0new);
p1.setSpeed(p1.x-x1new, p1.y-y1new);

次に、速度を正確に 1 タイムステップ積分します。私の計算で何が間違っていますか?

更新 私の統合が間違っているようです。位置を直接設定すると、完璧に機能します。ただし、この統合の何が問題なのかはわかりません。

setSpeed(ux,uy){
     ux_=ux;
     uy_=uy;
}
// integrate one timestep t = 1
move(){
     x = x + ux_;
     y = y + uy_;
}

私の行動のビデオ

4

2 に答える 2

1

一見したところ、主な理由は反復ごとに更新p0p1調整を行うためです。それは不正確さを蓄積し、それはおそらくsetSpeed.

代わりに、一定の初期座標p0とを使用する必要がありますが、角度p1を大きくしてください。omega

于 2012-10-18T12:30:51.087 に答える
1

このコードには明らかな問題はありませんが、表示されていない「速度」の積分は、古い位置と新しい位置の間を線形に積分している可能性があることを示唆しています。これにより、速度 > 公称速度の場合は軌道が拡大し、速度 < の場合は縮小します。公称速度。

私が疑ったように。積分は、実際には、原点から一定の距離にあるはずの点 p0 と p1 の間の線分での外挿です (物理シミュレーションでは、おそらく軌道が楕円になります...)。

したがって、外挿係数が 0 の場合、新しい位置は計算された境界上になります。< 0 (および > -1) の場合、予想される軌道内で補間されます。

         O     This beautiful ascii art is trying to illustrate the integration
        /      x is the original position, o is the new one and O is the 
       / ___-----   "integrated" value and the arc is a perfect circle :)
      o--      Only at the calculated position o, there is no expansion.
   --/
  / /
 / /
| /
x
于 2012-10-18T12:37:45.123 に答える