我在业务应用程序上工作了似乎已经很长时间了……而且也许是在不久之前毕业的:)最近我受命使用C语言编写一个小型的机器人仿真(尽管此问题比C语言更重要的是数学/算法),其中我有两个单位(坦克机器人),分别在运动场上的X和Y坐标处开始。
现在,面板上有一些按键可以旋转它们,还有一个按键可以向前移动它们。现在,我面临着轻微的大脑崩溃问题,即从旋转角度到下一个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);
不幸的是,这些年来,在编写纯粹的biz软件之后,我的大脑似乎并没有真正地了解极坐标数学和几何,因此似乎无法按预期工作。
例如,如果rotationAngle为180,则下一个x / y位于左侧,从而使漫游器翻倒:)
如果您还记得下一个点将在对象所面对的位置之前,那么我想要的是一种类似于旧的Micro Machines游戏的移动方案,因此它可以在那里移动(速度)数步。
有人可以建议我在这里出问题了吗...
同样,如果用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 ...
仍然,当速度降低时,它似乎会出现故障,但至少它会朝正确的方向移动。
例如,如果rotationAngle为180,则下一个x / y位于左侧,从而使漫游器翻倒:)
是的,这就是您的代码所要做的:除了上面的user3386109提到的int radians
问题之外,您的代码是正确的,假设0°为正x轴,90°为正y轴,180°为负x- y轴为270°(或-90°)。
我猜想,您想将0°设为正y轴吗?并且-您是否想将90°用作正x轴(因此角度围绕圆顺时针方向)或负x轴(因此角度逆时针方向)?对于前一种情况(顺时针),只需更改_tanks[...].rotationAngle
为(90 - _tanks[...].rotationAngle)
(以“翻转” 45°线)即可;对于后一种情况(逆时针),只需将其更改为(_tanks[...].rotationAngle + 90)
(以使其绕原点“旋转” 90°)即可。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句