9

I'm currently working on a game in LBP2 that has modify the way a controller gives input. This question: How can I convert coordinates on a square to coordinates on a circle? Has helped me quite a lot with what I am doing, but I do have one problem. I need the inverse function of the one they give. They go from square -> circle, and I've tried searching all over for how to map a circle to a square.

The function given in the previous question is:

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

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

From Mapping a Square to a Circle

My question is given xCircle and yCircle... how do I find xSquare and ySquare?

I've tried all of the algebra I know, filled up two pages of notes, tried to get wolfram alpha to get the inverse functions, but this problem is beyond my abilities.

Thank you for taking a look.

4

4 回答 4

18

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² )


PS映射不是唯一的。还有其他映射。下图说明了映射的非唯一性。

波士顿凯尔特人队

于 2015-09-04T06:49:35.693 回答
1

如果你有 xCircle 和 yCircle 这意味着你在一个有 radius 的圆上R = sqrt(xCircle^2 + yCircle^2)。现在您需要将该圆扩展为一个半边 = R 的正方形,

if (xCircle < yCircle)
     ySquare = R, xSquare = xCircle * R/yCircle
else
     xSquare = R, ySquare = yCircle * R/xCircle

这是第一象限,对于其他象限,您需要对标志进行一些微不足道的调整

于 2012-11-03T18:11:48.670 回答
0

我正在实施上述解决方案,但结果并不令人满意。方坐标不准确。

下面是一个简单的反例:

  • 考虑正方形上的点 (x,y)=(0.75, 1)。
  • 我们将它映射到圆上 (u,v)=(0.53, 0.85) 的圆。
  • 应用上面的表达式,我们得到新的正方形坐标

    (x',y')=(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
于 2014-12-11T02:40:36.947 回答
0

有很多方法可以做到这一点;这是一种简单的方法。

想象一个以原点为中心的半径为R的圆,以原点为中心的边为2R的正方形,我们想要将圆内和圆的边界上的所有点(坐标为(x,y))映射到圆内的点并且在广场的边界上。请注意,我们还可以使用极坐标 (r, ø)来描述圆内的点(应该是 phi),其中

x = r cos ø,
y = r sin ø

(即r^2 = x^2 + y^2r <= 1)。然后想象其他坐标x' = a(ø) x = a(ø) r cos øy' = a(ø) y(即,我们决定a不依赖于r)。

为了将圆的边界 ( r = 1 ) 映射到正方形的边界 ( x' = R ),我们必须有,对于ø < 45degx' = a(ø) R cos ø = R,所以我们必须有a(ø) = 1/cos ø。类似地,对于45 < ø < 90,我们必须将圆映射到y' = R的边界,在该区域中给出a(ø) = 1/sin ø。继续绕圆,我们看到a(ø)必须始终为正,所以从圆到正方形的最终映射是

x' = a(ø) x,
y' = a(ø) y

在哪里

ø = |反正切y/x | = 反正切 | y/x |

a(ø) = 1/cos ø,当ø <= 45 度时(即,当x < y时),并且
a(ø) = 1/sin ø,当ø > 45 度时。

这会立即为您提供另一个方向的映射。如果您在正方形上有坐标(x', y') (其中x' <= Ry' <= R),那么

x = x'/a(ø)
y = y'/a(ø)

a(ø)同上。


然而,一个更简单的映射是计算圆上所需位置的(r, ø),并将其映射到x' = ry' = ø。这也将圆中的每个点映射到一个矩形中,反之亦然,并且可能具有更好的属性,具体取决于您想要做什么

所以这才是真正的问题:你在这里的真正目标是什么?

于 2014-12-13T12:52:20.593 回答