Безјеове криве су параметарске криве. Њихову најбољу примену проналазимо у рачунарској графици.

Безијерова крива трећег степена чији полигон није прост
Анимација Безијерове криве рађена у програмском језику Ruby

Задају се одређеним бројем контролних тачака чијим се померањем мења облик криве. Додавањем контролних тачака се повећава степен криве, али и сложеност израчунавања, због чега се најчешће користе криве малог степена. Такозваним „лепљењем“ кривих малог степена, добијају се Безјеови сплајнови (сложене криве).

Пол Кастелжо и Пјер Безје су их први користили при дизајну аутомобила крајем педесетих година двадесетог века[1].

Дефиниција Безјеове криве уреди

Рекурзивна дефиниција уреди

Ако Безјеову криву одређену помоћу тачки   означимо као  . Онда:

  и
 

Експлицитна дефиниција уреди

Нека је Безјеова крива, степена  , задата помоћу   тачака равни. Можемо је представити следећим полиномом:

 

Тачке   помоћу којих је дефинисана крива називају се контролне тачке, а полиноми   Бернстајнови полиноми, тј. базне функције.

Тачке   образују контролни полигон.

Полиномијални облик уреди

Применом биномне теореме на дефиницију криве добијамо:

 

где је:

 

Извод уреди

Извод криве степена   је:

 

Специјални случајеви уреди

Највећу практичну примену имају Безјеове криве другог и трећег степена.

Линеарна Безјеова крива уреди

Безјеова крива степена 1, тј. крива одређена са само две тачке   и  , јесте заправо дуж  , задата следећом параметризацијом:

 


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

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


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

Квадратна Безјеова крива задата је следећом параметризацијом:

 


Безјеова крива другог степена је део параболе. Доказ лежи у особини инваријантности афиних пресликавања.


Извод:

 

Кубна Безјеова крива уреди

 
Безјеова крива трећег степена

Крива је задата помоћу тачака   . Почиње у  , иде према   и стиже у   долазећи из смера  . Углавном не пролази кроз   и  ; ове тачке служе да обезбеде додатне информације (раздаљина између   и   одређује „колико далеко“ и „колико брзо“ се крива креће према   пре него што скрене ка  ).

Кубна Безјеовакрива задата је следећом парамтризацијом:


 



Први извод:

 


Други извод:

 

Особине Безјеових кривих уреди

  • Највећи степен Безјеове криве   дефинисане са   контролних тачака је  .
  • Почетна тачка криве је  , тј.  
  • Вектор   је колинеаран тангентном вектору криве у тачки   док је вектор   колинеаран тангентном вектору криве  .
  • Особина ненегативности: за   можемо видети да су сви Бернстајнови полиноми  , тј. ненегативни су.
  • Особина конвексног омотача: Безјеова крива која је одређена помоћу   контролних тачка припада конвексном омотачу тих тачка. Центар масе тачака   са придруженим позитивним масама је тачка  . На слици је приказана крива 6. степена, а конвексни омотач њених 7 контролних тачака је означен розе бојом. Изузев две крајње тачке које су на рубу, читава крива лежи унутар омотача.
 
 
Конвексни омотач Безјеове криве Особина мање варијације
  • Особина мање варијације: ниједна права не пресеца Безијерову криву више пута него што сече контролну полигонску линију.
  • Особина афине инваријантности: слика Безјеове криве при афином пресликавању је одређена сликама њених контролних тачака при том истом пресликавању.

Безјеова крива на произвољном сегменту уреди

Основни домен Безјеове криве је сегмент  , али га можемо проширити на произвољни сегмент. У том случају је потребно извршити смену променљиве   на следећи начин:

 

Сада је променљива   дефинисана на интервалу   и потребно ју је заменити у базне функције како би крива била дефинисана на сегменту  :


 


Померање контролних тачака уреди

 
Померање контролне тачке Безјеове криве

Претпоставимо да је контролна тачка   померена за вектор  .


