0

我想实现两点相互旋转。因此,我使用旋转矩阵。但是,我现在遇到的问题是点之间的距离正在增加(请参阅附加视频1)。然而,在我的整个模拟过程中,距离应该保持不变。

这是我用于计算速度的代码:

其中 p1 和 p2 是两个点。

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);

然后我将速度精确地整合一个时间步长。我的计算出了什么问题?

更新 看来我的集成是错误的。如果我直接设置位置,它就完美了。但是我现在不知道这种集成有什么问题:

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.

相反,您应该使用恒定的初始坐标p0p1,但增加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 回答