我好像已经在业务应用程序上工作太长时间了...或许毕业也很久了 :) 最近,我被分配使用C语言编写一个小型机器人模拟(尽管这个问题更多涉及数学/算法而非C语言),其中有两个单位(坦克机器人)从玩耍场的X和Y坐标开始。
现在面板上有旋转它们的键,以及向前移动它们的键。我现在面临着将旋转角度转换为笛卡尔平面上下一个X,Y坐标的微小脑部崩溃。
由于硬件限制,只能使用固定点进行实际移动,但可以通过浮点值进行计算。
我刚才只是凭记忆写了以下代码:
很不幸,似乎在写纯商业软件这么多年后,我的大脑并没有真正记忆极坐标数学和几何学,所以它似乎不能按预期工作。
例如,如果旋转角度为180度,则下一个x/y会向左移动,导致机器人翻倒 :)
我想要的是一种类似于旧版微型机器游戏的移动方案,如果您还记得,下一个点将位于对象面对的位置前面,因此它会向那里移动(速度)数量的步骤。
有人能建议我出错了吗...
此外,如果使用C进行此操作比我刚才编写的纯数学尝试更平稳,请给我提示。
编辑:
尝试添加:
根据下面的答案,0度确实是正Y轴。但这也会导致错误的结果。现在,以180度为起点的移动是向左上方的。在180度时,应该沿着负Y轴移动。
更多代码:
_tank结构体的初始化 -
旋转度数只是一个固定整数,我会根据360度的圆形将其包装起来,就像这样 -
移动后(速度>0) -
这似乎很奇怪。如果旋转角度为180度,X坐标不应该改变,对吧?只有Y坐标会改变,并且是相反的方向。我建议将更改翻译为:如果速度为2,则向量长度应为2,因此在物体面向的方向上,更改应为2步,即y = y + 2,x = x + 0,对于物体的180度旋转?
我感觉我接近成功了 :)
进一步编辑:
如果我这样做,似乎几乎符合我在游戏场地中所需要的要求:
注意:-90...
即使速度降低,它似乎仍会出现故障,但至少它朝着正确的方向移动。
现在面板上有旋转它们的键,以及向前移动它们的键。我现在面临着将旋转角度转换为笛卡尔平面上下一个X,Y坐标的微小脑部崩溃。
由于硬件限制,只能使用固定点进行实际移动,但可以通过浮点值进行计算。
我刚才只是凭记忆写了以下代码:
/* Recalculate to radians */
int radians;
/* Use sin and cos to get a vector (new x and y coords). Translate from polar to
cartesian coordinates */
radians = (int) _tanks[0].rotationAngle * (M_PI / 180);
_tanks[0].x += _tanks[0].speed * cos(radians);
_tanks[0].y += _tanks[0].speed * sin(radians);
radians = (int) _tanks[1].rotationAngle * (M_PI / 180);
_tanks[1].x += _tanks[1].speed * cos(radians);
_tanks[1].y += _tanks[1].speed * sin(radians);
很不幸,似乎在写纯商业软件这么多年后,我的大脑并没有真正记忆极坐标数学和几何学,所以它似乎不能按预期工作。
例如,如果旋转角度为180度,则下一个x/y会向左移动,导致机器人翻倒 :)
我想要的是一种类似于旧版微型机器游戏的移动方案,如果您还记得,下一个点将位于对象面对的位置前面,因此它会向那里移动(速度)数量的步骤。
有人能建议我出错了吗...
此外,如果使用C进行此操作比我刚才编写的纯数学尝试更平稳,请给我提示。
编辑:
尝试添加:
float radians;
radians = (45 - _tanks[0].rotationAngle) * (M_PI / 180);
_tanks[0].x += (int) (_tanks[0].speed * cos(radians));
_tanks[0].y += (int) (_tanks[0].speed * sin(radians));
根据下面的答案,0度确实是正Y轴。但这也会导致错误的结果。现在,以180度为起点的移动是向左上方的。在180度时,应该沿着负Y轴移动。
更多代码:
_tank结构体的初始化 -
tanks[0].acc = 0;
tanks[0].dec = 0;
tanks[0].rotationAngle = 180;
tanks[0].speed = 0;
tanks[0].x = 400;
tanks[0].y = 150;
tanks[0].turretRotationAngle = 180;
旋转度数只是一个固定整数,我会根据360度的圆形将其包装起来,就像这样 -
switch(direction) {
case 0:
tank->rotationAngle -= degrees;
if(tank->rotationAngle < 1) {
tank->rotationAngle = 360;
}
break;
case 1:
tank->rotationAngle += degrees;
if(tank->rotationAngle > 360) {
tank->rotationAngle = 0;
}
break;
}
有一个用于顺时针旋转的按键,一个用于逆时针旋转。
旋转功能正常,但移动却不行,如所描述...
调试运行结果:
初始状态(由于速度为0而没有移动) -
radians = -2.3561945
x = 400
y = 150
speed = 0
移动后(速度>0) -
radians = -2.3561945 (the same since i only press the move button)
x = 399
y = 149
speed = 2
这似乎很奇怪。如果旋转角度为180度,X坐标不应该改变,对吧?只有Y坐标会改变,并且是相反的方向。我建议将更改翻译为:如果速度为2,则向量长度应为2,因此在物体面向的方向上,更改应为2步,即y = y + 2,x = x + 0,对于物体的180度旋转?
我感觉我接近成功了 :)
进一步编辑:
如果我这样做,似乎几乎符合我在游戏场地中所需要的要求:
radians = (_tanks[0].rotationAngle - 90) * (M_PI / 180);
注意:-90...
即使速度降低,它似乎仍会出现故障,但至少它朝着正确的方向移动。