Do vậy nói chung mặt cong Lagrang có sai số rất lớn so với mặt cong thực phải xây dựng $11.. Mặt cong Bezier Tình hình giống như với đường cong để có thể xây dựng mặt cong chính xác hơn
Trang 1P vi P G vij j
j
m
=
∑
0
⇒ Mặt cong s có thể viết dưới dạng
S u v P F u G vij i j
j
m i
n
=
0 0 Với Fi(u), Gj(v) là các hàm cơ sở
Nếu chọn hàm cơ sở
k i k
k i
n
ư
=
≠
∏
0
j j
k j k
k j
m
ư
=
≠
∏
0
khi đó
S u v P lij jm v li u
n j
m i
n
=
∑
0 0 Chúng ta thể thấy mặt cong s đi qua điểm Ui,vj
S(ui,vj)=Pij
Công thức (**) gọi là công thức mặt cong Lagrang
Mặt cong Lagrang có ưu điểm nó đi qua nxm điểm cho trước và có đạo hàm cao tuỳ
ý Do vậy nói chung mặt cong Lagrang có sai số rất lớn so với mặt cong thực phải xây dựng
$11 Mặt cong Bezier
1 Mặt cong Bezier
Tình hình giống như với đường cong để có thể xây dựng mặt cong chính xác hơn khi cho trước một số điểm, người ta nghĩ đến việc xây dựng các mảnh mặt cong nhỏ hơn
và sau đó ghép nối chúng lại, mặt cong Bezier là mặt cong có dạng tham số:
S u v P Bij mj u B vni
j
m
i
n
=
= ∑
0 0
ở đây Bmj ,Bin là các đa thức Berstein bậc m và n, uo≤u≤u1 , vo≤v≤v1
Trang 2u=uo+q(u1-uo) v=vo+r(v1-vo)
Các điểm Pij được gọi là các điểm kiểm tra của mặt cong Bezier Có thể minh hoạ các điểm này sắp xếp theo trật tự sau
Suy từ cách xây dựng đường cong Bezier, chúng ta có thể nhận thấy 4 điểm
Poo,Pom,Pno,Pnm là những điểm chắc chắn thuộc mặt cong S Xét trường hợp
n=m=3 khi đó mối liên hệ về giá trị và đạo hàm riêng ở các nút Poo,Pom,Pno,Pnm
được cho bởi công thức sau:
⎡
⎣
⎢
⎢
⎢
⎢
⎤
⎦
⎥
⎥
⎥
⎥
=
ư
ư
⎡
⎣
⎢
⎢
⎢
⎢
⎢
⎢
⎤
⎦
⎥
⎥
⎥
⎥
⎥
⎥
⎡
⎣
⎢
⎢
⎢
⎢
⎤
⎦
⎥
⎥
⎥
⎥
ư
ư
⎡
⎣
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎤
⎦
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
Δ Δ Δ Δ
v
v
v
v Δu=u1-u0; Δv=v1-v0;
Ví dụ: Từ mối liên hệ trên ta có:
S(u1,v1)=P33 Su(u1,v1)= Δu3 (P33-P23)
Trang 3Sv(u1,v1)= Δv3 (P33-P32) Suv(u1,v1)= Δ Δ u v9 (P22-P32-P23+P33)
2 Dán các mặt cong Bezier
Giả sử chúng ta đã xây dựng được 2 mặt cong Bezier S1(u,v) nà S2(u,v)
S1(u,v) ở đây có miền xác định [uo,u1]x[vo,v1]
S2(u,v) có miền xác định [u1,u2]x[vo,v1]
Giả sử ta cần phải dán S1 và S2 dọc theo biên u=u1 khi đó:
Với hàm S1 ta đặt:
u=uo+p(u1-uo) v=vo+r(v1-vo)
=
= ∑
∑
S u v P Bi j ni p Bmj r
j
m
i
n
1
1
0 0
Với hàm S2 ta đặt
u=u1+q(u2-u1) v=vo+r(r1-ro)
=
= ∑
∑
S u v P B q Bi j ni mj r
j
m
i
n
2
2
0 0
Chúng ta có nhận xét trên biên u=u1 các điểm kiểm tra của đường cong Bezier tạo nên biên u=u1 điểm cuối của đường Bezier theo v trên S1 là điểm đầu của đường cong Bezier trên u2
⇒ Pnj1 = P02j ∀ =j 0,m (***)
Điều kiện hai điểm cho các đường Bezier theo v nối với nhau và liên tục trên bờ u Việc nối để bảo đảm tính trơn của mặt cong đưa về bài toán nối các đường cong Bezier
Bezier theo tham số v trơn ở các điểm
v
o
v
1
S2 S1
u
2
u1
uo
Trang 4⇒ Pnj1 = P02j=Pj j=0,m Ch−¬ng tr×nh minh häa :
USES graph,crt;
Const l=3;
VAR
pi:array[0 l] of real;
u,v,t: real;
xi,yi,zi,a,b,c:array[0 l,0 l] of real;
x,y,z:array[0 100] of real;
xdau,Gd,Gm,i,j,k,p:integer;
a1,b1,s:real;
st1,st2: string[1];
(*************************************************)
{ -Ve he truc toa do -}
procedure khoitao;
begin
Gd := Detect;
InitGraph(Gd, Gm, ' ');
if GraphResult <> grOk then Halt(1);
directvideo:=False;
setbkcolor(1);
setcolor(14);
setviewport(getmaxX div 2,getmaxY div 2,getmaxX,getmaxY,false);
setlinestyle(0,0,0);
line(0,0,320,0);
line(-0,0,0,-240);
line(0,0,-240,240);
line(-5,-230,0,-240);
line(5,-230,0,-240);
line(310,-5,320,0);
line(310,5,320,0);
line(228,-235,240,-240);
line(235,-228,240,-240);
setlinestyle(1,0,0);
line(-320,0,0,0);
line(0,0,240,-240);
line(0,0,0,240);
settextjustify(0,2);
outtextxy(5,5,'O');
outtextxy(305,10,'x');
outtextxy(10,-230,'y');
outtextxy(240,-230,'z');
setlinestyle(0,0,0);
end;
Trang 5(*************************************************)
procedure move_to(x,y,z: integer);
Begin
moveto(round(x+z/sqrt(2)),round(y+z/sqrt(2)));
End;
(*************************************************)
procedure line_to(x,y,z: integer);
Begin
lineto(round(x+z/sqrt(2)),round(y+z/sqrt(2)));
End;
(*************************************************)
procedure put_pixel(x,y,z,m : integer);
Begin
putpixel(round(x+z/sqrt(2)),round(y+z/sqrt(2)),m);
End;
(*************************************************)
{thu tuc ve duong cong theo thuat toan CASTELEJ}
PROCEDURE ve;
Var
i,j : integer;
BEGIN
for i:=0 to l do
Begin
xi[i,0]:=x[i];
yi[i,0]:=y[i];
zi[i,0]:=z[i];
End;
u:=0;
while u<=1.01 do
Begin
for j:=1 to l do
Begin
for i:=j to l do
Begin
xi[i,j]:=(1-u)*xi[i-1,j-1]+u*xi[i,j-1];
yi[i,j]:=(1-u)*yi[i-1,j-1]+u*yi[i,j-1];
zi[i,j]:=(1-u)*zi[i-1,j-1]+u*zi[i,j-1];
End;
End;
put_pixel(round(xi[i,j]),round(yi[i,j]),round(zi[i,j]),WHITE);
End;
END;
(*************************************************)
{ -Chuong Trinh Chinh -}
Trang 6BEGIN
a[0,0]:=-210; b[0,0]:=100; c[0,0]:=10;
a[0,1]:=-200; b[0,1]:=-100;c[0,1]:=-30;
a[0,2]:=-40; b[0,2]:=80; c[0,2]:=50;
a[0,3]:=160; b[0,3]:=40;c[0,3]:=20;
For i:=1 To l Do
Begin
For j:=0 To l Do
Begin
a[i,j]:=a[0,0]+i*10; b[i,j]:=b[0,0]+i*10; c[i,j]:=c[0,0]+i*10;
End;
End;
a[3,3]:=a[0,3]-50; b[3,3]:=b[0,3]+140;c[3,3]:=c[0,3]-20;
khoitao;
i:=0; j:=0;
circle(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2)),2);
str(i:1,st1); str(j:1,st2);
outtextxy(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2))+15,'A['+st1+','+st2+' ]');
i:=0; j:=l;
circle(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2)),2);
str(i:1,st1); str(j:1,st2);
outtextxy(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2))+15,'A['+st1+','+st2+' ]');
i:=l; j:=0;
circle(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2)),2);
str(i:1,st1); str(j:1,st2);
outtextxy(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2))+15,'A['+st1+','+st2+' ]');
i:=l; j:=l;
circle(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2)),2);
str(i:1,st1); str(j:1,st2);
outtextxy(round(a[i,j]+c[i,j]/sqrt(2)),round(b[i,j]+c[i,j]/sqrt(2))+15,'A['+st1+','+st2+' ]');
v:=0;
while v<=1.01 do
Begin
For k:=0 To l Do
Begin
For p:=0 To l Do
Begin
Trang 7xi[p,0]:=a[p,k]; yi[p,0]:=b[p,k];zi[p,0]:=c[p,k];
End;
for j:=1 to l do
Begin
for i:=j to l do
Begin
xi[i,j]:=(1-v)*xi[i-1,j-1]+v*xi[i,j-1];
yi[i,j]:=(1-v)*yi[i-1,j-1]+v*yi[i,j-1];
zi[i,j]:=(1-v)*zi[i-1,j-1]+v*zi[i,j-1];
End;
End;
x[k]:=xi[i,j]; y[k]:=yi[i,j]; z[k]:=zi[i,j];
End;
ve;
v:=v+0.01
End;
repeat until keypressed;
closegraph;
END