Кривая Безье не рисовала прямо

Я сделал алгоритм для создания кривой Безье с помощью 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)

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

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

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

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


person giripp    schedule 09.12.2011    source источник
comment
Замените ваш метод «мощности» вызовом библиотеки C, вызывающей pow(x, y). Также переместите свои математические операции (например, факториальные и биномиальные коэффициенты) в функции, а не вызовы методов, так как это будет намного эффективнее. Также ваш синтаксис для вызова биномиального метода с двумя аргументами выглядит неправильно - этот код вообще компилируется?   -  person GoatInTheMachine    schedule 09.12.2011
comment
@toiletseat: да, аргументы могут быть безымянными.   -  person Cyrille    schedule 09.12.2011
comment
IIRC, факторный цикл должен быть for(i=1;i<=x;i++) вместо for(i=1;i<x;i++), не так ли? Я имею в виду, 4! = 4 × 3 × 2 × 1   -  person Cyrille    schedule 09.12.2011
comment
Ах да, дело в факториале! Спасибо @Cyrille!   -  person giripp    schedule 10.12.2011
comment
О, спасибо @toiletseat, я думал, что в Objective-C нет pow() :) Да, этот код работает, я просто не поместил сюда весь код   -  person giripp    schedule 10.12.2011
comment
@giripp Добавил мой комментарий в качестве ответа, чтобы вы могли принять его и отметить свой вопрос как решенный. Кроме того, помните, что obj-C является надмножеством C, поэтому каждая функция C (включая pow) работает прямо. И ваши математические функции действительно должны быть написаны как чистые функции C, это лучше для производительности, поскольку вы не вызываете среду выполнения для оценки методов объекта.   -  person Cyrille    schedule 10.12.2011


Ответы (1)


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

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

вместо

for ( i = 1 ; i < x ; i++ )
person Cyrille    schedule 10.12.2011