我目前正在尝试实现绘制贝塞尔曲线的Cox De Boor算法。我已经设法生成一些可以接受的东西,一定数量的控制点和一个预定义的结矢量,但是我想调整我的代码,使它能够在给定任意数量的控制点和任何程度的情况下运行。我90%确定我目前遇到的问题,即路径徘徊到0/0,是由于我没有正确计算结矢量。如果有人能给我一两个提示,我会很感激。请注意,我正在单独计算每个维度(本例中只是x和y);我最终会调整这些代码,对所有维度使用相同的预先计算。我也可以调整它来使用C数组而不是NSArrays,但从我所见到的情况来看,这样做并没有真正的速度优势。计算Cox De Boor算法的结矢量的正确方法是什么?
我目前正在使用5个控制点和{0,0,0,0,1,2,2,2,2}结矢量生成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;
}