正方形の座標を円の座標に変換するにはどうすればよいですか?
-
06-07-2019 - |
質問
私はインディーズのビデオゲームを開発していますが、コントローラーのサムスティックには円の可動範囲があるため、「円」を返すという仮定の下で動作しています。座標;つまり、(半径1の)円形領域に制限されたデカルト座標。実際、座標は「正方形」です。たとえば、右上のサムスティック位置はx = 1、y = 1として登録されます。座標をデカルト座標から極座標に変換すると、大きさが1を超える可能性があります。これは、プレイヤーが垂直または水平よりも斜めに速く動くことができるという効果があります。
したがって、明確にするために、アナログのサムスティックの位置を方向と大きさで記録します。大きさは0〜1です。サムスティックは正方形の平面上の座標を返すので、単純に座標を変換しますデカルト座標から極座標では不十分です。座標 space を変換する必要があると思いますが、それは私のサルの脳の限界を迫っています。
解決
正方形から円へのマッピングをご覧ください。マッピングのための素晴らしい視覚化もあります。取得:
xCircle = xSquare * sqrt(1 - 0.5*ySquare^2)
yCircle = ySquare * sqrt(1 - 0.5*xSquare^2)
他のヒント
マッピングは一意ではありません。この質問には他にも多くの解決策があります。
たとえば、このマッピングも機能します
u = x√(x² + y²-x² y²)/√(x² + y²)
v = y√(x² + y²-x² y²)/√(x² + y²)
(u、v)は円形のディスク座標で、(x、y)は正方形の座標です。
写真は千の言葉に値するので、マッピングの非一意性とその逆を示すいくつかの画像があります。
この他のマッピングのC ++実装
については、
http://squircular.blogspot.com/2015/09/fg-squircle -mapping.html
マッピング結果のその他の画像については、 http://squircular.blogspot.com をご覧ください。
証明付きのさまざまなマッピング方程式について議論している論文については、"ディスクの平方の分析方法" も参照してください。および派生。
各値を大きさで除算して、すべての値を単位ベクトルに正規化します。例:
magn = sqrt(x * x + y * y);
newx = magn > 1.0 ? x / magn : x;
newy = magn > 1.0 ? y / magn : y;
ただし、これは内部値を正規化するのではなく、大きさをクリップする効果がある場合があります。左上に移動し、コントローラーがほぼ完全に同じ方向に押し込まれます。