C程序,从旋转角度获取笛卡尔坐标

理查德·泰瑞格里姆

我在业务应用程序上工作了似乎已经很长时间了……而且也许是在不久之前毕业的:)最近我受命使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C程序,从旋转角度获取笛卡尔坐标

来自分类Dev

获取SKSpriteNode的旋转角度

来自分类Dev

获取SKSpriteNode的旋转角度

来自分类Dev

Python笛卡尔坐标中四个点的二面角/扭转角

来自分类Dev

MatOfPoint笛卡尔坐标

来自分类Dev

将旋转角度应用于原点周围的坐标?

来自分类Dev

获取绘图区域ggplot2的笛卡尔坐标

来自分类Dev

Oracle - 过滤笛卡尔坐标

来自分类Dev

在Unity3D C#中获取准确的旋转角度

来自分类Dev

获取笛卡尔积?

来自分类Dev

从matrix3d获取准确的旋转角度

来自分类Dev

从CGAffineTransform获取缩放比例和旋转角度?

来自分类Dev

从matrix3d获取准确的旋转角度

来自分类Dev

opengl,从笛卡尔坐标转换球坐标

来自分类Dev

Android屏幕-旋转角度

来自分类Dev

限制相机旋转角度

来自分类Dev

计算笛卡尔或极坐标系中2个位置之间的角度

来自分类Dev

如何在PIL python中获得已旋转角度的文本的x,y坐标?

来自分类Dev

获取笛卡尔积的算法

来自分类Dev

笛卡尔坐标中的饼图

来自分类Dev

简单的笛卡尔坐标计算器

来自分类Dev

Android旋转矩阵传感器获取旋转角度失败

来自分类Dev

在Babylon.js中,如何获取/设置FreeCamera的旋转角度或平移角度?

来自分类Dev

C ++中的笛卡尔积

来自分类Dev

将图像从笛卡尔坐标转换为极坐标

来自分类Dev

如何从极坐标中补偿笛卡尔坐标中的误差

来自分类Dev

枫树,从极坐标转换为笛卡尔坐标?

来自分类Dev

将笛卡尔坐标转换为极坐标-Matlab

来自分类Dev

SVG查找路径的旋转角度