Нова крива је одређена тачкама   и њена једначина је:

 


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

Померање било које контролне тачке Безјеове криве мења криву глобално.

Почетна крива на слици је крива 8. степена са 9 контролних тачака и означена је црном бојом. Ако контролну тачку   померимо на нову позицију, црна крива се мења у црвену.

Матрична репрезентација[2] уреди

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

 


Кубне Безјеове криве уреди

  


Где је  


Одакле се аналогијом добија уопштење:


  



Подела Безјеове криве на два дела коришћењем матричне репрезентације уреди

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

Размотримо сад поделу криве на два дела прављењем реза у тачки  .

Прва крива:

 ,


где је   дата са:


 


Темена контролног полигона добијамо из:

 


За   темена су дата са:


   



Друга крива   је дефинисана са:


 ,


где је:


 .



Контролни полигон је одређен следећим тачкама:


 .


тј. за  :


   


Кубна Безјеова крива уреди

Размотримо сад поделу криве на два дела прављењем реза у тачки  .

Прва крива:

 ,


где је   дата са:


 


Темена контролног полигона добијамо из:

 


За   темена су дата са:


   



Друга крива   је дефинисана са:


 ,


где је:

 .


Контролни полигон је одређен следећим тачкама:


 


тј. за  :


   


Де Кастелжоов алгоритам уреди

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

Подела Безјеове криве уреди

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

Алгоритам поделе базира се на Де Кастелжоовом алгоритму.

Подела криве има велики број примена: дизајн кривих, рендеровање Безјеове криве, одређивање пресека две криве... Ако имамо неку криву која нам не одговара, можемо је поделити на незадовољавајући и задовољавајући део и онда се сконцентрисати на промену незадовољавајућег дела.

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

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

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

Рачунарство уреди

Кодирање[3] уреди

Неки програмски језици омогућавају цртање Безјеових кривих ако су познате контролне тачке којима су одређене.

На пример, у html-у направимо canvas tag:

 <canvas id="myCanvas" width="500" height="300"></canvas>

У оквиру JavaScript-а дефинишемо canvas преко променљивих:

 var c=document.getElementById("myCanvas");
 var ctx=c.getContext("2d");

Сада можемо користити следећи код који исцртава криву степена 3, где   и   означавају   и   координате  -те тачке.

 ctx.beginPath();
 ctx.moveTo(<math>P_0x,P_0y</math>);
 ctx.bezierCurveTo(<math>P_1x,P_1y,P_2x,P_2y,P_3x,P_3y</math>);
 ctx.stroke();

Ако желимо криву другог степена, потребно је позвати одговарајућу функцију, тј.:

 ctx.beginPath();
 ctx.moveTo(<math>P_0x,P_0y</math>);
 ctx.quadraticCurveTo(<math>P_1x,P_1y,P_2x,P_2y</math>);
 ctx.stroke();

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

/******************************************************
  Kod za generisanje kubne Bezjeove krive
 *******************************************************/
 
  typedef struct
  {
 	float x;
 	float y;
  }
  Point2D;
 
 /******************************************************
  cp je niz koji sadrži 4 elementa gde:
  cp[0] je početna tačka
  cp[1] je prva kontrolna tačka
  cp[2] je druga kontrolna tačka
  cp[3] je krajnja tačka
 
  t je parametar, 0 <= t <= 1
 *******************************************************/
 
  Point2D PointOnCubicBezier( Point2D* cp, float t )
  {
 	float   ax, bx, cx;
 	float   ay, by, cy;
 	float   tSquared, tCubed;
 	Point2D result;
 	
 	/* računa koeficijente polinoma*/
 	
 	cx = 3.0 * (cp[1].x - cp[0].x);
 	bx = 3.0 * (cp[2].x - cp[1].x) - cx;
 	ax = cp[3].x - cp[0].x - cx - bx;
 	
 	cy = 3.0 * (cp[1].y - cp[0].y);
 	by = 3.0 * (cp[2].y - cp[1].y) - cy;
 	ay = cp[3].y - cp[0].y - cy - by;
 	
 	/* računa tačku krive u zavisnosti od parametra t */
 	
 	tSquared = t * t;
 	tCubed = tSquared * t;
 	
 	result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x;
 	result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y;
 	
 	return result;
  }
 
 /*****************************************************************************
  Argument funkcije ComputeBezier je niz struktura Point2D sa tačkama krive 
  generisanim uz pomoć kontrolnih tačaka cp. Pozivalac mora da obezbedi dovoljno
  memorije za rezultat čija je veličina <sizeof(Point2D) * brojTačaka>
 ******************************************************************************/
 
  void	ComputeBezier( Point2D* cp, int numberOfPoints, Point2D* curve )
  {
 	float dt;
 	int   i;
 	
 	dt = 1.0 / ( numberOfPoints - 1 );
 	
 	for( i = 0; i < numberOfPoints; i++ )
 		curve[i] = PointOnCubicBezier( cp, i*dt );
  }

Графика уреди

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

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

Стандард за векторску графику назива се SVG, а постоје програми за векторску графику: Adobe Illustrator, CorelDraw, Inkscape...

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

Анимације уреди

У Adobe Flash и Synfig анимацијама, Безијерове криве се користе за конструисање. Рецимо да корисник жели да се његов објекат креће одређеном путањом. Он ће ту путању задати као Безјеову криву, а апликација ће на основу уноса направити потребне оквире по којима ће се објекат кретати.


 
Анимација Безијерове криве у програмском језику Java
 
Анимација Безјеове криве у програмском језику Python

Конструкција кривих уреди

Линеарне криве уреди

Параметар   код линеарне Безјеове криве може бити протумачен као „колико је   далеко од   крећући се ка  . На пример, када је   ,   је на пола пута од   ка  . Променом параметра   од 0 до 1, исписује се права линија.

 
Анимација линеарне Безјеове криве, т је из [0,1]

Квадратне криве уреди

Док параметар   варира од 0 до 1, могуће је уочити следеће:

  • Тачку   која варира од   до   и тиме исписује линеарну Безјеову криву
  • Тачку   која варира од   до   и тиме исписује линеарну Безјеову криву
  • Тачку   која је линеарна интерполација тачака   и   и тиме исписује квадратну Безјеову криву


 
Конструкција квадратне Безјеове криве
 
Анимација квадратне Безјеове криве, т је из [0,1]


Криве вишег степена уреди

  • Кубна Безјеова крива има три тачке   које исписују линеарне криве и тачке   које описују квадратне Безјеове криве.


 
Конструкција кубне Безјеове криве
 
Анимација кубне Безјеове криве, т је из [0,1]
  • Крива степена четири има четири тачке за опис линеарних кривих, три тачке које описују квадратне криве и две тачке које описују кубне Безјеове криве.


 
Конструкција Безјеове криве степена 4
 
Анимација Безјеове криве степена 4, т је из [0,1]
  • Аналогијом конструишемо и криву петог степена, као и криве већих степена
 
Анимација Безијерове криве петог степена

Референце уреди

  1. ^ Фарин, Гералд Е.; Хосцхек, Јосеф; Мyунг-Соо Ким (2002). Хандбоок оф Цомпутер Аидед Геометриц Десигн. Елсевиер. стр. 4—6. ИСБН 978-0-444-51104-1. 
  2. ^ http://www.idav.ucdavis.edu/education/CAGDNotes/Matrix-Cubic-Bezier-Curve/Matrix-Cubic-Bezier-Curve.html Архивирано на сајту Wayback Machine (4. март 2016) Матрична репрезентација, 29.01.2016.
  3. ^ http://codegolf.stackexchange.com/questions/21178/animated-drawing-of-a-b%C3%A9zier-curve Програмерски кодови, 29.01.2016.

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

Видео снимци уреди

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

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