【问题标题】:How can I convert coordinates on a circle to coordinates on a square?如何将圆上的坐标转换为正方形上的坐标?
【发布时间】:2012-11-03 17:21:43
【问题描述】:

我目前正在开发一款 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 得到反函数,但是这个问题超出了我的能力。

感谢您的观看。

【问题讨论】:

标签: math coordinate-systems


【解决方案1】:

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


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

【讨论】:

    【解决方案2】:

    如果您有 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
    

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

    【讨论】:

      【解决方案3】:

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

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

      x = r cos ø,
      y = r sin ø

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

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

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

      在哪里

      ø = |arctan y/x| = arctan |y/x|

      a(ø) = 1/cos ø,当 ø x 时),以及
      a(ø) = 1/sin ø,当 ø > 45 度时

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

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

      a(ø) 同上。


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

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

      【讨论】:

        【解决方案4】:

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

        这是一个简单的反例:

        • 考虑正方形上的点 (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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-04
          相关资源
          最近更新 更多