Я сделал алгоритм для создания кривой Безье с помощью 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)
Он не изгибался вверх, а изгибался вниз. Если я хочу сказать прямо, я должен поставить все это намного выше.
Я ошибаюсь в синтаксисе или типах данных? Или это только мой алгоритм?
заранее спасибо
С наилучшими пожеланиями (извините за мой плохой английский)
for(i=1;i<=x;i++)
вместоfor(i=1;i<x;i++)
, не так ли? Я имею в виду,4! = 4 × 3 × 2 × 1
- person Cyrille   schedule 09.12.2011pow
) работает прямо. И ваши математические функции действительно должны быть написаны как чистые функции C, это лучше для производительности, поскольку вы не вызываете среду выполнения для оценки методов объекта. - person Cyrille   schedule 10.12.2011