0

ポイントのセットの 3 次スプライン軌跡を生成する C++ プログラムを作成しています。これらのポイントは、x 軸に沿って並べ替える必要はありません。たとえば、円などです。

Web でいくつかのライブラリを見つけました。たとえば、ALGLIB ライブラリやここのクラスですhttps://www.marcusbannerman.co.uk/index.php/home/42-articles/96-cubic-spline-class.htmlですが、これらのライブラリはすべてデータ ポイントを並べ替えます。生成したいのは円のようなものなので、これは必要ありません。これを達成する方法はありますか?

4

2 に答える 2

7

スプラインは、いくつかの独立変数に関する区分関数です(通常、リンクしたコードでt使用しているように見えますが)。x評価される特定の関数は、入力値に最も近いコントロール ポイントに依存するため、評価する必要がある関数をすばやく判断できるようにt、コントロール ポイントを並べ替えることは理にかなっています。t

ただし、並べ替えられていなくても、1 つの 1 次元スプラインで円を作成することはできませんでした。スプライン関数y = f(t)は、特定の に対して 1 つの値のみを提供しますtyに関してグラフを作成しtていて、原点を中心に半径 1 の円が必要な場合は、 と の両方を等しくする必要がありますが、f(0)これは意味がありません。1-1

円のようなものを得るには、代わりに 2 次元のスプラインまたは 2 つのスプラインが必要です。1 つはx値用で、もう 1 つはy値用です。これら 2 つのスプライン関数f(t)g(t)を取得したら、両方の関数を同時に評価するだけで、そのとのスプラインの値tが得られます。xyt

于 2011-12-21T15:18:42.957 に答える
1

単純で一般的なトリックは、累積線形弧長をパラメーターとして使用することです。したがって、x と y がベクトルである平面内の単純な (x,y) ペアとして曲線内に点のセットがある場合は、次のようにします。

t = cumsum([0;sqrt(diff(x(:)).^2 + diff(y(:)).^2)]);

これにより、ポイントの各ペア間の区分的な線形セグメントに沿った累積距離が得られ、それらが存在する順序で表示されます。スプライン曲線を 2 つの別個のスプライン モデル、つまり x(t) と y(t) として近似します。したがって、interp1 を使用するか、スプラインまたは pchip 関数を直接使用できます。その内挿を作成するとき、pchip と spline は異なるプロパティを持つことに注意してください。

最後に、実際に閉じた曲線があり、x(1) と x(end) が同じであると想定されている場合は、周期的な終了条件を持つスプライン モデルを使用する必要があります。私のSLMツールのスプラインモデルを除いて、その実装については知りませんが、理論的には難しくありません。

于 2011-12-21T22:19:35.610 に答える