C# 将坐标转换为正方形

C# 将坐标转换为正方形,c#,math,coordinates,xinput,C#,Math,Coordinates,Xinput,我正在开发一个小型c#程序,它使用xinput读取Xbox360拇指棒 我在读取坐标和规范化值方面没有问题,因此我得到了X和Y方向的-1和+1之间的浮点值。 我遇到的问题是,棍子本身在物理上被限制在一个圆内,在我的例子中,我想“拉伸”坐标,使它更像是一个正方形而不是圆形 原因是,每个方向都控制着一个电机,如果我移动斗杆(例如右上角),我希望X和Y都变成1。 由于斗杆是圆形的,这是不可能的,这也使得两个电机无法全速运行 有什么建议吗?所以您希望半径为r的圆上的点映射到半径为r的正方形上的点,该点位

我正在开发一个小型c#程序,它使用xinput读取Xbox360拇指棒

我在读取坐标和规范化值方面没有问题,因此我得到了X和Y方向的-1和+1之间的浮点值。 我遇到的问题是,棍子本身在物理上被限制在一个圆内,在我的例子中,我想“拉伸”坐标,使它更像是一个正方形而不是圆形

原因是,每个方向都控制着一个电机,如果我移动斗杆(例如右上角),我希望X和Y都变成1。 由于斗杆是圆形的,这是不可能的,这也使得两个电机无法全速运行


有什么建议吗?

所以您希望半径为r的圆上的点映射到半径为r的正方形上的点,该点位于穿过原点的同一光线上。为了达到这个目标,你必须用通常的公式计算半径

r = sqrt(x*x+y*y)
然后从这个比例因子

f = r / max ( abs(x), abs(y) )
最后用f*x替换x,用f*y替换y

我们可以通过注意系数为

f = sqrt ( 1 + (x*x)/(y*y) )
如果abs(y)>abs(x)和

f = sqrt ( 1 + (y*y)/(x*x) )

在相反的情况下。或者注意到最大的坐标被r取代,相应地,较小的坐标也不会减少很多物流。

谢谢,这很有帮助。现在我只需要找出为什么我的归一化有时会使x和y大于1。我打赌我还有其他一些错误,是时候调试一下了。