【发布时间】:2015-07-04 07:06:46
【问题描述】:
最初,代码似乎在行星向恒星弯曲时起作用,但由于它应该被拉入恒星或进入轨道,它只是被推向相反的方向。我究竟做错了什么?当距离的符号发生变化时,行为的变化似乎发生了。
if(!alive){
return;
}
xPos += t * velocity/10000 * cos(direction / 180 * 3.14);
yPos += t * velocity/10000 * sin(direction / 180 * 3.14);
double gravity = 1000;
double starX = 1920/2;
double starY = 1080/2;
double deltaX = xPos - starX;
double deltaY = yPos - starY;
double distance = sqrt(pow(deltaX, 2) + pow(deltaY, 2));
int modifier = 1;
if (xPos > starX){
modifier = -1;
}
double angle = atan(deltaY / deltaX) * 180 / 3.14;
std::cout << angle << std::endl;
xPos += t * gravity / pow(distance,2) * modifier * cos(angle / 180 * 3.14);
yPos += t * gravity / pow(distance,2) * modifier * sin(angle / 180 * 3.14);
if (xPos > starX - 100 && xPos < starX + 100 && yPos > starY - 100 && yPos < starY + 100){
alive = false;
}
xPos 和 yPos 是行星的当前位置。 t 是自上次更新以来的时间。速度和方向是行星开始时的初始速度和角度。自从我们在太空中以来,这种力量永远不会改变。重力是万有引力常数。 starX 和starY 是恒星的位置,distance 是恒星与行星之间的距离。 angle 是恒星和行星之间的角度(我有一种感觉,这就是导致不良行为的原因。)
【问题讨论】:
-
距离符号如何变化? sqrt 将始终返回一个正数
-
对,这就是为什么如果距离应该是负数,我会在其中添加那个修饰符。
-
为什么应该是负数?如果不使用修饰符会怎样?
-
如果不使用修饰符,如果行星在恒星的右侧,恒星会将行星推向相反的方向。
-
任何给定时间的力都会导致速度变化,但您将这种变化直接应用于位置,这不是运动方程的工作方式。 x 和 y 方向的速度增量的符号由 sin/cos 调用确定,因此您不需要使用任何“修饰符”标志。
标签: c++ math physics game-physics orbital-mechanics