問題タブ [cubic-spline]
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.
math - 指定された接線ベクトルに等しい 2D 3 次ベジエに沿って時間 t を計算します
4 点で定義された 3 次ベジエがあります。接線が特定のベクトルに等しい 3 次ベジエに沿って時間 t を見つける必要があります。この問題は一見したように単純ではありません。最初に基本的な数学を説明して、どのようにアプローチしたかを説明します。これにより、欠陥と、おそらくより良い解決策を見つけることができます。
2D キュービック ベジエとその接線は、次の方程式で定義できます。具体的には接線:
2D ベクトル用に展開します。
次に、時間 t を求めたい接線を表すベクトル (x, y) もあります。
これらは単純な 2 次方程式なので、方程式を解くだけで済みます。2 つの外積 (vx0 * vy1 - vy0 * vx1) を取り、0 について解くことができます。これにより、3 次ベジエのタンジェントが与えられたタンジェント ベクトルと等しい場合がわかり、t について解くことができます。(ベクトルが接線の反対側にあるかどうかは気にしないので、ベクトルが (1, 0) の場合は (-1, 0) も検索します)。Mathematica では、この外積アプローチを使用して t を解くと、次のようになります。
Mathematica は次のように出力します:
こちらが見やすい画像です。つまり、これらのケースのほとんどは変数が重複しているため、見た目よりもはるかに単純です。(両方の条件ケースは同一であり、二次方程式を解いたため、解は方程式の正または負のケースです)。コード形式では、これは簡単に確認できます。
問題が 2 次であるため、予想どおり 2 つの可能な時間が得られます。JS でのインタラクティブな例を次に示します。この例では、ハードコーディングされた (0.707, 0.707) の正接ベクトルを使用しています。(つまり、その座標系で下向きと右向きのベクトル)。
ただし、上記のコードには問題があります。不等式と平方根の計算で浮動小数点エラーを修正しても、明確に定義されていない場合があります。y2 - y3 が 0 の場合と同様に、ゼロ除算になります。これには微妙な点もあります。特定のケースでは、temp4 の有効な結果がゼロに非常に近くなり、正しい結果が生成されるか、浮動小数点の問題が原因で t1 と t2 の値が予想よりもはるかに大きくなります。これは、t1 または t2 が 0.5 の場合に特に気付きました。対角線をひっくり返してもう一度解くと、いくつかのエッジケースが解決する可能性があると考えていましたが、そのアプローチには自信がありません.
私が望むのは、おそらくコード例を使用した、試行錯誤されたアプローチ、または奇妙なエッジケースなしでこれに取り組む別の方法です。
javascript - 3つのjsで安定した遷移を伴うスプライン曲線
私は3つのjsでCubicBezierCurve3曲線を描いています。ただし、曲線全体を一度に描画するのではなく、部分ごとに着実に遷移して描画したいと思います。ガスの跡を残して動くロケットとしてそれを視覚化することができます。
私の考えは次のとおりでした
CubicBezierCurve3 を形成するすべてのポイントを見つけて、「allpoints」という変数に保存します。以下に示すように、CubicBezierCurve3 でちょうど 50 個のポイントが見つかったとします。
/li>反復ごとに 10 点をプロットします。つまり、
反復 0 : ポイント 0 から 9 をプロットする 反復 1 : ポイント 10 から 19 をプロットする 反復 2 : ポイント 20 から 29 をプロットする 反復 3 : ポイント 30 から 39 をプロットする 反復 4 : ポイント 40 から 49 をプロットする
この関数は、反復ごとに 10 個の点をプロットします。50 個の点があるので、5 回目の反復の最後に cancelAnimationFrame を呼び出すことができます。この関数には、タイミングを管理するためのいくつかの回避策が含まれています。違い)
JSフィドル
- これは、私が試したスムーズな移行のJS Fiddleです。
- これは、CubicBezierCurve3 のすべてのポイントのJS Fiddleです。
私の質問は、これを達成するためのより良い方法/API はありますか? また、LEDが突然見えなくなるのではなく、オフになるように、オフになる前にポイントを少し遅らせたいと思います. 実際には、個々のポイントを使用して行う必要さえありません。私が試したように、特定の 3 次ベジエ曲線の部分を段階的に描画するものを探しています。
python - scipy.interpolate の interp1d 関数で使用されるアルゴリズム
それで、私は数値コースのために python プログラムを書いていて、3 次スプライン プログラムをコーディングしなければなりませんでした。だから私は Chapra と canale による Numerical Methods や chenny と kincaidによる Numerical mathematicsのような本で与えられた 3 次スプラインの式を実装します。
だから私のデータは
このデータを使用して、私が得た 3 次スプラインを適用するとx=1.5
、y=1.79122340426
これと同じデータを使用しながら、scipy 関数を使用すると、次のようになります。
では、なぜその結果の違いが生じるのでしょうか? 彼らが同じ式を使用していないことは明らかです。その scipy 関数で使用される 3 次スプライン式は何ですか? 自然な 3 次スプライン式ですか、それとも改良されたものですか。注: 値 1.2656 はより正確です。
r - 3 次スプライン補間、R および matlab の不一致
R の splinefun {stat} s パッケージの spline() 関数を使用して、matlab の spline() 関数をレプリケートしようとしていますが、matlab に完全にアクセスできません (ライセンスがありません)。matlab に存在するすべての必要なデータを R に入力できますが、私のスプライン出力は matlab のものと平均 .0036 異なります (maxdif は .0342、mindif は -.0056、stdev は .0094)。 . 私の主な質問は、matlab の数式が R の数式とどのように比較されるかということです。それが私の計算の不一致の原因でしょうか?
私のコードの最初の部分は、Excel スプレッドシートを R に入力してから、タウとクイック デルタを取得するために必要な変数を計算することです。この後、スプライン計算を実行し、Excel にエクスポートする目的で出力を回転させます。以下は、基本的なスクリプトと、私の計算に何か問題があるかどうかを確認するためのいくつかのデータです。matlab のモデルに最も近い値を返すため、spline(natural) を使用します。
このスプライン実行に必要なデータ ポイントはすべて含まれており (私が思うに)、すべてが正しく整列しているはずです。事前にご連絡いただきありがとうございます。
matlab - MATLAB を使用して、ブレークポイント (終了点だけでなく) で特定の値の 1 次導関数を使用して B スプラインを作成するにはどうすればよいですか?
カーブ フィッティング ツールボックスの関数を使用csape
すると、ユーザーは両端で微分値を選択できます。
特定のブレークポイントで導関数の値を制御する方法はありますか?
導関数の値の 1 つを 1 つのブレークポイントでゼロに設定して、最大値にしたいと考えています。
コードは次のとおりです。
コメントの後、%% Spline generation using cubic spline.
時間と時間とともに変化する別の値の 2 つのベクトルがあり、3 次の b スプラインを作成したいと考えています。
私が使用csape
したのは、ユーザーが終点での導関数の値を決定できるようにするためです。cs = csape(tt,zz,[1 0 0 0 1],[0 0 0 0 0])
1 つは、終点で 1 次導関数を 0 にするようにツールに指示することです。
time = tmaxh で発生する点をスプラインの最大点にしたいと考えています。
これを に 1 を入れて作ってみた[1 0 0 0 1]
ので、一次導関数が最大で 0 であることがわかっているようになり[1 0 1 0 1]
ましたが、この方法はうまくいきませんでした。
ありがとうございました。
java - javaで曲線を取得するために3次スプライン補間を使用する方法は?
ここで行われたように、3次スプライン補間を使用して中間点を取得するために画像処理に取り組んでいます。Java言語でこれを達成するにはどうすればよいですか。いくつかの要点があります:
- x = 24、35、67、78、79。
- y = 13, 45, 8, 45, 23. x=1 から 100 までの中間点を取得したい.
Javaで利用可能なライブラリまたは関数はありますか. 伝えてください。