我正在开发一款独立视频游戏,并且假设因为我的控制器上的拇指操纵杆具有圆形运动范围,它会返回“圆形”坐标;也就是说,笛卡尔坐标约束为圆形区域(半径为1)。实际上,坐标是“方形”;例如,右上方的拇指操纵杆位置记录为x = 1,y = 1。当我将坐标从笛卡尔坐标转换为极坐标时,幅度可以超过1 - 这样可以使玩家在对角线上移动得比垂直或水平移动更快。
因此,为了澄清,我想记录模拟拇指操纵杆在方向和幅度方面的位置,其中幅度介于0和1之间。拇指操纵杆返回方形平面上的坐标,因此只需转换坐标笛卡尔到极地是不够的。我想我需要转换坐标 space ,但这会压迫我的猴子大脑的极限。
答案 0 :(得分:17)
见Mapping a Square to a Circle。映射还有一个很好的可视化。你得到:
xCircle = xSquare * sqrt(1 - 0.5*ySquare^2)
yCircle = ySquare * sqrt(1 - 0.5*xSquare^2)
答案 1 :(得分:9)
映射不是唯一的。这个问题还有很多其他解决方案。
例如,此映射也可以使用
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"一篇论文,讨论具有证据和推导的不同映射方程。
答案 2 :(得分:0)
将每个值除以幅度,以将所有值标准化为单位矢量,例如
magn = sqrt(x * x + y * y);
newx = magn > 1.0 ? x / magn : x;
newy = magn > 1.0 ? y / magn : y;
然而,这可能具有削减幅度而不是对内部值进行标准化的效果。也就是说,对于完全“推入”左上方和控制器几乎完全朝着同一方向推进。