Math 我应该使用笛卡尔坐标系(x和y)还是极坐标系(角度和大小)来表示速度?

Math 我应该使用笛卡尔坐标系(x和y)还是极坐标系(角度和大小)来表示速度?,math,vector,physics,game-physics,Math,Vector,Physics,Game Physics,我正在编写一个物理游戏。似乎我可以使用两种系统来存储角色的移动数据: A)x&y分量(笛卡尔坐标) B)速度和方向分量(极坐标) 似乎我需要最终决定这两个系统中的一个,因为: A)它们都表示关于向量的相同信息 B)维护这两者似乎是多余和低效的 我发现的大多数游戏编程资源都使用笛卡尔坐标。据我所知,摩擦、旋转、加速度等所有变换都通过乘法、除法等组合到每个向量中。但对我来说,极坐标感觉更模块化,因此更具延展性,因为每个向量都由两个元素组成,并且可以分解成两个元素(方向和大小)。如果我想单独修改其中一

我正在编写一个物理游戏。似乎我可以使用两种系统来存储角色的移动数据:
A)x&y分量(笛卡尔坐标) B)速度和方向分量(极坐标)

似乎我需要最终决定这两个系统中的一个,因为:
A)它们都表示关于向量的相同信息 B)维护这两者似乎是多余和低效的

我发现的大多数游戏编程资源都使用笛卡尔坐标。据我所知,摩擦、旋转、加速度等所有变换都通过乘法、除法等组合到每个向量中。但对我来说,极坐标感觉更模块化,因此更具延展性,因为每个向量都由两个元素组成,并且可以分解成两个元素(方向和大小)。如果我想单独修改其中一个,我可以设置其值,而无需将其分解为单独的部分

我猜不同的型号适合不同类型的游戏。但是…
使用笛卡尔坐标与极坐标的决策受到哪些权衡影响?
什么时候一个模型会变得繁琐或冗长?


还是我太离题了?

你问题的前提有点奇怪。幅值加角度和2个基分量之和都是在2-空间中指定向量的方法。在这两种情况下,你都记录了2个标量(即,你没有单独的变量来表示x单位向量)直角坐标与极坐标的选择不会改变事物的性质,从矢量到标量,反之亦然

但是,不同的表示法肯定有其用途。正如您所提到的,分解为正交分量对于添加两个向量和其他操作具有现成的优势。此外,大多数显示器使用x-y坐标系,因此渲染更容易,因为您不必进行坐标变换

如果你的游戏是基于极坐标系(比如说一艘总是面对圆心的船),你可能真的想用极坐标来表示它。除此之外,直角坐标通常更容易使用


无论哪种方式,sin和cos都可能成为你的朋友。请记住,大多数图形坐标系的y-down都是正数。

你问题的前提有点奇怪。幅值加角度和2个基分量之和都是在2-空间中指定向量的方法。在这两种情况下,你都记录了2个标量(也就是说,你没有一个单独的变量来表示x单位向量)。直角坐标和极坐标的选择不会改变从向量到标量的性质,反之亦然

但是,不同的表示法肯定有其用途。正如您所提到的,分解为正交分量对于添加两个向量和其他操作具有现成的优势。此外,大多数显示器使用x-y坐标系,因此渲染更容易,因为您不必进行坐标变换

如果你的游戏是基于极坐标系(比如说一艘总是面对圆心的船),你可能真的想用极坐标来表示它。除此之外,直角坐标通常更容易使用

不管怎样,sin和cos都可能成为你的朋友。记住,大多数图形坐标系的y-down都是正数。

你所说的“标量”实际上只是一个极向量,对吧?所以你的问题不是关于向量vc标量,而是关于笛卡尔坐标系和极坐标系。[x,y]和[θ,r]都是向量

我还没有做过很多物理编程,但上一次我做了,它开始变得复杂起来(在三维空间中为鱼建模),我在处理极坐标时更加自如。我从零开始实现了类似a的算法,我发现用极向量来思考更为简单,尤其是在三维空间中。我还发现使用三角函数(acos()、asin()等)比在笛卡尔体系中使用毕达哥拉斯公式更干净

但是你真的是从这么低的层次来编码吗?

你所说的“标量”实际上只是一个极向量,对吗?所以你的问题不是关于向量vc标量,而是关于笛卡尔坐标系和极坐标系。[x,y]和[θ,r]都是向量

我还没有做过很多物理编程,但上一次我做了,它开始变得复杂起来(在三维空间中为鱼建模),我在处理极坐标时更加自如。我从零开始实现了类似a的算法,我发现用极向量来思考更为简单,尤其是在三维空间中。我还发现使用三角函数(acos()、asin()等)比在笛卡尔体系中使用毕达哥拉斯公式更干净


但是你真的是从这么低的层次来编码吗?

这两种表示法在数学上是等价的。此外,将一种表示法转换为另一种表示法是一个简单的O(1)操作。因此,请注意,这可能不是一个决定成败的决定。也就是说,就易用性而言:

你可能是对的,这取决于具体情况,哪一种更合适,因此,无论你能预见到自己更经常地使用哪一种,然后继续使用,并在必要时转换为另一种形式

使用语言功能帮助您抽象特定类型的实现。例如,如果您使用Java,请使用带有相关方法的
IPoint
接口。这样,您可以在
d (mv) / dt = force(x)