我正在研究LBP2中的游戏,该游戏修改了控制器输入的方式。这个问题: How can I convert coordinates on a square to coordinates on a circle? 用我正在做的事情帮助了我很多,但我确实遇到了一个问题。我需要他们给出的反函数。他们从广场出发 - >圈子,我试图搜索如何将圆圈映射到正方形。
上一个问题中给出的功能是:
xCircle = xSquare * sqrt(1 - 0.5 * ySquare ^ 2)
yCircle = ySquare * sqrt(1 - 0.5 * xSquare ^ 2)
我的问题是xCircle和yCircle ......如何找到xSquare和ySquare?
我已经尝试了我所知道的所有代数,填写了两页注释,试图获得wolfram alpha以获得反函数,但这个问题超出了我的能力。
感谢您一看。
答案 0 :(得分:12)
x =½√(2 +u² - v²+2u√2) - ½√(2 +u² - v² - 2u√2)
y =½√(2 - u²+v²+2v√2) - ½√(2 - u²+v² - 2v√2)
关于符号的注释:我使用的是x = xSquare,y = ySquare,u = xCircle和v = yCircle;
即。 (u,v)是圆盘坐标,(x,y)是方坐标。
对于公式的C ++实现,请转到
http://squircular.blogspot.com/2015/09/mapping-circle-to-square.html
参见http://squircular.blogspot.com
更多示例图片。
另外,请参阅http://arxiv.org/abs/1509.06344了解证明/推导
此映射与
相反u =x√(1 - ½y²)
v =y√(1 - ½x²)
P.S。映射不是唯一的。还有其他映射。下图说明了映射的非唯一性。
答案 1 :(得分:1)
如果你有xCircle和yCircle意味着你在一个半径为R = sqrt(xCircle^2 + yCircle^2)
的圆上。现在您需要将该圆扩展为半边= R,
if (xCircle < yCircle)
ySquare = R, xSquare = xCircle * R/yCircle
else
xSquare = R, ySquare = yCircle * R/xCircle
这是针对第一象限,对于其他人来说,你需要用标志进行一些微不足道的调整
答案 2 :(得分:0)
我正在实施上述解决方案,但结果并不令人满意。 方形坐标不精确。
这是一个简单的反例:
应用上面的表达式,我们得到新的方坐标
(x&#39;,y&#39;)=(u / v,r)=(0.625543242,1),r =(u ^ 2 + v ^ 2)^(1/2)。
这一点很接近,但不是预期的精确解决方案。
我解决了一个根发现问题,以便像上面那样得到从正方形到圆形的映射的逆表达式。 你需要解决上面的系统方程式:
I) u = x*(1-y^2/2)^(1/2)
II) v = y*(1-x^2/2)^(1/2)
最终有8个根点作为解决方案。我在Excel-VBA中实现的根源之一,我在下面介绍它并且工作得很好。
' given the circle coordinates (u,v) caluclates the x coordinate on the square
Function circ2sqrX(u As Double, v As Double) As Double
Dim r As Double, signX As Double, u2 As Double, v2 As Double, uuvv As Double, temp1 As Double
u2 = u * u
v2 = v * v
r = Sqr(u2 + v2)
signX = 1
If v = 0 Or u = 0 Then
circ2sqrX = u
Exit Function
End If
If u < 0 Then
signX = -1
End If
If Abs(u) = Abs(v) And r = 1 Then
circ2sqrX = signX
Exit Function
End If
uuvv = (u2 - v2) * (u2 - v2) / 4
temp1 = 2 * Sqr(uuvv - u2 - v2 + 1)
circ2sqrX = -((temp1 - u2 + v2 - 2) * Sqr(temp1 + u2 - v2 + 2)) / (4 * u)
End Function
' given the circle coordinates (u,v) caluclates the y coordinate on the square
' make use of symetrie property
Function circ2sqrY(u As Double, v As Double) As Double
circ2sqrY=circ2sqrX(v,u)
End Function
答案 3 :(得分:0)
有很多方法可以做到这一点;这是一个简单的方法。
想象一个以原点为中心的半径 R 的圆圈,以及以原点为中心的边 2R 的正方形,我们想要映射内部和之后的所有点圆的边界(坐标(x,y))到方形边界内和边界上的点。请注意,我们还可以使用polar coordinates (r,ø)(这应该是一个phi)来描述圆圈内的点,其中
x = rcosø,
y = rsinø
(即 r ^ 2 = x ^ 2 + y ^ 2 和 r&lt; = 1 )。然后想象其他坐标 x'= a(ø)x = a(ø)rcosø, y'= a(ø)y (即,我们决定 a 不依赖于 r )。
为了将圆的边界( r = 1 )映射到正方形的边界( x'= R ),我们必须为< em>ø&lt; 45deg , x'= a(ø)Rcosø= R ,因此我们必须 a(ø)= 1 /cosø。类似地,对于 45&lt; ø&lt; 90 我们必须将圆形图的边界设置为 y'= R ,在该区域中给出 a(ø)= 1 /sinø。继续围绕圆圈,我们看到 a(ø)必须始终为正,因此从圆圈到正方形的最终映射是
x'= a(ø)x,
y'= a(ø)y
,其中
ø = | arctan y / x | = arctan | y / x |
和
a(ø)= 1 /cosø,当ø&lt; = 45度时(即 x时) ,和 a(ø)= 1 /sinø,当ø&gt; 45度
立即为您提供另一个方向的映射。如果方块上有坐标(x',y')(其中 x'&lt; = R 和 y'&lt; = R ),然后
x = x'/ a(ø)
y = y'/ a(ø)
如上所述 a(ø)。
更简单的映射是计算圆上所需位置的(r,ø),并将其映射到 x'= r 和 y'=ø。这也将圆圈中的每个点都映射到一个矩形,反之亦然,并且可能有更好的属性,取决于你想要做什么。
这就是真正的问题:你实际上想要做的是什么?