9

私は現在、コントローラーが入力を与える方法を変更したLBP2のゲームに取り組んでいます。この質問: 正方形の座標を円の座標に変換するにはどうすればよいですか? 私がしていることで私はかなり助けてくれましたが、私には1つの問題があります。彼らが与えるものの逆関数が必要です。それらは正方形->円から始まり、私は円を正方形にマッピングする方法をあちこち探してみました。

前の質問で与えられた関数は次のとおりです。

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

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

正方形から円へのマッピングから

私の質問にはxCircleとyCircleがあります...xSquareとySquareを見つけるにはどうすればよいですか?

私は知っているすべての代数を試し、2ページのメモを埋め、逆関数を取得するためにwolfram alphaを取得しようとしましたが、この問題は私の能力を超えています。

ご覧いただきありがとうございます。

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がある場合、それは半径が。の円上にいることを意味しますR = sqrt(xCircle^2 + yCircle^2)。次に、その円を半辺=Rの正方形に拡張する必要があります。

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

これは第1象限用ですが、他の象限の場合は、標識を少し調整する必要があります

于 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)with 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)

1つは、ソリューションとして8つのルートポイントになります。以下に示すExcel-VBAに実装したルーツの1つで、非常にうまく機能します。

' 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

これを行うには多くの方法があります。これが1つの簡単な方法です。

原点を中心とする半径Rの円と、原点を中心とする辺2Rの正方形を想像してください。円の境界内および境界上のすべての点(座標(x、y)を含む)を内の点にマッピングします。と正方形の境界に。極座標 (r、ø)(これはファイであると想定されます)を使用して円内の点を記述することもできることに注意してください。

x = rcosø、
y=rsinø

(つまり、r ^ 2 = x ^ 2 + y^2およびr<=1)。次に、他の座標x'= a(ø)x = a(ø)rcosø、およびy' = a(ø)yを想像します(つまり、aはrに依存しないと判断ます)。

円の境界(r = 1)を正方形の境界(x'= R)にマッピングするには、ø<45度の場合、x' = a(ø) Rcosø=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'<=Rおよびy'<= R)に座標(x'、y')がある場合、

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

上記のようにa(ø)を使用します。


ただし、はるかに簡単なマッピングは、円上の目的の位置の(r、ø)を計算し、それをx'=rおよびy'=øにマッピングすることです。また、円内のすべてのポイントを長方形にマップし、その逆も同様です。実行する操作によっては、より適切なプロパティが得られる場合があります

それが本当の質問です。ここで実際に何を目指しているのでしょうか。

于 2014-12-13T12:52:20.593 に答える