- Vytvořte si adresář Bezier a do něj vložte stažené zdrojové kódy (stejně jako v minulém cvičení)
- Vytvořte panel podle předlohy, nastavte hodnoty EditBoxu na odpovídající čísla
- Buttony Konec a Smazat propojte s odpovídajícími procedurami
- K buttonu Kresli propojte OnClick proceduru kresli
- Nadeklarujte pomocné proměnné
var Red,Green, Blue:byte;
x1,x2,y1,y2,ht,t:real;
chyba,i:integer;
P,C:TArrayOfPoints;
- Nadefinujte proceduru Bezier uvnitř procedury kresli (před begin)
procedure Bezier(t:real; var A:TPoint);
begin
A[1]:=P[0,1]*(1-t)*(1-t)*(1-t)+
P[1,1]*3*t*(1-t)*(1-t)+
P[2,1]*3*t*t*(1-t)+
P[3,1]*t*t*t;
A[2]:=P[0,2]*(1-t)*(1-t)*(1-t)+
P[1,2]*3*t*(1-t)*(1-t)+
P[2,2]*3*t*t*(1-t)+
P[3,2]*t*t*t;
end;
- Za begin doplňte převod textů z EditBoxu na čísla pomocí funkce VAL, nastavte uživatelské souřadnice procedurou Scale a zadejte řídící body pro křivky.
Val(Edit1.text, x1, chyba);
Val(Edit2.text, y1, chyba);
Val(Edit3.text, x2, chyba);
Val(Edit4.text, y2, chyba);
Val(Edit5.text, Red, chyba);
Val(Edit6.text, Green, chyba);
Val(Edit7.text, Blue, chyba);
Scale(x1,x2,y1,y2);
P[0,1]:=10; P[0,2]:=10;
P[1,1]:=30; P[1,2]:=150;
P[2,1]:=90; P[2,2]:=250;
P[3,1]:=140; P[3,2]:=170;
- Vykreslete řídící polygon - tj. spojnici řídících bodů
with Image1.canvas do
begin
Line(P[0],P[1],Red,Green,Blue);
Line(P[1],P[2],Red,Green,Blue);
Line(P[2],P[3],Red,Green,Blue);
end;
- Doplňte vykreslení křivky pomocí procedury Polyline.
//bezierova krivka zaskrtnuta
if checkBox1.checked then
begin
ht:=0.01;
t:=0;
i:=1;
while t<1 do
begin
Bezier(t,C[i]);
i:=i+1;
t:=t+ht;
end;
PolyLine(C,i-1,Red,Green,Blue);
end;
- Před begin dopňte další dvě procedury na Coonsovy a Fergusonovy křivky
procedure Ferguson(t:real; var A:TPoint);
begin
A[1]:= P[0,1]* (2*t*t*t-3*t*t+1)+
P[1,1]*(t*t*t-2*t*t+t)+
P[2,1]*(t*t*t-t*t)+
P[3,1]*(-2*t*t*t+3*t*t);
A[2]:= P[0,2]* (2*t*t*t-3*t*t+1)+
P[1,2]*(t*t*t-2*t*t+t)+
P[2,2]*(t*t*t-t*t)+
P[3,2]*(-2*t*t*t+3*t*t);
end;
procedure Coons(t:real; var A:TPoint);
begin
A[1]:=1/6*(P[0,1]*(1-t)*(1-t)*(1-t)+P[1,1]*(3*t*t*t-6*t*t+4)+
P[2,1]*(-3*t*t*t+3*t*t+3*t+1)+
P[3,1]*(t*t*t));
A[2]:=1/6*(P[0,2]*(1-t)*(1-t)*(1-t)+P[1,2]*(3*t*t*t-6*t*t+4)+
P[2,2]*(-3*t*t*t+3*t*t+3*t+1)+
P[3,2]*(t*t*t));
end;
- Analogicky jako v předchozím případě doplňte část na vykreslení. Bude se volat procedura Feguson a Coons a CheckBox bude mít index 2 nebo 3, jinak je vvše úplně stejné.
- To je vše, přátelé....