計算機は 32° と計算しましたが、なぜターゲットは逆の方向を向いているのでしょうか?
2 つの反対方向が同じ傾きを持つことがあります。比率だけを残すと、本当に必要なシンボルを捨てることになります。
ターゲットが左下にあることはわかっていますが、プログラムは上と右を指す矢印を描画します。計算は正しい可能性があります。最初に 2 つの負の数を除算すると、得られた正の比率からはターゲットがどの象限にあるかがわかりません。
まずは推測してください
右上がりと左下がりの 2 本の線の y/x 比が同じである可能性はありますか?
答えと解説を見る
可能 — 2 つの成分は同時に符号を変化させ、比率は変化しませんが、方向は 180 度異なります。
そして経験と科学を結びつける
まずターゲットが位置する象限を特定します
青い点の位置は x と y によって決まります。単一パラメータの atan は比率のみを読み取り、除算では 2 つの負の符号が相殺されます。
atan(y/x) の戻り範囲は -90° ~ 90° のみです
2 つのコンポーネントをそれぞれ atan2 に渡します
atan2(y,x) は正負の符号を保持し、左下と右上を区別できます。パラメータの順序は言語ドキュメントに従って確認する必要があります。
このプロジェクトでは Math.atan2(y,x) を使用します。
方向は正しく、角度単位を使用する必要があります。
JavaScript 三角関数の入力はラジアンです。 sin に直接 212 のような度数を与えると、212 ラジアンと間違えられます。
ラジアン = 度 × π/180
特別な状況を乗り越えるために虚偽の数字に頼らないでください。
軸上の方向は定義できますが、ゼロ ベクトルは定義できません。負の数値の切り捨てや切り捨ても異なり、特にカレンダーコードは混在できません。
atan2(0,0) には幾何学的な方向がありません。フロア(−7.83)=−8
計算の流れを詳しく見る
θ弧過ごす = atan2(y,x) θ過ごす = θ弧過ごす × 180/π θ圈内 = ((θ過ごす mod 360)+360) mod 360
atan2 は最初に y を渡し、次に x を渡します。象限情報が保持されます。 x=y=0 の場合には幾何学的方向は存在せず、プログラムが値を返したとしてもそれを方向として使用することはできません。
試してみてください
まず元の本の左下の例を見て、両方の成分を正の数に変更します。傾斜率は同じですが、方向は半回転異なる必要があります。最後にゼロベクトルを試します。
見てみてください →
記号を覚える必要はありません
- atan(y/x)
- 比率だけを見ても、180°離れた方向を区別することは不可能です。
- atan2(y,x)
- 2つの成分をそれぞれ保持して象限を判定する
- θ / θπ/180
- 角度値(度)/対応するラジアン値
- floor / trunc
- 負の無限大への丸めとゼロへの切り捨ては同じ操作ではありません
アルゴリズム、精度、適用範囲
補足第 1 章 正しい象限と言語単位トラップ。元のブック A=-0.5712、B=-0.9139 を使用すると、インターフェイス y=A、x=B。 atan(A/B) は約 32° で、正しい方向は約 212° です。単一パラメータ atan は、x=0 の場合は除算のデモンストレーションを実行しません。 atan2 は引き続き軸上の方向を決定できますが、(0,0) には幾何学的方向がないため、JavaScript atan2(0,0)=0 を使用して答えを偽造することはできません。右側の図は、同じ角度をラジアンに変換し、誤って度数を Math.sin に直接与えた後の結果を比較しています。 cos のみを推論した場合の 0 ~ 180° の範囲も示します。負の下限/切り捨て丸めは、第 7 章と一致しています。角度に関する古い入門コースには、すでに度、分、秒、マイナス記号、角度、時、円が含まれていました。ここでは繰り返しません。数学ポータルは、元の本の大角正規化テスト、ホーナー多項式、数値周期表の合計も実装しており、チェックは直接展開と一致しています。古いモデルの速度テストを最新の JavaScript のパフォーマンス保証に当てはめるものではありません。安全な分岐と反復の上限の実装は、一般的な根探索コースでも見つけることができます。
私の理解度チェック
このプロジェクトでは、2 つのコンポーネントの兆候を保存するためにどの関数が使用されていますか?
atan2(y,x) — atan2 は、最初に象限情報を破棄せずに、それぞれ y と x を受け取ります。
θ が度で表される場合、Math.sin(θ) を直接使用できますか?
いいえ、まずラジアンを変更します — JavaScript の sin 入力はラジアン単位です。
両方の成分が 0 です。正しい方向はどのように報告すればよいでしょうか?
定義なし — ゼロベクトルには方向がありません。関数によって返される数値は、幾何学的定義を置き換えることはできません。
最初に方向コンポーネントと標識を保持してから、単位を変換します。プログラムによって与えられた数値は、その数値が正しい幾何学的意味を持つことを意味するものではありません。
Jean Meeus · Astronomical Algorithms, 2nd ed. · いいえ。 1 章