2

任意の数のポイント(位置と制御)を取り、与えられた情報に基づいてキャットマルロムスプラインを作成するクラスを作成しようとしています。

私がしていること-そしてこれがそれを行う正しい方法であるかどうかは本当にわかりません-は、次のようなクラスに個々のポイントを格納することです:

class Point { public: Vector3 position; Vector3 control; }

明らかに位置はポイントの位置であり、コントロールはコントロールポイントです。

私の問題はスプラインを接続することです-スプライン配列にポイントを保持する上記のクラスを考えると、特定の位置には1つのコントロールポイントしか持てないことを示しています。したがって、catmull romスプラインに3つ以上のポイントがある場合、接続されているさまざまな個々のcatmull-romスプラインは、1つの位置と1つのコントロールを別のそのようなスプラインと共有します。

位置が同じである必要があります-それらの間で連続するスプラインを作成したいので。しかし、私は本当に疑問に思います。コントロールポイントも2つのスプライン間で同じである必要がありますか?コントロールポイントを少しいじると、あるスプラインから別のスプラインにスムーズに移行しているように見せることができますが、それらの移行方法がキャットマルロムスプラインの形状と一致しているかどうかはわかりません。 。私は自分の手に座ってそれで十分だと合理化するよりも、正しくそれをしたいのです。

明らかに、私の質問の2番目の部分は自明です。2つの制御点と位置点が与えられた場合、キャットマルロムスプラインの長さを計算するにはどうすればよいですか?

4

2 に答える 2

4

2つの制御点間のスプラインを定義するには、Catmull-Romスプラインに制御点と各制御点の接線ベクトルが必要です。ただし、内部(つまり非終点)制御点での接線ベクトルは、その両側の制御点によって定義されます。T(P n)=(P n + 1 -P n-1)/2。閉じた曲線の場合、スプラインは、制御点のセットによって完全に定義されます。閉じていない曲線の場合は、最初と最後の制御点で接線ベクトルも指定する必要があります。これは一般的に行われます:T(P 0)= P 1 -P 0およびT(P n)= Pn - Pn -1

したがって、閉じた曲線の場合、データ構造は単なる制御点のリストになります。一般的なスプラインの場合、これはポイントのリストに最初と最後の法線ベクトルを加えたものです。

カーディナルスプラインが必要な場合は、ウィキペディアの記事のように、接線ベクトルの計算に重み係数を追加できます。

このようなスプラインの長さを計算するための1つのアプローチは、多くの点でスプラインを評価し、次に隣接する各点のペア間の直線距離を計算することによってスプラインを概算することです。

于 2009-07-18T15:28:12.410 に答える
1

長さの測定に関しては、多項式スプラインであるため、微積分を使用してこれを行うことができます。ライン全体の距離関数を統合する必要があります。ウィキペディアで非常によく説明されています...

于 2009-07-18T19:07:13.607 に答える