Giáo trình Đồ họa máy tính - Võ Phương Bình

Đồ họa máy tính là một trong những lĩnh vực hấp dẫn và phát triển nhanh của
Công nghệ Thông tin. Nó được ra đời bởi sự kết hợp của 2 lĩnh vực thông tin và truyền
hình, và được sử dụng rộng rãi trong hầu hết các ứng dụng như khoa học và công
nghệ, y học, giáo dục, kiến trúc, và kể cả giải trí. Ngày nay, nhờ vào sự tiến bộ của
khoa học kỹ thuật nên phần cứng và giá thành của máy tính càng lúc càng phù hợp,
các kỹ thuật đồ họa được ứng dụng trong thực tế nhiều nên ngày càng có nhiều người
quan tâm nghiên cứu đến lĩnh vực này.
Tuy nhiên, việc dạy và học kỹ thuật đồ họa mày tính thì không đơn giản vì chủ
đề này có nhiều vần đề phức tạp, liên quan đến tin học và cả toán học. Hầu hết các giải
thuật vẽ, tô màu cùng các phép biến hình đều được xây dựng dựa trên nền tảng của
hình học không gian hai chiều và ba chiều.
Giáo trình Đồ họa máy tính này được xây dựng dựa trên kinh nghiệm giảng dạy
đã qua và dựa trên tài liệu tham khảo chính là : “Donald Hearn, M. Pauline Baker;
Computer Graphics; Prentice-Hall, Inc., Englewood Cliffs, New Jersey , 1986”.
Giáo trình Đồ họa máy tính là một môn học được giảng dạy cho sinh viên
chuyên ngành Công nghệ Thông tin với 45 tiết lý thuyết và 30 tiết thực tập. Nội dung
của giáo trình này gồm có 3 vấn đề chính như sau :
• Trình bày các thuật toán vẽ và tô các đường cơ bản như đường thẳng, đa
giác, đường tròn, ellipse và các đường Bezier, B-Spline. Các thuật toán này
giúp cho sinh viên có thể tự thiết kế để vẽ và tô màu một mô hình đồ họa .
• Nội dung thứ hai đề cập đến các phép biến đổi Affine, tìm giao các đối
tượng, tô màu của đồ họa hai chiều.
• Nội dung thứ ba trình bày về quan sát, hiển thị và biến đổi Affine trên không
gian ba chiều. 
pdf 120 trang thiennv 08/11/2022 3560
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Đồ họa máy tính - Võ Phương Bình", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfgiao_trinh_do_hoa_may_tinh_vo_phuong_binh.pdf

