現在、ベジェ曲線を描画するための Cox De Boor アルゴリズムを実装しようとしています。設定された次数、制御点の数、定義済みのノット ベクトルで許容できるものを作成することができましたが、任意の数の制御点と次数が与えられても機能するようにコードを調整したいと考えています。私が現在遭遇している問題、つまりパスが点 0/0 に向かってさまよっているという問題は、ノット ベクトルを適切に計算していないことが原因であると 90% 確信しています。誰かが私に1つか2つのヒントを与えることができれば、私は感謝します. 現在、各次元 (この場合は x と y のみ) を個別に計算していることに注意してください。最終的には、すべての次元に対して同じ事前計算を使用するようにこのコードを適応させます。NSArray ではなく C 配列を使用するように調整することもできますが、私が見た限りでは、そうすることによる実際の速度の利点はありません。
現在、{0, 0, 0, 0, 1, 2, 2, 2, 2} のノット ベクトルを持つ 5 つの制御点を使用して次数 3 の曲線を作成しています。
- (double) coxDeBoorForDegree:(NSUInteger)degree span:(NSUInteger)span travel:(double)travel knotVector:(NSArray *)vector
{
double k1 = [[vector objectAtIndex:span] doubleValue];
double k2 = [[vector objectAtIndex:span+1] doubleValue];
if (degree == 1) {
if (k1 <= travel && travel <= k2) return 1.0;
return 0.0;
}
double k3 = [[vector objectAtIndex:span+degree-1] doubleValue];
double k4 = [[vector objectAtIndex:span+degree] doubleValue];
double density1 = k3 - k1;
double density2 = k4 - k2;
double equation1 = 0.0, equation2 = 0.0;
if (density1 > 0.0) equation1 = ((travel-k1) / density1) * [self coxDeBoorForDegree:degree-1 span:span travel:travel knotVector:vector];
if (density2 > 0.0) equation2 = ((k4-travel) / density2) * [self coxDeBoorForDegree:degree-1 span:span+1 travel:travel knotVector:vector];
return equation1 + equation2;
}
- (double) valueAtTravel:(double)travel degree:(NSUInteger)degree points:(NSArray *)points knotVector:(NSArray *)vector
{
double total = 0.0;
for (NSUInteger i = 0; i < points.count; i++) {
float weight = [self coxDeBoorForDegree:degree+1 span:i travel:travel knotVector:vector];
if (weight > 0.001) total += weight * [[points objectAtIndex:i] doubleValue];
}
return total;
}