Функция смешивания / Безье - PullRequest
0 голосов
/ 30 апреля 2011

Я правильно вычисляю смесь Безье?Любая помощь будет оценена.Большое спасибо.

double bezierBlend(int i, double u, int m) {       
   double blend = 1;
   blend = factorial(m) * pow(u, i) * pow(1 - u, (m - i)) / (factorial(i) * factorial(m - i));
   return blend;
}

1 Ответ

1 голос
/ 06 мая 2011

Вот пример для вычисления функции смешивания Безье, следуя непосредственно из формулировки :

double choose( long n, long k )
{
    long j;
    double a;

    a = 1;
    for (j = k + 1; j <= n; j++)
        a *= j;
    for (j = 1; j <= n - k; j++)
        a /= j;
    return a;
};

double bezierBlend( int i, double t, int n ) 
{
    return choose( n, i ) * pow(1 - t, n - i) * pow( t, i );
}

Однако для большинства приложений вычисление степеней и биномиальных коэффициентов каждый раз абсурдно неэффективно. В типичных приложениях степень кривой постоянна (например, 2 для квадратичного или 3 для кубического), и вы можете вычислить функцию намного эффективнее, предварительно расширив формулу. Вот пример для кубических кривых:

double BezCoef(int i, double t)
{
  double tmp = 1-t;
  switch (i)
  {
  case 0: return tmp*tmp*tmp;

  case 1: return 3*tmp*tmp*t;

  case 2: return 3*tmp*t*t;

  case 3: return t*t*t;
  }
  return 0; // not reached
}
...