【问题标题】:How can I convert coordinates on a square to coordinates on a circle?如何将正方形上的坐标转换为圆形上的坐标?
【发布时间】:2009-10-25 19:32:51
【问题描述】:

我正在开发一款独立视频游戏,并且一直在假设因为我的控制器上的拇指杆具有圆形运动范围,所以它返回“圆形”坐标;也就是说,笛卡尔坐标被限制在一个圆形区域(半径为 1)。实际上,坐标是“正方形”;例如,右上角的摇杆位置注册为 x=1,y=1。当我将坐标从笛卡尔坐标转换为极坐标时,幅度可能会超过 1 - 这意味着玩家可以沿对角线移动比垂直或水平移动更快。

所以,澄清一下,我想根据方向和幅度记录模拟摇杆的位置,其中幅度在 0 和 1 之间。摇杆返回方形平面上的坐标,因此只需将坐标从笛卡尔到极坐标是不够的。我想我需要转换坐标空间,但那是我猴脑的极限。

【问题讨论】:

  • 是占据“整个”正方形还是返回位于已经看起来像圆形的物体内的坐标?例如。确保您可以(或不能)采用 sqrt-magnitude。
  • 把棍子直接竖起来会得到什么 (x,y)?另外,你的摇杆是模拟的还是开关的?你能得到像 (0.5,0.5) 这样的值吗?
  • 是的,坐标分布在整个正方形上,包括角落。
  • 那我可能会删除我的答案。 :-) 听起来驱动软件正在预先扭曲这些值。
  • Nosredna:我认为你是对的。某些东西(驱动程序?DirectInput?)正在将坐标映射到正方形。我想知道为什么。我几乎总是喜欢一个圆圈。

标签: math coordinate-systems


【解决方案1】:

Mapping a Square to a Circle。映射也有一个很好的可视化。你得到:

xCircle = xSquare * sqrt(1 - 0.5*ySquare^2)
yCircle = ySquare * sqrt(1 - 0.5*xSquare^2)

【讨论】:

  • 基于可视化,我认为这正是我想要的。谢谢!
【解决方案2】:

映射不是唯一的。这个问题还有很多其他的解决方案。

例如,这个映射也可以工作

u = x √(x² + y² - x²y²) / √(x² + y²)

v = y √(x² + y² - x²y²) / √(x² + y²)

其中 (u,v) 是圆盘坐标,(x,y) 是方坐标。

一张图片胜过一千个单词,所以这里有一些图片来说明映射及其逆的非唯一性。


For a C++ implementation这个其他映射,去
http://squircular.blogspot.com/2015/09/fg-squircle-mapping.html
更多映射结果图片见http://squircular.blogspot.com

另请参阅"Analytical Methods for Squaring the Disc",了解一篇讨论不同映射方程及其证明和推导的论文。

【讨论】:

  • 不错。您是如何生成这些数字的(语言/库)?
  • 我用 C++ 编写了一个简单的图像处理程序,每个像素使用不同的映射方程。请参阅示例代码链接的链接。 Libpng 对读取和写入 PNG 文件很有用
【解决方案3】:

将每个值除以幅度以将所有值归一化为单位向量,例如

magn = sqrt(x * x + y * y);
newx = magn > 1.0 ? x / magn : x;
newy = magn > 1.0 ? y / magn : y;

但是,这可能会产生限制幅度而不是对内部值进行归一化的效果。也就是说,对于“完全”推入左上角的控制器和控制器 几乎完全朝同一个方向推进。

【讨论】:

  • 我绝对不想削减幅度。我已经有一个死区。两者加在一起会显着降低摇杆的有效运动范围。我认为 Eemeli 的想法是正确的。
猜你喜欢
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多