Nội dung text: Giáo trình Đồ họa máy tính - Võ Phương Bình

  1. Ch ng 2 CÁC THU T TOÁN V I T NG H A CƠ B N Ni dung chính  Các thu t toán v on th ng: DDA, Bresenham, MidPoint.  Thu t toán MidPoint v ng tròn, ellipse.  V ng cong tham s Bezier, B-Spline. 2.1 Thu t toán v on th ng Hình 2.1: Các im g n on th ng th c Xét on th ng có h s góc m (0, 1] và x > 0. V i các on th ng d ng này, nu ( xi, yi) là im ã c xác nh b c th i thì im k ti p ( xi+ 1, yi+1 ) b c th i+1 s là m t trong hai im sau: Vn t ra là ch n im v nh th nào on th ng c v g n v i on Giáo trình H a Máy Tính 11
  2. th ng th c nh t và ti u hóa v m t t c , th i gian th c. 2.1.1 Thu t toán DDA (Digital DifferentialAnalyzer) DDA (hay còn g i là thu t toán s gia) là thu t toán v on th ng xác nh các im d a vào h s góc c a ph ng trình ng th ng y = m.x + b. Trong ó, m = y/x, y = yi+ 1 - yi , x = xi+ 1 - xi. Nh n th y trong hình v 2.1 thì t a c a im x s t ng 1 n v trên m i im v , còn vi c quy t nh ch n yi là yi + 1 hay yi s ph thu c vào giá tr sau khi làm tròn c a tung y. Tuy nhiên, n u tính tr c ti p giá tr th c c a y m i b c t ph ng trình y = m.x + b thì c n m t phép toán nhân và m t phép toán c ng s th c: yi+ 1 = m.xi+ 1 + b = m(xi + 1) + b = m.xi + b + m ti u tc , ng i ta kh phép nhân trên s th c. Ta có : yi = m.xi + b ⇒ yi+1 = y i + m • Tóm l i, khi 0 1: ch n b c t ng trên tr c y mt n v . xi+1 = x i + yi+ 1 = y i + 1 Hai tr ng h p này dùng v m t im b t u t bên trái n im cu i cùng bên ph i c a ng th ng (xem hình 2.2). N u im b t u t bên ph i n im cu i cùng bên trái thì xét ng c l i : • 0 < m 1: xi+ 1= x i – 1 Giáo trình H a Máy Tính 12
  3. yi+ 1:= y i - m • m > 1: xi+ 1 = xi – yi+ 1 = y i – 1 Hình 2.2 : Hai tr ư ng h p m >1 và 0 < m < 1 Cài t minh h a thu t toán DDA void DDALine(int x0, int y0, int x1, int y1) { int x; float dx, dy, y, m; dx:= x1 – x0; dy:= y1 – y0; m:= dy/dx; y = y0; for (x=x0; x <= x1; x++) { glVertex2i(x, Round(y)); Giáo trình H a Máy Tính 13
  4. y = y+m } } T ng t , ta có th tính toán các im v cho tr ng h p m 1. 2.1.2 Thu t toán Bresenham Hình 2.3 : Thu t toán Bresenham v on th ng có 0 ≤ m ≤ 1. Gi ( xi +1, yi +1 ) là im thu c on th ng (xem hình 2.3). Ta có y = m (xi +1) + b. t d1 = y i +1 - yi ; d2 = (yi +1) - yi +1 Vi c ch n im ( xi +1 , yi +1 ) là P1 hay P2 ph thu c vào vi c so sánh d1 và d2 hay du c a d1 - d2 : • Nu d1 - d2 < 0 : ch n im P1, t c là y i +1 = yi • Nu d1 - d2 0 : ch n im P2, t c là y i +1 = yi +1 Xét Pi = x(d1 - d2) Ta có : d1 - d2 = 2 yi+1 - 2yi - 1 = 2 m(xi+1) + 2b - 2yi - 1 Giáo trình H a Máy Tính 14
  5. ⇒ Pi = x(d1 - d2) = x[2 m(xi+1) + 2 b - 2yi - 1] = x[2(y/x)(xi+1) + 2 b - 2yi - 1] = 2 y(xi+1) - 2x.yi + x(2 b - 1) = 2 y.xi - 2x.yi + 2 y + x(2.b - 1) Vy C = 2 y + x(2 b - 1) = Const (hng s ) ⇒ Pi = 2 y.xi - 2x.yi + C Nh n xét r ng n u t i b c th i ta xác nh c d u ca Pi thì xem nh ta xác nh c im c n ch n b c ( i + 1). Ta có : Pi +1 - Pi = (2 y.x i+1 – 2x.y i+1 + C ) - (2 y.x i - 2x.y i + C ) ⇔ Pi +1 = Pi + 2 y – 2x( yi+1 - yi ) - Nu Pi < 0 : ch n im P1, t c là yi +1 = yi và Pi +1 = Pi + 2 y. - Nu Pi 0 : ch n im P2, t c là yi +1 = yi +1 và Pi +1 = Pi + 2 y – 2x - Giá tr P0 c tính t im v u tiên ( x0, y0) theo công th c : P0 = 2y.x 0 – 2x.y 0 + C Do (x0, y0) là im nguyên thu c v on th ng nên ta có : y0 = 2m.x 0 + b = x0 + b Th vào ph ng trình trên ta c : P0 = 2y – x Cài t minh h a thu t toán Bresenham void Bresenham_Line (int x1,int y1,int x2,int y2) Giáo trình H a Máy Tính 15
  6. { int dx, dy, x, y, P, incre1, incre2; dx = x2 - x1; dy = y2 - y1; P = 2*dy - dx; incre1 = 2*dy ; incre2 = 2*(dy - dx) ; x= x1; y=y1; glVertex2i(x, y); while (x < x2 ) { x = x +1 ; if (P < 0) P = P + incre1 else { y = y+1 ; P = P + incre2 } glVertex2i(x, y); } } Giáo trình H a Máy Tính 16
  7. Nh n xét - Thu t toán Bresenham ch thao tác trên s nguyên và ch tính toán trên phép cng và phép nhân 2. iu này là m t c i ti n làm t ng t c áng k so v i thu t toán DDA. - Ý t ng chính c a thu t toán này là ch xét d u Pi quy t nh im k ti p, và s d ng công th c truy h i Pi +1 - Pi tính Pi bng các phép toán n gi n trên s nguyên. - Tuy nhiên, vi c xây d ng tr ng h p t ng quát cho thu t toán Bresenham có ph c t p h n thu t toán DDA. 2.1.3 Thu t toán MidPoint Pitteway công b thu t toán MidPoint vào 1967, Van Aken c i ti n 1984. Xét h s góc thu c [0, 1]. Gi thi t r ng ã ch n P v , xác nh pixel ti p theo s là ti N hay NE (xem hình 2.4). Giao c a ng th ng v i Xp+1 t i Q, M là trung im c a NE và E. Hình 2.4: Thu t toán MidPoint v on th ng Ý t ng ca thu t toán MidPoint là xét im M xem nm phía nào c a ng th ng, n u M nm phía trên ng th ng thì ch n E (tc là ng th ng g n v i E h n NE ), ng c l i ch n NE . Vì v y, ta c n xác nh v trí t ng i c a M so v i ng th ng ch a on th ng c n v . • Phân tích thu t toán v on th ng d a trên ph ng trình dng t ng quát c a Giáo trình H a Máy Tính 17
  8. ng th ng ch a on th ng: F(x, y)= a.x + b.y + c Ta có: Suy ra d ng t ng quát: . Hay t ng ng: . T ó, ta có các h s c a ph ng trình d ng t ng quát là : a = dy, b = - dx, c = B.dx • Giá tr hàm t i M: F(M)=F (xp + 1, y p + ) = d o Nu d > 0, M nm d i ng th ng thì ch n NE . o Nu d < 0, M nm phía trên thì ch n E. o Nu d = 0, ch n E hay NE tùy ý. • Giá tr c a hàm t i M ca ca im ti p theo s v o Gi giá tr d va tính là: o Gi s v a ch n E: là s gia c a im ti p theo. o Gi s v a ch n NE: là s gia c a im ti p theo. Tính giá tr kh i u c a d ti các trung im Giáo trình H a Máy Tính 18
  9. o Gi s v on th ng t (x 0, y 0) n (x 1, y 1), t ó trung im th nh t có ta ( x0 + 1, y 0 + ). Suy ra: o F(x 0, y 0) = 0  dstart = a + = dy – o Tránh s th p phân c a d start , nh ngh a l i hàm nh sau: F(x, y)=2(a.x + b.y + c) o Do v y, ta có: dstart = 2dy - dx; E = 2dy; NE = 2(dy - dx) Cài t minh h a thu t toán MidPoint void MidPoint_Line(int x0, int y0, int x1, int y1, int color) { int dx, dy, x, y, d, incrE, incrNE ; dx = x1 – x0; dy = y1 – y0; d = 2*dy - dx; incrE = 2*dy; incrNE = 2*(dy - dx); x = x0; y =y0; Giáo trình H a Máy Tính 19
  10. glVertex2i(x, y); while (x<x1) { if (d<=0) { //ch n E d:= d+incrE; x = x+1 } else { //ch n NE d = d+incrNE; x =x+1; y =y+1 } glVertex2i(x, y); } } Nh n xét • Các thu t DDA, MidPoint trình bày xây d ng thu t toán v on th ng trong tr ng h p h s góc thu c on [0, 1]. Các tr ng h p còn l i phân tích t ng t i v i t ng thu t toán. Giáo trình H a Máy Tính 20
  11. • Có m t tính ch t i x ng có th áp d ng v on th ng trong các tr ng hp h s góc không thu c [0, 1] mà không ph thu c vào thu t toán. iu này có ngh a là ta s l y i x ng các on th ng này v tr ng h p thu c on [0,1], tính toán xong m i t a (x, y ) ta l i l y i x ng tr l i r i v . • Sau ây là ch ng trình cài t thu t toán DDA t ng quát cho t t c các tr ng hp theo ph ng pháp l y i x ng : void LineDDA_DX(int x1, int y1, int x2, int y2) { if (x2 1) { d = 1; int temp = x1; x1 = y1; y1 = temp; temp = x2; x2 = y2; y2 = temp; dy = y2 - y1; dx = x2 - x1; m = (double)dy / (double)dx; } else if (m > 0) { d = 2; } Giáo trình H a Máy Tính 21
  12. else if (m > -1) { d = 3; y1 = -y1; y2 = -y2; dy = y2 - y1; dx = x2 - x1; m = (double)dy / (double)dx; } else { d = 4; int temp2 = x1; x1 = -y1; y1 = temp2; temp2 = x2; x2 = -y2; y2 = temp2; dy = y2 - y1; dx = x2 - x1; m = (double)dy / (double)dx; } int x; double y; y = y1; for (x = x1; x <= x2; x++) { if (d == 1) { glVertex2i(Round(y), x); } else if (d == 2) { glVertex2i(x, Round(y)); } else if (d == 3) { glVertex2i(x, -Round(y)); } else // d==4 { glVertex2i(Round(y), -x); } y += m; Giáo trình H a Máy Tính 22
  13. } } 2.2 Thu t toán MidPoint v ng tròn Trong h t a Descartes, ph ng trình ng tròn bán kính R có d ng: • Vi tâm O(0,0) : x2 + y 2 = R 2 2 2 2 • Vi tâm C(xc, yc): ( x - xc) + (y - yc ) = R Trong h t a c c : • x = xc + R.cos • y = yc + Y.sin vi ∈ [0, 2 ]. Hình 2.5: i x ng 8 im trong ư ng tròn Do tính i x ng c a ng tròn C (xem hình 2.5) nên ta ch c n v 1/8 cung tròn, sau ó l y i x ng qua 2 tr c t a và 2 ng phân giác thì ta v c c ng tròn. Thu t toán MidPoint a ra cách ch n yi+1 là yi hay yi-1 bng cách so sánh im Giáo trình H a Máy Tính 23
  14. th c Q( xi+1 , y) v i im gi a M là trung im c a S1 và S2. Ch n im b t u v là (0, R). Gi s ( xi, yi) là im nguyên ã tìm c b c th i (xem hình 2.6), thì im (xi+1 , yi+1 ) b c i+1 là s l a ch n gi a S1 và S2. Hình 2.6 : ưng tròn v i im Q (x + 1, y ) và im MidPoint. t F(x, y) = x 2 + y 2 - R2, ta có : • F(x, y) 0 , n u im ( x, y) n m ngoài ng tròn. Xét Pi = F(M) = F(xi +1, y - ). Ta có : • Nu Pi = 0 : im M nm ngòai ng tròn. Khi ó, im th c Q gn v i im S2 h n nên ta ch n yi+1 = yi - 1. Mt khác : Pi+1 - Pi = F(xi+1 +1, yi+1 - ) - F(xi + 1, yi - ) Giáo trình H a Máy Tính 24
  15. 2 2 2 2 2 2 = [( xi+1 +1) + ( yi+1 - ) - R ] - [( xi +1) + ( yi - ) - R ] 2 2 = 2 xi + 3 + (( yi+1) + ( yi) ) - (yi+1 - yi) Vy : • Nu Pi = 0 : ch n yi+1 = yi - 1. Khi ó, Pi+1 = Pi + 2 xi - 2yi + 5. • Pi ng v i im ban u (x0, y0) = (0, R) là: P0 = F(x0 + 1, y0 - ) = F(1, R - ) = – R • rút g n bi u th c trên và tránh vi c tính toán s th c, ta t P’0 = P0 - = 1 – R. Ta có nh n xét r ng du c a P’0 không thay i trong thu t toán MidPoint. Cài t minh h a thu t toán MidPoint v d ng tròn void Ve_doi_xung_8diem(int xc, int yc, int x, int y) { glVertex2i(x + xc, y + yc); glVertex2i(y + xc, x + yc); glVertex2i(-x + xc, -y + yc); glVertex2i(-y + xc, -x + yc); glVertex2i(-x + xc, y+ yc); glVertex2i(-y + xc, x + yc); glVertex2i(x + xc, -y + yc); glVertex2i(y + xc, -x + yc); Giáo trình H a Máy Tính 25
  16. } void MidPoint_Circle(int xc, int yc, int r); { int x, y, p; x=0 ; y=r; p=1 - r; while ( y > x) { Ve_doi_xung_8diem(xc, yc, x, y); if (p < 0) p=p + 2*x + 3 else { p = p + 2*(x - y) + 5 ; y =y - 1; } x = x + 1; } } Giáo trình H a Máy Tính 26
  17. 2.3 Thu t toán MidPoint v Ellipse Xét ph ng trình elíp có tâm t i g c t a Áp d ng thu t toán MidPoint v ng tròn v elíp. Tính i x ng c a elíp là khi bi t t a mt im có th d dàng suy ra t a ba im i x ng v i nó qua các tr c Ox, Oy và góc t a . Vì elíp ch có tính ch t i x ng b n im nên ta ph i v m t ph n t c a elíp, sau ó m i l y i x ng v các ph n còn l i c a elíp. u tiên ta tìm ranh gi i hai mi n trong góc ph n t th nh t c a elíp Hình 2.7: Phân chia hai mi n ca elíp • V trí: im P là ti p im c a ti p tuy n có h s góc –1 • Xác nh: Véc t vuông góc v i ti p tuy n t i ti p im, giá tr gradient: • Ti P các thành ph n i và j c a véc t gradient có cùng l n. Ý t ng ca thu t toán là ánh giá hàm t i trung im hai t a pixel ch n v trí ti p theo v . D u c a nó cho bi t trung im nm trong hay ngoài elíp. Hình 2.8: Phân tích v hai mi n c a ellipse Giáo trình H a Máy Tính 27
  18. Xét mi n 1 • Tính bi n quy t nh ti trung im u tiên n u im ang xét là xp, y p: d = F(x, y) = F(x p + 1, y p - ) • Nu d < 0: ch n E, x tng 1, y không thay i. • Nu d 0: ch n SE , x tng 1, y gi m 1: Xét mi n 2: • T ng t , tính bi n quy t nh d = F(x, y ) = F(xp + , yp - 1) o Nu d < 0: ch n SE , x tng 1, y gi m 1. o Nu d 0: ch n S, x không t ng, y gi m 1. • Tìm s gia nh mi n 1, ta c: 2 o S = a (-2yp + 3) 2 2 o SE = b (2 xp + 2) + a (-2y + 3) Tìm giá tr kh i u c a s gia d: • Mi n 1: o Gi s a, b nguyên, im b t u v là (0, b) o Trung im th nh t: (1, b - 1/2) Giáo trình H a Máy Tính 28
  19. • Mi n 2: Ph thu c vào trung im ( xp + 1, y p - ) c a im ti p theo im cu i cùng c a mi n 1. Cài t minh h a thu t toán MidPoint v Elíp void Ve_doi_xung_4diem(int xc, int yc, int x, int y) { glVertex2i(x + xc, y + yc); glVertex2i(-x + xc, y + yc); glVertex2i(-x + xc, -y + yc); glVertex2i(-y + xc, x + yc); } void ellipse(int xc, int yc, int a, int b) { int x, y; float d1, d2; x=0; //{Kh i ng} y=b; d1=b 2-a2b+a 2/4; Ve_doixung_4diem(x, y); while (a 2(y-1/2)>b 2(x+1)) {Vùng 1} { Giáo trình H a Máy Tính 29
  20. If (d1 0) // {Vùng 2} { if (d2<0) //{ Chon SE } { d2=d2+b 2(2*x+2)+a 2(-2*y+3); x=x+1; y=y-1 } else { d2=d2+a 2(-2*y+3); y=y-1 } Ve_doixung_4diem(x, y); } } Giáo trình H a Máy Tính 30
  21. 2.4. ng cong tham s 2.4.1. ng cong Bezier 2.4.1.1. Thu t toán de Casteljau Thu t toán de Casteljau da trên dãy các im iu khi n xây d ng v i giá tr t trong on [0, 1] t ng ng v i m t im P(t). Do ó, thu t toán sinh ra m t dãy các im t các im iu khi n cho tr c. Khi các im iu khi n thay i, ng cong s thay i theo. Cách xây d ng ng cong da 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 cng a ra nhi u tính ch t quan tr ng ca ng cong. Parabol d a trên ba im 2 Trong m t ph ng R xét ba im P0, P 1, P 2. t 1 1 Trong ó, t ∈ [0, 1]. Nói cách khác, vi m i t ∈ [0, 1], các im P0 t)( , P1 t)( nm trên các on th ng P0P1 và P1P2 t ng ng. Hình 2.9: ư ng cong Bezier xác nh b i ba im iu khi n Giáo trình H a Máy Tính 31
  22. 1 1 Lp l i phép n i suy tuy n tính trên các im m i P0 t)( và P1 t)( ta c: 2 Qu tích c a P t :)( = P0 t)( khi t thay i trong on [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 im iu khi n P0(1, 0), P1(2, 2), P2(6, 0) là: Tng quát cho tr ng h p s im iu khi n 3 ta có: Thu t toán de Casteljau cho L + 1 im iu khi n 2 Trong m t ph ng R xét L+1 im P 0, P 1, , P L. Vi m i giá tr t cho tr c, ta xây L dng theo quy n p ng cong P0 t)( nh sau: r B c 1: [Kh i t o] t r = 0 và Pi t :)( =Pi vi m i i=0, 1, , L-r. B c 2: [Kt thúc?] Nu r = L dng ng c l i t B c 3: Thay r bi r+1 và chuy n sang b c 2. Cài t minh h a thu t toán Casteljau Point Casteljau(float t) Giáo trình H a Máy Tính 32
  23. { 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) ; } } Giáo trình H a Máy Tính 33
  24. 2.4.1.2. Thu t toán Horner a th c Bernstein và ng cong Bezier Cách ti p c n trong ph n tr c cho ta thu t toán hình h c v ng cong Bezier. Ph n này trình bày cách bi u di n gi i tích c a ng cong Bezier. Th t v y, d dàng ch ng minh r ng ng cong Bezier P(t) t ng ng các im iu khi n P 0, P 1, , P L, xác d nh b i: trong ó L   là a th c Bernstein, và   là t h p ch p k ca L ph n t . k  Ví d , t nh ngh a trên, ta có các a th c Bernstein b c ba: th minh h a c a b n a th c này khi t ∈ [0, 1]: Giáo trình H a Máy Tính 34
  25. Hình 2.10 . Các a th c Bernstein b c ba Ví d , ph ng trình tham s c a ng cong Bezier t ng ng b n im iu khi n P0(1, 0) , P1(2, 3) , P2(6, 0) , P3 (9, 2) có d ng: V ng cong Bezier qua a th c Bernstein Da vào l c Horner tính giá tr a th c Bernstein, ta xây d ng th t c xác nh ng cong Bezier hi u qu h n Casteljau. Mt ví d nhân lòng nhau c a l c Horner trong tr ng h p a th c b c ba: T ng t v i ng cong Bezier b c ba: Giáo trình H a Máy Tính 35
  26. trong ó, s = 1 – t. Nh n xét r ng: Do ó, ta có ch ng trình tính giá tr hàm Bezier P(t) trong tr ng h p t ng quát, vi NumVertices chính là s im iu khi n L+ 1. Cài t minh h a thu t toán Horner Point Horner_Bezier(float t) { int i, L_choose_i; float Fact, s; Point Q; s = 1.0 - t; Fact = 1.0; L_choose_i = 1; Q.x = P[0].x*s; Q.y = P[0].y*s; for(i = 1; i < L; i++) { Fact *= t; L_choose_i *= (L - i + 1)/i; Q.x = (Q.x + Fact*L_choose_i*P[i].x)*s; Q.y = (Q.y + Fact*L_choose_i*P[i].y)*s; } Q.x += Fact*t*P[L].x; Q.y += Fact*t*P[L].y; return(Q); } Giáo trình H a Máy Tính 36
  27. 2.4.2. ng cong B-Spline ng cong Bezier c iu khi n m t cách “toàn c c”, có ngh a là khi m t im iu khi n thay i thì toàn b ng cong c ng thay i theo. Trong th c t , ta mong mu n thay i m t on trên ng cong nh hình 2.11, tc là iu khi n m t cách a ph ng. iu này ng cong Bezier không th c hi n c. Do ó, ta c n tìm các a th c tr n l i (hàm tr n) mà v n gi tính ch t t t c a a th c Bernstein và các a th c này có giá tr ch a trong on [0, 1] ng i thi t k iu khi n ng cong theo mong mu n m t cách a ph ng. có th iu khi n hình d ng các hàm tr n, ta c n xây d ng các hàm liên t c Rk(t) là nh ng a th c t ng khúc. Do ó, Rk(t) trên m i kho ng (t i, t i+1 ] là mt a th c. Suy ra, ng cong P(t) là t ng các a th c t ng khúc v i tr ng l ng là các im iu khi n. Ch ng h n, trong kho ng nào ó thì ng cong có d ng: Hình 2.11: Thay i ư ng cong mong mu n Trong kho ng k ti p, ng cong c cho b i m t các a th c khác, và tt c các on cong này t o thành m t ng cong liên t c. ng cong này c g i là Giáo trình H a Máy Tính 37
  28. ng cong Spline . Trên m t h các hàm tr n, ta ch n xây d ng các hàm tr n có giá tr nh nh t và do ó iu khi n a ph ng t t nh t. Khi ó, ta g i ng cong này là B-Spline . Mi hàm B-Spline ph c thu c vào m và có b c m-1, chúng ta ký hi u Nk,m thay cho Rk(t). Do ó, ph ng trình ng cong B-Spline có d ng: Nh v y, xác nh ng cong B-Spline , ta c n: • Vector knot T = ( t0, t1, , ). • L +1 im iu khi n P0, P 1, , P L. • Bc m ca các hàm B-spline. Công th c xác nh hàm quy B-spline Nk,m vi k = 0, 1, , L, và Ví d , xét vector Knot T= (t0 = 0 , t1 = 1, t2 = 2, ) có kho ng cách gi a các Knot là 1. Khi ó: th c a hàm N0,2 (t) trên on [0, 2] là các a th c b c 1 và là mt tam giác vi các nh (0, 0), (1, 1) và (2, 0) . Giáo trình H a Máy Tính 38