Thuật toán de Casteljau

Một phần của tài liệu Hướng dẫn làm đồ họa vi tính giáo trình cơ bản (Trang 31 - 34)

M Ở ĐẦU

2.4.1.1. Thuật toán de Casteljau

Thuật toán de Casteljau dựa trên dãy các điểm điều khiển để xây dựng với giá trị t trong đoạn [0, 1] tương ứng với một điểm P(t). Do đó, thuật toán sinh ra một dãy các điểm từ các điểm điều khiển cho trước. Khi các điểm điều khiển thay đổi, đường cong sẽ thay đổi theo. Cách xây dựng đường cong dựa trên phép nội suy tuyến tính và do đó rất dễ dàng giao tiếp. Ngoài ra, phương pháp này cũng đưa ra nhiều tính chất quan trọng của đường cong.

Parabol da trên ba đim Trong mặt phẳng R2xét ba điểm P0, P1, P2. Đặt Trong đó, t ∈ [0, 1]. Nói cách khác, với mỗi t ∈ [0, 1], các điểm 1() 0 t P , 1( ) 1 t P nằm trên các đoạn thẳng P0P1 và P1P2 tương ứng.

Lặp lại phép nội suy tuyến tính trên các điểm mới 1( ) 0 t P và 1() 1 t P ta được: Quỹ tích của ( ): 2( ) 0 t P t

P = khi t thay đổi trong đoạn [0, 1] sẽ cho ta đường cong như trên hình (b).

Dễ dàng suy ra

Suy ra P(t) là đường cong parabol theo biến t.

Ví dụ: Phương trình đường cong Bezier P(t) tương ứng ba điểm điều khiển

P0(1, 0), P1(2, 2), P2(6, 0) là:

Tổng quát cho trường hợp sốđiểm điều khiển ≥ 3 ta có:

Thut toán de Casteljau cho L + 1 đim điu khin

Trong mặt phẳng R2xét L+1 điểm P0, P1,..., PL. Với mỗi giá trị t cho trươc, ta xây dựng theo quy nạp đường cong P0L(t) như sau:

Bước 1: [Khởi tạo] Đặt r = 0Pir(t):=Pivới mọi i=0, 1, …, L-r.

Bước 2: [Kết thúc?] Nếu r = L dừng; ngược lại đặt

Bước 3: Thay r bởi r+1 và chuyển sang bước 2.

Cài đặt minh ha thut toán Casteljau

{ Point Q[Max]; int i, r; for (i = 0; i <= L; i++) { Q[i].x = P[i].x; Q[i].y = P[i].y; } for (r = 1 ; r <= L; r++) { for (i = 0; i <= L - r; i++) {

Q[i].x = (1 - t)*Q[i].x + t*Q[i + 1].x; Q[i].y = (1 - t)*Q[i].y + t*Q[i + 1].y; }

}

return(Q[0]); }

Để vẽ đường cong Bezier ta chỉ cần áp dụng gọi hàm Casteljau trong thủ tục

DrawCurve sau:

void DrawCurve(float a, float b, int NumPoints) {

float Delta = (b – a)/(float)NumPoints; float t = a;

int i;

moveto(Casteljau(t).x, Casteljau(t).y) ; for (i = 1; i <= NumPoints; i++) {

t += Delta ;

lineto(Casteljau(t).x, Casteljau(t).y) ; }

Một phần của tài liệu Hướng dẫn làm đồ họa vi tính giáo trình cơ bản (Trang 31 - 34)

Tải bản đầy đủ (PDF)

(120 trang)