如何将圆上的坐标转换为正方形上的坐标?

时间:2012-11-03 17:21:44

标签: math coordinate-systems

我正在研究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)

     

来自Mapping a Square to a Circle

我的问题是xCircle和yCircle ......如何找到xSquare和ySquare?

我已经尝试了我所知道的所有代数,填写了两页注释,试图获得wolfram alpha以获得反函数,但这个问题超出了我的能力。

感谢您一看。

4 个答案:

答案 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)是方坐标。

grid mapping

对于公式的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。映射不是唯一的。还有其他映射。下图说明了映射的非唯一性。

Boston Celtics squared

答案 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,y)=(0.75,1)。
  • 我们将圆圈上的(u,v)=(0.53,0.85)映射到圆圈。
  • 应用上面的表达式,我们得到新的方坐标

    (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'=ø。这也将圆圈中的每个点都映射到一个矩形,反之亦然,并且可能有更好的属性,取决于你想要做什么

这就是真正的问题:你实际上想要做的是什么?