Кривая Безье не рисовала прямо - PullRequest
0 голосов
/ 09 декабря 2011

Я сделал алгоритм для создания кривой Безье с Objective-C и Cocos2D.Вот мой код

-(int)factorial:(int)x{
    int sum=1;
    int i;
    if(x == 0){
        return 1;
    }else{
        for(i=1;i<x;i++){
            sum = sum*i;
        }
        return sum;
        }
}

-(int)binomialCoefficient:(int)n:(int)i{
    int sum;
    //NSLog([NSString stringWithFormat:@"fac n-i=%f\n", fach] );
    sum = [self factorial:n]/([self factorial:i]*[self factorial:(n-i)]);

    return sum;
}

-(float)convertT:(int)t{
    return t*(0.001);
}

-(float)power:(float)a:(int)b{
        int i;
    float hasil=1;
    for(i=0;i<b;i++){
        hasil = hasil*a;
    }
    return hasil;
}

-(float)bernstein:(float)t:(int)n:(int)i{
    float sum = 0;

    sum = [self binomialCoefficient:n:i]*[self power:t :i]*[self power:(1-t) :(n-i)];
    //NSLog([NSString   stringWithFormat:@"yeah"]);
    return sum;
}

, и для реализации вы просто помещаете массив x и y и получаете к нему доступ.Например, чтобы нарисовать одну точку на контрольной кривой, я сделал это так:

float myPx = px[i];
float myPy = py[i];
posx = posx+([self bernstein:theT :banyak-1 :i]*myPx);
posy = posy+([self bernstein:theT :banyak-1 :i]*myPy);

Да, этот код не дает идеальную красивую линию, но я пытаюсь нарисовать ее точка за точкой.Это работает хорошо, но проблема возникает, когда я пытаюсь использовать 3 точки.Средняя точка для изгиба линий не вела себя так, как я ожидал.Например, если я положу 3 точки в этих координатах: a (100,200) b (250,250) c (500,200)

Это не изгибается, а изгибается вниз.Если я хочу выразить это прямо, я должен поместить это полностью выше.

Я неправильно делаю это в синтаксисе или типах данных?Или это только мой алгоритм?

Заранее спасибо

С наилучшими пожеланиями (извините за мой плохой английский)

1 Ответ

1 голос
/ 10 декабря 2011

Факториал петля должна быть

for ( i = 1 ; i <= x ; i++ )

вместо

for ( i = 1 ; i < x ; i++ )
...