Bài giảng đồ họa : Các thuật toán vẽ đường part 4 ppsx

5 572 6
Bài giảng đồ họa : Các thuật toán vẽ đường part 4 ppsx

Đang tải... (xem toàn văn)

Thông tin tài liệu

ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 16/22 • Chọn điểm bắt đầu để vẽ là điểm (0,R). • Dựa vào hình vẽ, nếu ( ) ii y x , là điểm nguyên đã tìm được ở bước thứ i, thì điểm ( ) 11 , ++ ii y x ở bước thứ (i+1) là sự lựa chọn giữa S và P. • Như vậy : { }    −∈ += + + 1, 1 1 1 iii ii yyy xx • Đặt ( ) 222 , RyxyxF −+= , ta có : ( ) ( ) ( ) ( )      > = < tròn. đường ngoài nằm yx, nếu,0 tròn đường trên nằm yx, nếu,0 tròn đường trong nằm yx, nếu,0 , yxF S P MidPoint y i y i -1 x i x i +1 Q(x i +1, y) ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 17/22 • Xét ( )       −+== 2 1 ,1MidPoint iii yxFFp . Ta có : ♦ Nếu 0 < i p , điểm MidPoint nằm trong đường tròn. Lúc này điểm thực Q gần S hơn nên ta chọn S, tức là ii y y = +1 . ♦ Ngược lại, nếu 0 ≥ i p , điểm MidPoint nằm ngoài đường tròn. Lúc này điểm thực Q gần P hơn nên ta chọn P, tức là 1 1 − = + ii y y . • Mặt khác :       −+−       −+=− +++ 2 1 ,1 2 1 ,1 111 iiiiii yxFyxFpp ( ) ( )         −       −++−         −       −++=−⇔ +++ 2 2 2 2 2 1 2 11 2 1 1 2 1 1 RyxRyxpp iiiiii ( ) ( ) iiiiiii yyyyxpp −−−++=−⇔ +++ 1 22 11 32 • Vậy : ♦ 3 2 1 + + = + iii x p p , nếu 0 < i p do ta chọn ii y y = +1 . ♦ 5 2 2 1 + − + = + iiii y x p p , nếu 0 ≥ i p do ta chọn 1 1 −= + ii y y . • 0 p ứng với điểm ban đầu ( ) ( ) R y x , 0 , 00 = . RRFyxFp −=       −=       −+= 4 5 2 1 ,1 2 1 ,1 000 ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 18/22 Lưu đồ thuật toán MidPoint vẽ đường tròn Begin p=5/4-R; x=0; y=R; Put8Pixel(x, y, c); x<y Yes No p<0 Yes p=p+2*x+3; No p=p+2(x-y)+5; y=y-1 x=x+1; Put8Pixel(x,y,c); End ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 19/22 Cài đặt minh họa thuật toán MidPoint vẽ đường tròn void CircleMidPoint (int R) { int x, y; x = 0; y = R; Put8Pixel(x, y); p = 1 - R; // 5/4-R while (x < y) { if (p < 0) p += 2*x + 3; else { p += 2*(x -y) + 5; y ; } x++; Put8Pixel(x, y); } } // CircleMidPoint ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 20/22 • Ví dụ : Vẽ đường tròn tâm I(0,0), bán kính R=15. i i x x i i y y I I p p i i D D e e l l t t a a 1 1 D D e e l l t t a a 2 2 0 0 0 0 1 1 5 5 - - 1 1 4 4 1 1 - - 1 1 5 5 3 3 - - 2 2 5 5 1 1 1 1 1 1 5 5 - - 1 1 1 1 - - 1 1 4 4 + + 2 2 * * ( ( 0 0 ) ) + + 3 3 5 5 - - 2 2 3 3 2 2 2 2 1 1 5 5 - - 6 6 - - 1 1 1 1 + + 2 2 * * ( ( 1 1 ) ) + + 3 3 7 7 - - 2 2 1 1 3 3 3 3 1 1 5 5 1 1 - - 6 6 + + 2 2 * * ( ( 2 2 ) ) + + 3 3 9 9 - - 1 1 9 9 4 4 4 4 1 1 4 4 - - 1 1 8 8 1 1 + + 2 2 * * ( ( 3 3 - - 1 1 5 5 ) ) + + 5 5 1 1 1 1 - - 1 1 5 5 5 5 5 5 1 1 4 4 - - 7 7 - - 1 1 8 8 + + 2 2 * * ( ( 4 4 ) ) + + 3 3 1 1 3 3 - - 1 1 3 3 6 6 6 6 1 1 4 4 6 6 - - 7 7 + + 2 2 * * ( ( 5 5 ) ) + + 3 3 1 1 5 5 - - 1 1 1 1 7 7 7 7 1 1 3 3 - - 5 5 6 6 + + 2 2 ( ( 6 6 - - 1 1 4 4 ) ) + + 5 5 1 1 7 7 - - 7 7 8 8 8 8 1 1 3 3 1 1 2 2 - - 5 5 + + 2 2 ( ( 7 7 ) ) + + 3 3 1 1 9 9 - - 5 5 9 9 9 9 1 1 2 2 7 7 1 1 2 2 + + 2 2 ( ( 8 8 - - 1 1 3 3 ) ) + + 5 5 2 2 1 1 - - 1 1 1 1 0 0 1 1 0 0 1 1 1 1 6 6 7 7 + + 2 2 ( ( 9 9 - - 1 1 2 2 ) ) + + 5 5 2 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 0 0 9 9 6 6 + + 2 2 ( ( 1 1 0 0 - - 1 1 1 1 ) ) + + 5 5 2 2 5 5 7 7 Nhận xét : • Nếu đặt Delta1 = 2*x+3, Delta2 = 2*(x-y)+5 thì ♦ Do mỗi bước đều tăng x nên sau mỗi lần lặp giá trò Delta1 luôn tăng 2. ♦ Do y bò giảm 1 khi gặp p≥0 và giữ nguyên giá trò trong trường hợp ngược lại nên nếu lần lặp trước giá trò p≥0 thì giá trò Delta2 sẽ được tăng 4 và nếu lần lặp trước giá trò p<0 thì giá trò Delta2 sẽ được tăng 2 mà thôi. • Hãy tối ưu hóa cài đặt thuật toán MidPoint vẽ đường tròn từ nhận xét trên. . −=       −=       −+= 4 5 2 1 ,1 2 1 ,1 000 ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 18/22 Lưu đồ thuật toán MidPoint vẽ đường tròn Begin p=5 /4- R; x=0; y=R; Put8Pixel(x,. c); x<y Yes No p<0 Yes p=p+2*x+3; No p=p+2(x-y)+5; y=y-1 x=x+1; Put8Pixel(x,y,c); End ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 19/22 Cài đặt minh họa thuật toán MidPoint vẽ đường tròn void CircleMidPoint (int R) { int. R=15. i i x x i i y y I I p p i i D D e e l l t t a a 1 1 D D e e l l t t a a 2 2 0 0 0 0 1 1 5 5 - - 1 1 4 4 1 1 - - 1 1 5 5 3 3 - - 2 2 5 5 1 1 1 1 1 1 5 5 - - 1 1 1 1 - - 1 1 4 4 + + 2 2 * * ( ( 0 0 ) ) + + 3 3 5 5 - - 2 2 3 3 2 2 2 2 1 1 5 5 - - 6 6 - - 1 1 1 1 + + 2 2 * * ( ( 1 1 ) ) + + 3 3 7 7 - - 2 2 1 1 3 3 3 3 1 1 5 5 1 1 - - 6 6 + + 2 2 * * ( ( 2 2 ) ) + + 3 3 9 9 - - 1 1 9 9 4 4 4 4 1 1 4 4 - - 1 1 8 8 1 1 + + 2 2 * * ( ( 3 3 - - 1 1 5 5 ) ) + + 5 5 1 1 1 1 - - 1 1 5 5 5 5 5 5 1 1 4 4 - - 7 7 - - 1 1 8 8 + + 2 2 * * ( ( 4 4 ) ) + + 3 3 1 1 3 3 - - 1 1 3 3 6 6 6 6 1 1 4 4 6 6 - - 7 7 + + 2 2 * * ( ( 5 5 ) ) + + 3 3 1 1 5 5 - - 1 1 1 1 7 7 7 7 1 1 3 3 - - 5 5 6 6 + + 2 2 ( ( 6 6 - - 1 1 4 4 ) ) + + 5 5 1 1 7 7 - - 7 7 8 8 8 8 1 1 3 3 1 1 2 2 - - 5 5 + + 2 2 ( ( 7 7 ) ) + + 3 3 1 1 9 9 - - 5 5 9 9 9 9 1 1 2 2 7 7 1 1 2 2 + + 2 2 ( ( 8 8 - - 1 1 3 3 ) ) + + 5 5 2 2 1 1 - - 1 1 1 1 0 0 1 1 0 0 1 1 1 1 6 6 7 7 + + 2 2 ( ( 9 9 - - 1 1 2 2 ) ) + + 5 5 2 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 0 0 9 9 6 6 + + 2 2 ( ( 1 1 0 0 - - 1 1 1 1 ) ) + + 5 5 2 2 5 5 7 7 Nhận

Ngày đăng: 23/07/2014, 21:20

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan