procedure TForm1.deboor;
var
  a: array of record
    x, y: real;
  end;
  i, ii: integer;
begin
  Image1.Canvas.Pen.Color := clRed;
  iniA(degree);                                                                                             //inicializuje pomocne pole pre pomocne vrcholy
  count(u[degree]);                                                                                      //vypocita bod pre t = u s indexom d
  Image1.Canvas.MoveTo(round(a[low(a)].x), round(a[low(a)].y));                  //presunie kurzor na tej vypocitany bod
  for i := degree to (high(point)-1) do begin                                                   //robi to pre ud - un, resp od ud po un-1 (lebo v tom uz nezacina dalsi segment)
    for ii := round(u[i]*100) to (round(u[i+1]*100)-1) do begin                        //ide od prveho t v tom segmente po presposledne t v tom segmente
      iniA(i);                                                                                                 //nainicializuje pomocne pole rpe pomocne vrcholy
      count(ii/100,i);                                                                                       //vypocita bod pre t z tohoto segmentu
      Image1.Canvas.LineTo(round(a[low(a)].x), round(a[low(a)].y));               //nakresli k nemu ciaru
      Image1.Canvas.MoveTo(round(a[low(a)].x), round(a[low(a)].y));             //presunie sem kurzor
    end;
  end;
end;

/////////////////////////////////vypocet vrcholu pomocou pomocneho pola//////////////////////////
procedure count(t: real,c:real);
var
  j, r, q: integer;
  p: real;
begin
  r := 0;
  while(length(a) > 1) do begin                                                        //robi, kym pomocne pole nebude mat dlzku jedna
    inc(r);                                                                                       //pocita kroky
    for j := c-degree+r to c do begin                               //kedze to pocita z aktualneho bodu a rpedosleho, idem od najvyssieho po najnizsi
      if (u[j + degree - r + 1] = u[j]) then p := 0                                 //kvoli deleniu nulou + vypocet podla vzorca
      else p := (t - u[j])/(u[j + degree - r + 1] - u[j]);
      q:=j-(c-degree+r);
      a[q].x := (1 - p)*a[j-1].x + p*a[j].x;                                          //vypocet podla vzorca
      a[q].y := (1 - p)*a[j-1].y + p*a[j].y;
    end;
    for j := low(a) to (high(a)-1) do begin                                          //posuniem body dopredu, lebo prvy bod odtat neviem
      a[j].x := a[j+1].x;
      a[j].y := a[j+1].y;
    end;
    setLength(a, length(a)-1);                                                           //odtnem posledny bod
  end;
end;


////////////////////////////////inicializacia pomocneho pola pre pomocne body///////////////////////
procedure iniA(st: integer);                         //param,eter je kolkaty je to segment, zacina sa stupnom
var
  k, kk: integer;
begin
  setLength(a, st + 1);                                 //pole bude mat dlzku o jedna vacsiu
  kk := 0;
  for k := (st - degree) to st do begin            //presuvam donho body, z ktorych sa ma vypocitat vrchol
    a[kk].x := point[k].x;
    a[kk].y := point[k].y;
    inc(kk);
  end;
end;