問題タブ [atan2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - C/Objective-C/Swift用のatan2()の高速で粗いバージョン?
滑らかで連続的な曲線をライブで描画するグラフィックス コードに取り組んでいます。羽毛ブラシのサポートを追加したい。そのためには、「法線」、つまり曲線を構成する線分に垂直な線を計算できる必要があります。
これを行うための純粋な数学的な方法は、arctan を使用してセグメントの角度を見つけ、90 度回転させ、sine と cosine を使用して法線の x と y のオフセットを見つけることです。角度を取得したら、ルックアップ テーブルを使用してサインとコサインを置き換えるのは非常に簡単ですが、パフォーマンスが高く精度の低いバージョンの を作成するのatan2()
は難しいようです。
法線 (垂直線) の長さと角度は正確である必要はありません。10分の1ずれていても問題ありません。
この種のグラフィックス作業用に高速で粗いバージョンの atan2() を開発した人はいますか? この種のものをパフォーマンスのために最適化するのは面倒で時間がかかります。
私は Swift 3 で作業していますが、「多言語」です。C/Objective-C で書かれたコードを統合することも問題ありません。(または、おそらく Swift に変換します。)
編集:
詳細:
このプロジェクトでは、ユーザーが指をすばやくドラッグした場合にかなり離れた一連の点を提供するフリーハンド描画を行い、Catmull-Rom スプラインを使用して中間点を追加して、次のように見える十分に小さい一連の線分を作成します。滑らかな曲線。
(Catmull-Rom スプラインは、よく知られているベジエ曲線に似た曲線ですが、曲線のすべての制御点が曲線上にあるため、ユーザーが入力頂点を使用して「フリーハンド」で入力した曲線を滑らかにするのは簡単です。スムージングを行います。)
(これから「曲線」と呼びますが、本当の意味は、滑らかな曲線に見えるほど短い線分で構成されるポリラインのことです)
変更された曲線の部分のみに対してスプラインを生成するように、コードを因数分解しました。今では十分に高速で、描くのと同じくらい速く美しく滑らかな曲線を作成します. 主観的には、ポイント間でジャンプすることなく、ポイントごとに指の軌跡をたどる曲線を描いているように見えます。
次の目標は、ソフト エッジのブラシで描画できるようにすることです。そのためには、ユーザーの指の軌跡の左右で、曲線に平行な曲線を見つけたいと考えています。次に、OpenGL を使用して、左右の線の間の太い曲線を定義する三角形のストリップを作成し、ポリゴン シェーディングを使用して、ユーザーの指跡曲線に沿って不透明から左右の平行曲線に沿って透明に曲線をぼかします。
6 ポイントの太さのソフト エッジの曲線を描きたいとします。左右のユーザーの指の軌跡をたどる曲線は、それぞれユーザーの曲線から 3 ポイント延長する必要があります。
指の軌跡の頂点を通過し、1/ユーザーの指跡の左右に希望の線の太さの 2。
以下は、現在のバージョンのプログラムで描かれた曲線のスクリーン ショットです。入力頂点は青いひし形で描かれ、追加した平滑化ポイントは中空の四角形で描かれています。(何が起こっているのかがよくわかるように、追加する平滑化ポイントの数を減らしました。)
各頂点を通る一連の「ハッシュ マーク」を、それぞれ 6 ポイントの長さで、それらの頂点の 1 つを中心として、その頂点で終了する平滑化された曲線の最初の線分に垂直に描くことを想像してください。
Peter O. が回答で指摘したように、特定の線分に垂直な線分を見つけるのは簡単です。勾配を反転するだけです。ただし、特定の長さの線分が必要です。(私の例では、6 点、頂点の両側に 3 点。) 私はそれを高速に行う方法を探しています。三角関数または平方根のいずれかを使用して法線の終点を割り出すことができましたが、どちらも非常に低速です。
python-2.7 - Arctan関数は不連続です
arctan関数から返される角度が正の値に跳ね上がるため、オメガ対時間のプロットで問題を解決しようとして多くの問題がありました。最初の象限に戻るように 2*pi を追加しようとしましたが、役に立ちませんでした ( arctan / arctan2 を使用して 0 から 2π までプロットするための答えから)。次に、配列内のすべての項目を負にして続行しようとしましたが、問題が何であるかはわかりません: arctan プロットは、不連続 にジャンプする値を返します。また、arctan2、math.atan、math.atan2 を使用してみました
配列のアークタンを見つけようとしたときにエラーが発生したため、関数を定義して iy をベクトル化する必要がありました
コードのこの部分は、一部の人にとっては苦痛に見えるかもしれません。問題を解決するためにさまざまな方法を試してみました