2

反転について具体的な質問がありatan2ます。コード例をPHPで記述します。

$radial = 1.12*PI();
$transformed = -atan2(cos($radial)*2, sin($radial)*1.5);
$backToRadial = ?

開始ラジアルを知らずに、変換された値を開始ラジアルに戻す方法はありますか?コードフローは次のようになります$radial => transform($radial) => transformback(transform($radial)) => $radial

Web(スタックを含む)で検索しましたが、正しいコードが見つかりませんでした。ウィキペディアも見てみましたが、圧倒的でした。私の質問はもっと代数の質問だと思います;)。

どう考えているか教えてください!

_

ジェイソンSによる回答:

Answer (by radial range: -PI-PI):
$backToRadial = atan2(2*cos($transformed), -1.5*sin($transformed));

Answer (by radial range: 0-2PI):
$backToRadial = PI() + atan2(-(2*cos($transformed)), -(-1.5*sin($transformed)));
4

2 に答える 2

2

まず、tan -1atan2と同じではないか、以下のWiki記事から見たものと同じではありません。arctanatan2

ここに画像の説明を入力してください

ご覧のとおり、とに関する情報がないと、マップを元に戻すことはできませxy。ただし、x>0が常にtrueの場合は、逆正接関数などを使用するだけです。

この表現を使用して、逆関数を計算できます。

ここに画像の説明を入力してください

あなたの例では、y = 2cos(r)およびx = 1.5sin(r)です。したがって、上記の式をyで割ると、 x / yの形式になります。この場合、4/3 cot(r)になります。

この表現が正しければ、いくつかの単純な代数で次のようになります。

ここに画像の説明を入力してください

ここで、r =radialおよびk = cottransformed/ 2

WolframAlphaはこれに対する解決策を与えました:

ここに画像の説明を入力してください

ただし、リソースによっては、kの固定値を持つ関数のルートを見つける方がおそらく良いでしょう。たとえば、k = 1.35の場合、次のように解く必要があります。

ここに画像の説明を入力してください

MATLABなどの適切なソルバー(したがって、使用しているリソースに関するコメント)は、これを解決します。WolframAlphaは次の近似的な実際の解決策を提供しました:

ここに画像の説明を入力してください

于 2011-06-20T13:20:18.137 に答える
2

主角度(θ=-πから+πの範囲の角度)で機能する簡単な答えは次のとおりです。

θ'=-atan2(2cosθ、1.5sinθ)

θ=atan2(2cosθ'、-1.5sinθ')

ここで、最初の方程式は順方向変換であり、2番目の方程式は多くの逆変換の1つです。

この理由は、あなたがしていることは、r = 1の場合のデカルト座標ペア(x、y)=(rcosθ、rsinθ)の反射+スケーリング+単位の大きさの正規化と同等であるためです。 atan2(y、x)=θ。

動作する特定の変換は(x'、y')=(1.5y、-2x)です。

θ'=atan2(y'、x')= atan2(-2x、1.5y)= atan2(-2Rcosθ、1.5Rsinθ)= -atan2(2cosθ、1.5sinθ)、以降の最後のステップはtrue atan2(ky、kx)= atan2(y、x)for any k> 0、および-atan2(y、x)= atan2(-y、x)。

これは、xとyを解くことで逆にすることができます。つまり、y = 1 / 1.5 *x'およびx=-1/2 *y'です。

θ=atan2(y、x)= atan2(1 / 1.5 * x'、-1/2 * y')

そして、(x、y)にk = 3 / Rを掛けて、角度を変更しないようにします。

θ=atan2(2x'/ R、-1.5y' / R)= atan2(2cosθ'、-1.5sinθ')

QED


編集:ジェイソンは、あなたの例の角度1.12πが主角度範囲-πから+πにないことを正しく指摘しています。処理できる角度の範囲を定義する必要があり、最大で2πの範囲である必要があります。

私の答えはそれに応じて調整できますが、検証には少し手間がかかります。使用atan2()していてその出力がこの範囲にあるため、-πから+πの範囲に固執すると、自分で簡単になります。

atan2()0〜2πの範囲の角度を出力する修正バージョンを使用する場合は、次を使用することをお勧めします

atan2b(y,x) = pi+atan2(-y,-x)

ここで、atan2(-y、-x)の計算はatan2(y、x)とπの角度(mod2π)だけ異なるため、atan2bは0から2πの間で出力されます。

このアプローチを採用する場合は、計算しないでください-atan2b(y,x)。代わりにatan2b(-y,x)、(同等のmod2π)を計算して、出力角度の範囲が変更されないようにします。

于 2011-06-20T14:06:01.303 に答える