Де Кастељау алгоритам

Де Кастељау алгоритам се користи за одређивање тачке на Безијеровој кривој, за неко . Назив је добио по Полу де Кастељау. Овај алгоритам се такође може применити за поделу једне Безијерове криве на две, у зависности од параметра , а може се применити и за одређивање тангенте на Безијерову криву у тачки .

Де-Кастељау алгоритам уреди

 
Одређивање тачке на Безијеровој кривој степена 3, за t=0.6

Основна идеја де Кастељау-овог алгоритма је избор тачке   на дужи   такве да   дели дуж у размери  . Тада је тачка  , која дели дуж   у том односу, дата са:

 

Означимо контролне тачке на следећи начин:  , где први индекс означава број итерације (овде је  , а касније ће бити  ).

Претпоставимо да желимо да одредимо тачку  , ѕа фиксирано  . Почињемо од полигоналне линије   и користећи формулу   налазимо тачку   која дели дуж одређену тачкама   и   у односу  . На овај начин добијамо   тачака   које дефинишу нову полигоналну линију састављену од   дужи. Примењујући претходни поступак на нову полигоналну линију добијамо и другу линију од   тачака   и   дужи. Понављајући овај процес   пута, добијамо једну тачку  . Де Кастељау је доказао да је управо то тачка   на кривој која одговара параметру  .

Кодови у програмском језику C уреди

Итеративна имплементација де Кастељау алгоритма уреди

 
     _tacka DeCasteljau(_tacka P[],int n,int t)
     {
      _tacka Q[MAX];
      int k;
     
      for(i=0;i<n;i++)
        Q[i]=P[i];
     
      for(k=1;k<n;k++)
        for(i=0;i<n-k;i++)
        {
          Q[i].x=(1-t)*Q[i].x+t*Q[t+1].x;
          Q[i].y=(1-t)*Q[i].y+t*Q[t+1].y;
        }
     
      return Q[0];
     }

Извршавање се врши по принципу илустрованом на слици.

Рекурзивна имплементација де Кастељау алгоритма уреди

Претходно израчунавање може се извршити и рекурзивно. Нека су   контролне тачке  , за  . Свака следећа итерација (број итерације означава први индекс) се рачуна према следећој формули:   Користећи ову идеју, формирамо рекурзивну процедуру:

     tacka deCasteljau(int i, int j, tacka P[])
     {
       if(i == 0)
         return P[j];
       else
       {
         pom1 = deCasteljau(i-1,j);
         pom2 = deCasteljau(i-1,j+1);
         tacka T;
         T.x = pom1.x * (1-t) + pom2.x * t;
         T.y = pom1.y * (1-t) + pom2.y * t;
         return T;
       }
     }

Иако процедура делује једноставно и кратко, веома је неефикасна. Да би израчунали  , позивамо функцију deCasteljau(n,0), а она се у ELSE делу позива још два пута. Проблем је у томе што се скоро све функције за рачунање   позивају више од једном. Сложеност овог израчунавања истоветна је сложености израчунавања n-тог члана Фибоначијевог низа. Сложеност се може поправити техником мемоизације, тако што би се одговорајуће вредности чувале и више пута користиле у поступку израчунавања.

Подела криве на два дела уреди

 
Подела Безијерове криве на два дела - контролна полигонална линија левог дела криве
 
Подела Безијерове криве на два дела - контролна полигонална линија десног дела криве

Смисао поделе криве је да "исечемо" дату Безијерову криву у тачки  , за неко  , на два дела, од којих је сваки и даље Безијерова крива. Резултујуће Безијерове криве морају задате су својим контролним тачкама, тако да се почетни скуп контролних тачака одбацује. Пошто се почетна крива степена   дели на две криве, од којих је свака подскуп почетне  -димензионе Безијерове криве, и резултујуће криве морају бити  -тог степена.

Алгоритам за поделу Безијерове криве у тачки   за фиксирано   се базира на де Кастељау алгориму за одређивање тачке   на кривој.

Криву   делимо на две криве   и  . Безијерова крива   је одређена конролним тачкама:

 

Безијерова крива   је одређена конролним тачкама:

 

Подела криве има велики број примена. На пример, може се користити за одређивање пресека две Безијерове криве, рендеровање Безијерове криве, а и олакшава дизајн кривих.

Тангента на Безијерову криву уреди

Де Кастељау алгоритам се може применити и за одређивање тангете на Безијерову криву у тачки  . Вектор правца тангенте представља вектор  .

Повећање степена криве уреди

 
Повећање степена Безијерове криве
 
Однос на свакој дужи почетне полигоналне линије за n=3

Иако Безијерове криве вишег степена захтевају више времена за обраду, оне су погодније за дизајнирање различитих облика. Стога би било од велике помоћи да се повиси степен Безијерове криве без промене њеног облика. Очување облика криве је кључни захтев, јер, у супротном, повећање степена Безијерове криве не би имало практичног смисла.

Претпоставимо да имамо Безијерову криву степена   одређену са   контролних тачака   и да желимо да повисимо њен степен за   без промене њеног облика. Како је Безијерова крива  -ог степена дефинисана са   контролне тачке, потребно је да нађемо такав нови скуп контролних тачака. Нека је   нови скуп контролних тачака. Пошто почетак и крај криве остају фиксирани узимамо  , а остале тачке се одређују користећи следећу формулу:

 

Свака дуж почетне полигоналне линије садржи тачно једну нову контролну тачку. Прецизније, дуж   садржи нову контролну тачку  . Из формуле за рачунање нових контролних тачака, видимо да   дели дуж   у односу  . За разлику од де Кастељау алгоритма, овај однос није константан већ зависи од вредности параметра  .

Кад добијемо скуп контролних тачака, почетни скуп може бити одбачен. Како свака дуж почетне полигоналне линије садржи нову контролну тачку, процес замене старог скупа новим може се посматрати као одсецање углова у почетним контролним тачкама.

Уколико желимо веће повећање степена криве, на пример за  , онда се овај поступак понавља   пута. Степен криве може се повећавати док год то систем дозвољава, при чему се са повећањем броја контролних тачака полигонална линија приближава кривој.

Смањење степена Безијерове криве без промене њеног облика, у општем случају, није могуће. Степен криве је могуће смањити једино ако је степен претходно био повећан, тј. ако је та крива суштински крива мањег степена.

Литература уреди

  • Т. Шукиловић, С. Вукмировић (2015). Геометрија ѕа информатичаре. Математички факултет, Београд. стр. 143—147. ISBN 978-86-7589-106-2. 

Види још уреди

Спољашње везе уреди