Я хочу добиться того, чтобы две точки вращались вокруг друг друга. Поэтому я использую матрицу вращения. Однако теперь я понимаю, что расстояние между точками увеличивается (см. Прикрепленное видео 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_;
}
В этом коде нет ничего явно неправильного, но «скоростная» интеграция, которая не показана, предполагает, что вы можете интегрировать линейно между старым и новым положением, что приведет к расширению орбит при скорости> номинальной скорости и к сокращению при скорости < nominal_speed.
Как я и подозревал. Интеграция — это фактически экстраполяция на отрезке линии между точками 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
На первый взгляд, основная причина в том, что вы обновляете p0
а также p1
координаты в каждой итерации. Это приведет к накоплению неточностей, которые, возможно, setSpeed
,
Вместо этого вы должны использовать постоянные начальные координаты p0
а также p1
, но увеличить omega
угол.