Bài giảng Đồ họa máy tính

ĐỊNH NGHĨA ĐỒ HỌA MÁY TÍNH

Dùng máy tính để tạo ra hình ảnh

Đồ họa máy tính và xử lý ảnh

– Đồ họa máy tính: tạo hình ảnh dựa trên đặc tả hoặc

mô hình

– Xử lý ảnh: nâng cao chất lƣợng hoặc chỉnh sửa hình

ảnh.

pdf 361 trang phuongnguyen 7360
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Đồ họa máy tính", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Đồ họa máy tính

Bài giảng Đồ họa máy tính
ĐỒ HỌA MÁY TÍNH 
Trƣờng Đại Học Bách Khoa TP Hồ Chí Minh 
Khoa Khoa học & Kỹ thuật Máy tính 
CHƢƠNG 1: 
GIỚI THIỆU ĐỒ HỌA 
MÁY TÍNH 
Slide 2 Faculty of Computer Science and Engineering - HCMUT 
NỘI DUNG TRÌNH BÀY 
Giới thiệu tổng quan về đồ họa máy tính 
Đối tƣợng cơ bản trong đồ họa máy tính 
Thiết bị hiển thị đồ họa 
Slide 3 Faculty of Computer Science and Engineering - HCMUT 
CHƢƠNG TRÌNH 
Nội dung 
Chƣơng 1-Giới thiệu đồ họa máy tính 
Chƣơng 2-Bƣớc đầu tạo dựng hình ảnh 
Chƣơng 3-Xây dựng công cụ vẽ hình ảnh 
Chƣơng 4-Vector trong đồ họa máy tính 
Chƣơng 5-Biến đổi hình 
Chƣơng 6-Mô hình hóa đối tƣợng 3 D bằng lƣới đa giác 
Chƣơng 7-Phép nhìn trong không gian ba chiều 
Chƣơng 8-Tô màu vật thể ba chiều 
Chƣơng 9-Kỹ thuật lặp đệ quy, ứng dụng tạo hoa văn 
Chƣơng 10-Đồ họa raster 
Slide 4 Faculty of Computer Science and Engineering - HCMUT 
TÀI LIỆU MÔN HỌC 
 [1] Francis S. Hill, Jr, Computer Graphics, Macmillan Publishing 
Company, 1990. 
 [2] Foley, van Dam, Feiner, Hughes, Computer Graphics principles and 
practice, Addison-Wesley Publishing Company, 1996. 
 [3] Nguyễn Hữu Lộc, Đồ họa máy tính và mô hình hóa hình học, Nhà 
xuất bản thành phố Hồ Chí Minh, 2000. 
 [4] Hoàng Kiếm, Dƣơng Anh Đức, Lê Đình Huy, Vũ Hải Quân, Cơ sở 
đồ họa máy tính, Nhà xuất bản giáo dục, 2000. 
 [5] Nguyễn Quốc Cƣờng, Hoàng Đức Hải, Đồ họa vi tính, Nhà xuất bản 
giáo dục, 1998. 
 [6] Tống Nghĩa, Hoàng Đức Hải, Đồ họa máy tính trong ngôn ngữ C, Nhà 
xuất bản giáo dục, 1999. 
 [7] Nguyễn Tiến, Ngô Quốc Việt, Giáo trình đồ họa máy tính, Nhà xuất 
bản thống kê, 2001. 
 [8] Lê Tấn Hùng, Huỳnh Quyết Thắng, Kỹ thuật đồ họa, Nhà xuất bản 
Khoa học và Kỹ thuật, 2004 
  Graphics 
Slide 5 Faculty of Computer Science and Engineering - HCMUT 
ĐỊNH NGHĨA ĐỒ HỌA MÁY TÍNH 
Dùng máy tính để tạo ra hình ảnh 
Đồ họa máy tính và xử lý ảnh 
– Đồ họa máy tính: tạo hình ảnh dựa trên đặc tả hoặc 
mô hình 
– Xử lý ảnh: nâng cao chất lƣợng hoặc chỉnh sửa hình 
ảnh. 
Slide 6 Faculty of Computer Science and Engineering - HCMUT 
ỨNG DỤNG CỦA ĐỒ HỌA MÁY TÍNH 
Ứng dụng trong giải trí, xuất bản và nghệ thuật 
– Sản xuất phim hoạt hình, tạo hiệu ứng cho phim nhựa 
– Trò chơi máy tính 
– Duyệt Web 
– Chế bản điện tử 
Xử lý ảnh 
Ứng dụng trong tự động hóa và điều khiển 
Mô phỏng 
Máy tính hỗ trợ thiết kế 
– Hỗ trợ thiết kế kiến trúc 
– Hỗ trợ thiết kế mạch điện tử 
Hình ảnh hóa số liệu khoa học 
Slide 7 Faculty of Computer Science and Engineering - HCMUT 
ĐỐI TƢỢNG CƠ BẢN TRONG ĐHMT 
Đƣờng gấp khúc (polyline) 
Văn bản (text) 
Vùng tô (filled region) 
Ảnh ma trận điểm hay ảnh raster (raster image) 
Slide 8 Faculty of Computer Science and Engineering - HCMUT 
ĐƢỜNG GẤP KHÖC 
Đƣờng gấp khúc là một tập các đoạn thẳng đƣợc nối với 
nhau. 
Đƣờng gấp khúc đƣợc dùng mô phỏng đƣờng cong. 
Các hàm liên quan 
– Vẽ điểm: drawDot(x1, y1) 
– Vẽ đoạn thẳng: drawLine(x1, y1, x2, y2) 
– Vẽ đƣờng gấp khúc: drawPolyline(poly) 
Slide 9 Faculty of Computer Science and Engineering - HCMUT 
ĐƢỜNG GẤP KHÖC 
Khi đỉnh đầu và đỉnh cuối đƣợc nối bằng một đoạn thẳng 
thì đƣờng gấp khúc trở thành đa giác 
Slide 10 Faculty of Computer Science and Engineering - HCMUT 
ĐƢỜNG GẤP KHÖC 
Thuộc tính 
– Màu sắc 
– Độ dày 
– Kiểu đƣờng (liền nét, đứt nét) 
– Cách nối hai cạnh dày 
Thiết lập thuộc tính: 
 setDash (dash7) hoặc setLineThickness(thickness). 
Slide 11 Faculty of Computer Science and Engineering - HCMUT 
VĂN BẢN 
Một số thiết bị có hai chế độ hiển thị 
– Chế độ hiển thị văn bản 
– Chế độ hiển thị đồ họa 
Thủ tục hiển thị chuỗi 
– drawString(x, y, string); 
Thuộc tính 
– Font 
– Màu sắc 
– Kích thƣớc 
– Hƣớng 
– Khoảng cách giữa các ký tự trong chuỗi 
Slide 12 Faculty of Computer Science and Engineering - HCMUT 
VĂN BẢN 
Slide 13 Faculty of Computer Science and Engineering - HCMUT 
VÙNG TÔ 
Hình đƣợc tô bởi màu hoặc mẫu tô. Đƣờng biên thƣờng 
là hình đa giác. 
Thủ tục : fillPolygon(poly, pattern); 
Slide 14 Faculty of Computer Science and Engineering - HCMUT 
VÙNG TÔ 
Dùng vùng tô để mô phỏng các mặt khác nhau của vật 
thể tô màu 
Slide 15 Faculty of Computer Science and Engineering - HCMUT 
ẢNH RASTER 
Đƣợc tạo bởi các pixel 
Lƣu trữ dƣới dạng mảng các giá trị 
Phƣơng pháp tạo ảnh raster 
– Thiết kế thủ công 
– Tạo bằng thuật toán 
– Quét 
Ảnh raster có thể tiến hành xử lý 
Slide 16 Faculty of Computer Science and Engineering - HCMUT 
THIẾT BỊ HIỂN THỊ ĐỒ HỌA 
Thiết bị đồ họa vector: tạo hình ảnh từ những đoạn 
thẳng 
– Ƣu điểm: nhanh 
– Khuyết điểm: không tô màu cho vùng đƣợc 
Các loại thiết bị vector thƣờng gặp 
– Máy vẽ: 
• Máy vẽ flatbed 
• Máy vẽ dạng trống 
– Màn hình vector 
Slide 17 Faculty of Computer Science and Engineering - HCMUT 
THIẾT BỊ HIỂN THỊ ĐỒ HỌA 
Thiết bị raster: Tạo hình ảnh từ ma trận điểm 
Phân loại: 
– Màn hình video 
– Màn hình tấm phẳng 
– Các thiết bị sao chép cứng 
• Máy in film (film recorder) 
• Máy in laser 
• Máy in phun 
Slide 18 Faculty of Computer Science and Engineering - HCMUT 
THIẾT BỊ RASTER 
Các vấn đề cần tìm hiểu 
– Bề mặt hiển thị 
– Bộ đệm frame 
– Quá trình quét dòng 
Bề mặt hiển thị (display surface) 
Slide 19 Faculty of Computer Science and Engineering - HCMUT 
THIẾT BỊ RASTER 
Bộ đệm frame 
CPU Bộ nhớ hệ 
thống 
Bộ đệm 
Bộ điều khiển 
quét dòng 
Bộ chuyển đổi 
Bus hệ thống 
Bề mặt hiển thị 
Slide 20 Faculty of Computer Science and Engineering - HCMUT 
THIẾT BỊ RASTER 
Quá trình quét dòng 
Slide 21 Faculty of Computer Science and Engineering - HCMUT 
THIẾT BỊ RASTER 
Màn hình video màu 
Slide 22 Faculty of Computer Science and Engineering - HCMUT 
THIẾT BỊ RASTER 
Màu chỉ mục và bảng tìm kiếm 
Slide 23 Faculty of Computer Science and Engineering - HCMUT 
THIẾT BỊ RASTER 
Màu chỉ mục và bảng tìm kiếm 
Slide 24 Faculty of Computer Science and Engineering - HCMUT 
THIẾT BỊ RASTER 
Màn hình tấm phẳng 
CHƢƠNG 2: 
BƢỚC ĐẦU TẠO HÌNH ẢNH 
Trƣờng Đại Học Bách Khoa TP Hồ Chí Minh 
Khoa Khoa học & Kỹ thuật Máy tính 
Slide 26 Faculty of Computer Science and Engineering - HCMUT 
NỘI DUNG TRÌNH BÀY 
Xây dựng chƣơng trình đồ họa. 
Thành phần cơ bản trong một chƣơng trình sử dụng 
OpenGL. 
Vẽ điểm, vẽ đoạn thẳng, vẽ đƣờng gấp khúc, vẽ hình 
chữ nhật. 
Giao tiếp với chuột và bàn phím. 
Một số ứng dụng. 
Slide 27 Faculty of Computer Science and Engineering - HCMUT 
XÂY DỰNG CHƢƠNG TRÌNH ĐỒ HỌA 
Môi trƣờng lập trình 
– Phần cứng: màn hình, card đồ họa. 
– Phần mềm: hệ điều hành (Window), ngôn ngữ lập 
trình (MS Visual C++), thƣ viện đồ họa (OpenGL, 
Direct X). 
Trình tự xây dựng chƣơng trình đồ họa 
– Thiết lập chế độ hiển thị (văn bản, đồ họa) 
– Thiết lập hệ trục tọa độ 
– Sử dụng các hàm của môi trƣờng lập trình để tạo 
dựng hình ảnh. 
Slide 28 Faculty of Computer Science and Engineering - HCMUT 
THIẾT LẬP TRỤC TỌA ĐỘ 
Môi trƣờng lập trình DOS 
Môi trƣờng lập trình Window 
(100, 50) 
(150, 80) 
(0, 290) 
Slide 29 Faculty of Computer Science and Engineering - HCMUT 
SỬ DỤNG CÁC HÀM ĐỂ XÂY DỰNG HÌNH ẢNH 
Hàm do hệ điều hành và ngôn ngữ lập trình cung cấp: 
– setPixel(x, y, color) 
 tên khác: putPixel(), SetPixel() hoặc drawPoint() 
– line(100, 50, 150, 80); 
 line(150, 80, 0, 290); 
Hàm do thƣ viện đồ họa cung cấp. 
Hàm tự xây dựng. 
Slide 30 Faculty of Computer Science and Engineering - HCMUT 
THÀNH PHẦN CƠ BẢN CỦA CT SỬ DỤNG OpenGL 
OpenGL là thƣ viện lập trình đồ họa độc lập thiết bị 
– Không phụ thuộc vào phần cứng và hệ điều hành 
– Cách làm thống nhất cho cả đồ họa 2D và 3D 
Lập trình Window 
– Lập trình sự kiện là gì? 
– Hàng đợi sự kiện (event queue). 
– Callback function. 
– Đăng ký hàm xử lý sự kiện: 
• glutDisplayFunc(myDisplay) 
• glutReshapeFunc(myReshape) 
• glutMouseFunc(myMouse) 
• glutKeyboardFunc(myKeyboard) 
Slide 31 Faculty of Computer Science and Engineering - HCMUT 
THÀNH PHẦN CƠ BẢN CỦA CT SỬ DỤNG OpenGL 
// phần #include những file header cần thiết - xem phụ lục 1 
void main(int argc, char** argv) 
{ 
 glutInit(&argc, argv); //initialize the tool kit 
 glutInitDisplayMode(GLUT_SINGLE |GLUT_RGB);//set the display 
 mode 
 glutInitWindowSize(640, 480); //set window size 
 glutInitWindowPosition(100, 150); // set window position on screen 
 glutCreateWindow("My first program"); // open the screen window 
 // register the callback function 
 glutDisplayFunc(myDisplay); 
 myInit(); //additional initialization as necessary 
 glutMainLoop(); 
} 
Slide 32 Faculty of Computer Science and Engineering - HCMUT 
THÀNH PHẦN CƠ BẢN CỦA CT SỬ DỤNG OpenGL 
 Thiết lập hệ trục tọa độ 
void myInit() 
{ 
 glMatrixMode(GL_PROJECTION); 
 glLoadIdentity(); 
 gluOrtho2D(0.0, 640.0, 0.0,480.0); 
} 
Slide 33 Faculty of Computer Science and Engineering - HCMUT 
VẼ ĐIỂM 
glBegin(GL_POINTS); 
 glVertex2i(100, 50); 
 glVertex2i(100, 130); 
 glVertex2i(150, 130); 
glEnd(); 
My first program 
glVertex2i(...) 
thư 
viện 
gl 
phần cơ 
bản của 
tên hàm 
số lượng 
đối số 
kiểu của 
đối số 
Slide 34 Faculty of Computer Science and Engineering - HCMUT 
VẼ ĐIỂM 
Trạng thái trong OpenGL 
– glColor3f(1.0, 0.0, 0.0); // đổi màu vẽ thành màu đỏ 
– glClearColor(1.0,1.0,1.0,0.0);// set white background 
color 
– glPointSize(4.0); 
– glLineWidth(2.0); 
Slide 35 Faculty of Computer Science and Engineering - HCMUT 
VẼ ĐIỂM 
 Một chƣơng trình hoàn chỉnh 
int main(int argc, char* argv[]) 
{ 
 glutInit(&argc, argv); //initialize the tool kit 
 glutInitDisplayMode(GLUT_SINGLE |GLUT_RGB);//set the display 
mode 
 glutInitWindowSize(640, 480); //set window size 
 glutInitWindowPosition(100, 150); // set window position on screen 
 glutCreateWindow("My first program"); // open the screen window 
 glutDisplayFunc(myDisplay);// register redraw funtion 
 myInit(); 
 glutMainLoop();// go into a perpetual loop 
 return 0; 
} 
Slide 36 Faculty of Computer Science and Engineering - HCMUT 
VẼ ĐIỂM 
void myInit() 
{ 
 glClearColor(1.0,1.0,1.0,0.0);// set white background color 
 glColor3f(0.0f, 0.0f, 0.0f); // set the drawing color 
 glPointSize(4.0); // a ‘dot’ is 4 x 4 pixels 
 glMatrixMode(GL_PROJECTION); 
 glLoadIdentity(); 
 gluOrtho2D(0.0, 640.0, 0.0, 480.0); 
} 
Slide 37 Faculty of Computer Science and Engineering - HCMUT 
VẼ ĐIỂM 
void myDisplay() 
{ 
 glClear(GL_COLOR_BUFFER_BIT); // clear the screen 
 glBegin(GL_POINTS); 
 glVertex2i(100, 50); // draw three points 
 glVertex2i(100, 130); 
 glVertex2i(150, 130); 
 glEnd(); 
 glFlush(); // send all output to display 
} 
Slide 38 Faculty of Computer Science and Engineering - HCMUT 
MỘT SỐ VÍ DỤ 
Vẽ chòm sao Đại Hùng: 
 {Dubhe, 289, 190}, {Merak, 320, 128}, {Phecda, 239, 67}, 
{Megrez, 194, 101}, {Alioth, 129, 83}, {Mizar, 75, 73}, 
{Alcor, 74, 74}, {Alkaid, 20, 10} 
Slide 39 Faculty of Computer Science and Engineering - HCMUT 
MỘT SỐ VÍ DỤ 
Vẽ Sierpinski gasket 
P3 
P2 
P1 
T0 
T2 
T1 
Slide 40 Faculty of Computer Science and Engineering - HCMUT 
MỘT SỐ VÍ DỤ 
 Vẽ Sierpinski gasket 
1. Chọn 3 điểm cố định T0, T1, T2 để tạo nên một tam giác. Lƣu ý 
rằng chúng ta không vẽ 3 điểm này lên màn hình 
2. Chọn điểm khởi đầu p0. Điểm p0 đƣợc chọn ngẫu nhiên trong số 3 
điểm T0, T1, T2. Sau đó vẽ p0. 
 Lặp lại những bƣớc sau cho đến khi đạt đƣợc một kết quả vừa ý 
3. Chọn một điểm bất kỳ trong số 3 điểm T0, T1, T2. Gọi điểm đó là T. 
4. Tạo điểm tiếp theo (pk ) bằng cách lấy điểm trung điểm của đoạn 
thẳng nối T và điểm trƣớc đó (pk-1 ). Tức là : pk = điểm giữa của 
pk-1 và T 
5. Dùng hàm drawDot() để vẽ pk. 
Slide 41 Faculty of Computer Science and Engineering - HCMUT 
MỘT SỐ VÍ DỤ 
 Vẽ Sierpinski gasket 
void Sierpinski() 
{ 
 GLintPoint T[3]={{10, 10}, {300, 30}, {200, 300}} ; 
 int index = random(3) ; 
 GLintPoint point = T[index] ; 
 glClear(GL_COLOR_BUFFER_BIT); 
 drawDot(point.x, point.y) ; 
 for(int i=0; i<1000;i++) 
 { 
 index = random(3); 
 point.x = (point.x + T[index].x) / 2; 
 point.y = (point.y + T[index].y) / 2; 
 drawDot(point.x, point.y) ; 
 } 
 glFlush(); 
} 
Slide 42 Faculty of Computer Science and Engineering - HCMUT 
MỘT SỐ VÍ DỤ 
class GLintPoint{ 
 public : 
 GLint x, y ; 
} ; 
int random(int m) 
{ 
 return rand() % m ; 
} 
void drawDot(GLint x, GLint y) 
{ //vẽ một điểm ở tọa độ (x, y) 
 glBegin(GL_POINTS); 
 glVertex2i(x, y); 
 glEnd(); 
} 
Slide 43 Faculty of Computer Science and Engineering - HCMUT 
VẼ ĐOẠN THẲNG 
 glBegin(GL_LINES); 
 glVertex2i(40, 100); 
 glVertex2i(202, 96); 
 glEnd(); 
 void drawLineInt(GLint x1, GLint y1, GLint x2, GLint y2) 
 { 
 glBegin(GL_LINES); 
 glVertex2i(x1, y1); 
 glVertex2i(x2, y2); 
 glEnd(); 
 } 
 glBegin(GL_LINES); 
 glVertex2i(10, 20);// vẽ đoạn thẳng thứ nhất 
 glVertex2i(40, 20); 
 glVertex2i(20, 10);// vẽ đoạn thẳng thứ hai 
 glVertex2i(20, 40); 
 thêm 4 lời gọi hàm glVertex2i()để vẽ hai đoạn thẳng còn lại 
 glEnd(); 
a) đoạn thẳng mỏng b) đoạn thẳng dày c) đoạn thẳng đứt nét 
Slide 44 Faculty of Computer Science and Engineering - HCMUT 
VẼ ĐƢỜNG GẤP KHÖC 
 p0 = (x0, y0), p1 = (x1, y1), ..., pn = (xn, yn) 
 glBegin(GL_LINE_STRIP); //vẽ đường gấp khúc mở 
 glVertex2i(20, 10); 
 glVertex2i(50, 10); 
 glVertex2i(20, 80); 
 glVertex2i(50, 80); 
 glEnd(); 
a) b) 
 GL_LINE_LOOP 
vẽ đường gấp khúc khép kín 
Slide 45 Faculty of Computer Science and Engineering - HCMUT 
VÍ DỤ 
 void hardwirededHouse() 
{ 
 glBegin(GL_LINE_LOOP);//vẽ khung ngôi nhà 
 glVertex2i(40, 40); 
 glVertex2i(40, 90); 
 glVertex2i(70, 120); 
 glVertex2i(100, 90); 
 glVertex2i(100, 40); 
 glEnd(); 
 glBegin(GL_LINE_STRIP);//vẽ ống khói 
 glVertex2i(50, 100); 
 glVertex2i(50, 120); 
 glVertex2i(60, 120); 
 glVertex2i(60, 110); 
 glEnd(); 
 . . . // vẽ cửa ra vào 
 . . . // vẽ cửa sổ 
} 
120 40 
120 
40 
Slide 46 Faculty of Computer Science and Engineering - HCMUT 
VÍ DỤ 
 void parameterizedHouse(GLintPoint peak,GLint width,GLint 
height) 
 // tọa độ của nóc nhà là peak, 
 // chiều cao, chiều rộng của ngôi nhà là height và width 
 { 
 glBegin(GL_LINE_LOOP); 
 glVertex2i(peak.x, peak.y); 
 glVertex2i(peak.x + width/2,peak.y – 3*height/8); 
 glVertex2i(peak.x + width/2,peak.y – height); 
 glVertex2i(peak.x - width/2,peak.y – height); 
 glVertex2i(peak.x - width/2,peak.y – 3*height/8); 
 glEnd(); 
 vẽ ống khói 
 vẽ cửa ra vào 
 vẽ cửa sổ 
 } 
Slide 47 Faculty of Computer Science and Engineering - HCMUT 
VÍ DỤ 
Slide 48 Faculty of Computer Science and Engineering - HCMUT 
VẼ ĐƢỜNG GẤP KHÖC 
 class GLintPointArray 
 { 
 const int MAX_NUM = 100; 
 public: 
 int num ; 
 GLintPoint pt[MAX_NUM] ; 
 }; 
 void drawPolyLine(GLintPointArray poly,int closed) 
 { 
 glBegin(closed ? GL_LINE_LOOP : GL_LINE_STRIP); 
 for(int i=0;i<poly.num;i++) 
 glVertex2i(poly.pt[i].x, poly.pt[i].y); 
 glEnd(); 
 glFlush(); 
 } 
Slide 49 Faculty of Computer Science and Engineering - HCMUT 
VẼ ĐOẠN  ... edure SetPixel(c : col, r : row, value : color); {load frame buffer} 
function GetPixel(c : col, r : row) : color; {read frame buffer} 
procedure SetPixelWord(c : col, r : row, value : word); 
function GetPixel(c : col, r : row) : word; 
0 MaxColumn 1 2 
0 
1 
2 
Moâ hình laäp trình 
‟ Moâ hình cho frame buffer 
‟ Caùc thao taùc leân frame buffer. 
MaxRow 
Slide 326 Faculty of Computer Science and Engineering - HCMUT 
Thuaät toaùn veõ ñoaïn thaúng 
Yeâu caàu 
‟ Ñi qua 2 ñieåm ñaàu muùt cuûa ñoaïn thaúng 
‟ Ñoä saùng ñoàng ñeàu, trôn 
‟ Ñöôøng thaúng coù ñoä doác khaùc nhau phaûi coù ñoä 
saùng nhö nhau 
‟ Giaûi thuaät phaûi coù tính laëp laïi (duøng ñeå xoùa 
ñöôøng thaúng) 
‟ Khoâng phuï thuoäc vaøo caùc choïn ñieåm baét ñaàu 
veõ 
Slide 327 Faculty of Computer Science and Engineering - HCMUT 
Giaûi thuaät DD_Line 
 Procedure DD_Line(row1,col1,row2,col2,color:integer); 
 {Giaû söû ñoä doác naèm giöõa [-1,1], col1<= col2} 
 var 
 dx, dy, y, m: real; 
 x: integer; 
 begin 
 dx:= col2-col1; 
 dy:= row2 – row1; 
 m:= dy/dx; 
 y:= row1; 
 for x:=col1 to col2 do 
 begin 
 SetPixel(x, Round(y),color); 
 y:= y + m; 
 end; 
 end; 
Slide 328 Faculty of Computer Science and Engineering - HCMUT 
Thuaät toaùn Bresenham 
Nhöõng haïn cheá cuûa giaûi thuaät DD_Line 
– Chaäm vì söû duïng haøm Round 
– Khoâng chính xaùc khi khoaûng caùch giöõa 2 ñieåm ñaàu 
muùt lôùn 
– Ñoä saùng khoâng ñoàng ñeàu 
Thuaät toaùn Bresenham 
– Chæ duøng soá nguyeân 
– Thuoäc vaøo lôùp giaûi thuaät incremental (xaùc ñònh toïa ñoä 
cuûa ñieåm hieän haønh döïa vaøo toïa ñoä cuûa ñieåm tröôùc) 
Slide 329 Faculty of Computer Science and Engineering - HCMUT 
Cho ñoaïn thaúng noái hai ñieåm (x
a
 , y
a
) vaø (x
b
 , y
b
), 
– caùc toïa ñoä ñeàu laø soá nguyeân (toïa ñoä trong frame buffer) 
Bieåu dieãn töôøng minh cuûa ñöôøng thaúng: 
– Ñoä doác: , vôùi 
Baøi toaùn: Xaùc ñònh caùc pixel bieåu dieãn ñoaïn thaúng “toát” nhaát 
– tuøy thuoäc vaøo caùch ñònh nghóa sai soá 
Wlog (without loss of generality), x
a
 < x
b
 vaø 0 < m < 1 
– X taêng töø a ñeán b 
– X taêng nhanh hôn y 
– Moãi laàn x taêng leân 1, y khoâng taêng hoaëc taêng leân 1 
Bieåu dieãn ñoaïn thaúng trong frame buffer 
y = m(x - x
a
) + y
a
x
y
m
Dy = y
b
 - y
a
Dx = x
b
 - x
a
Slide 330 Faculty of Computer Science and Engineering - HCMUT 
Sai soá khi choïn pixel 
Sinh caùc pixel baèng phöông phaùp taêng daàn 
Ñònh nghóa sai soá e(Ti) = y* - yi - 1 
e(S
i
) = (y
i - 1
 + 1) - y* 
x
i - 1 
x
i
y
i - 1 
S
i
T
i
Ñoaïn thaúng lyù töôûng 
y
*
Slide 331 Faculty of Computer Science and Engineering - HCMUT 
Quy taéc choïn pixel xaáp xæ toát ñoaïn thaúng thöïc 
Quy taéc choïn pixel 
Tính e(T
i
) - e(S
i
) = 2m(x
i
 - x
a
) + 2(y
a
 - y
i - 1
) - 1 
Töø treân, ñeå chæ tính vôùi soá nguyeân, ñònh nghóa 
e
i
 = Dx(e(T
i
) - e(S
i
)) 
 = 2(Dy)(x
i
 - x
a
) + 2(Dx)(y
a
 - y
i - 1
) - Dx (*) 
Choïn T
i
 neáu vaø chæ neáu e(T
i
) - e(S
i
) < 0 
Neáu e
i
 < 0 thì choïn y
i
 = y
i - 1
 , neáu khoâng thì choïn y
i
 = y
i - 1
 + 1
Caàn kieåm tra tính ñuùng ñaén cuûa quy taéc treân! 
Slide 332 Faculty of Computer Science and Engineering - HCMUT 
Kieåm tra tính ñuùng ñaén cuûa quy taéc choïn pixel 
Tröôøng hôïp ñoaïn thaúng lyù töôûng ñi qua giöõa S
i
 vaø T
i
x
i - 1
 x
i
y
i - 1
S
i
T
i
Ñoaïn thaúng lyù töôûng 
e(T
i
) = y* - y
i - 1 
e(S
i
) = (y
i - 1
 + 1) - y* 
y
*
Slide 333 Faculty of Computer Science and Engineering - HCMUT 
Kieåm tra tính ñuùng ñaén cuûa quy taéc choïn pixel (tieáp) 
Caùc tröôøng hôïp coøn laïi 
xi 1 xi 
yi 1 
Si 
Ti 
xi 1 xi 
yi 1 
Si 
Ti 
Nhaéc laïi: e(T
i
) = y* y
i 1 
 e(S
i
) = (y
i 1 + 1) y* 
ñoaïn thaúng lyù töôûng 
ñi qua phía treân S
i
 vaø T
i 
ñoaïn thaúng lyù töôûng 
ñi qua phía döôùi S
i
 vaø T
i 
e(T
i
) >= 0
e(S
i
) <= 0 
e(T
i
) <= 0
e(S
i
) >= 0 
Slide 334 Faculty of Computer Science and Engineering - HCMUT 
Tính sai soá moät caùch höõu hieäu 
Töø 
 suy ra e
i + 1
 = 2(Dy)(x
i + 1
 - x
a
) + 2(Dx)(y
a
 - y
i 
) ‟ Dx 
 Töø treân, e
i + 1
 = e
i
 + 2(Dy)(x
i + 1
 - x
i
) - 2(Dx)(y
i
 - y
i - 1 
) 
 Theo quy taéc choïn pixel, 
‟ neáu e
i
 < 0 thì choïn y
i
 = y
i - 1
 e
i + 1
 = e
i
 + 2Dy 
‟ neáu khoâng thì choïn y
i
 = y
i - 1 
+ 1 
 e
i + 1
 = e
i
 + 2Dy - 2Dx 
e
i
 = 2(Dy)(x
i
 - x
a
) + 2(Dx)(y
a
 - y
i - 1
) - Dx 
Slide 335 Faculty of Computer Science and Engineering - HCMUT 
Giaûi thuaät cuûa Bresenham 
Bieåu dieãn ñoaïn thaúng trong frame buffer 
‟ Giaûi thuaät baét ñaàu nhö theá naøo? 
„ x
0
 = x
a
, y
0
 = y
a
„ Töø (*) coù e
1
 = 2(Dy) - Dx (duøng x
1
 - x
a
 = 1) 
procedure Bresenham(xa, xb : col; ya, yb : row; col_val : color); 
{veõ ñoaïn thaúng coù maøu laø col_val töø (xa, ya) ñeán (ya, yb)} 
{wlog, xa < xb vaø 0 < ñoä doác cuûa ñoaïn thaúng < 1} 
var 
 x : col; 
 y : row; 
 dx, dy, 
 e_inc, {thay ñoåi cuûa sai soá khi y taêng} 
 e_noinc, {thay ñoåi cuûa sai soá khi y khoâng taêng} 
 e : integer; {sai soá hieän thôøi} 
Slide 336 Faculty of Computer Science and Engineering - HCMUT 
Giaûi thuaät cuûa Bresenham (tieáp) 
begin 
 y := ya; 
 dx := xb - xa; 
 dy := yb - ya; 
 e_noinc := dy + dy; {2dy} 
 e := e_noinc - dx; {e1=2dy-dx} 
 e_inc := e - dx; {2dx-dy} 
 for x := xa to xb do {voøng laëp chính} 
 begin 
 SetPixel(x, y, col_val); 
 if e < 0 then e := e + e_noinc; 
 else begin 
 y := y + 1; 
 e := e + e_inc 
 end; 
 end; 
end; {Bresenham} 
Slide 337 Faculty of Computer Science and Engineering - HCMUT 
Caùc tröôøng hôïp khaùc 
 Giaûi thuaät Bresenham giaû söû x
a
 > x
b
 vaø 0 < m < 1. 
Giaûi quyeát caùc tröôøng hôïp coøn laïi: 
x
a
 > x
b
 (ñoåi vò trí hai ñaàu muùt) 
m > 1 (ñoåi vai troø cuûa x vaø y) 
Ñoä doác aâm: -1 < m < 0 (thay dy baèng ‟dy) 
m < -1 (thay dx baèng ‟dx, ñoåi vai troø cuûa x vaø y) 
Ñoaïn thaúng ñöùng vaø ñoaïn thaúng naèm ngang 
Slide 338 Faculty of Computer Science and Engineering - HCMUT 
Bieåu dieãn voøng troøn trong frame buffer 
Baøi toaùn: Xaùc ñònh caùc pixel bieåu dieãn voøng troøn y2 = 
R
2
 ‟ x2 “toát” nhaát 
‟ tuøy thuoäc vaøo caùch ñònh nghóa sai soá 
Giaûi quyeát 
‟ Do ñoái xöùng, chæ caàn khaûo saùt caùch veõ khi 0 x 
sao cho y(x) x töùc laø cung AB. 
‟ Sinh caùc pixel baèng phöông phaùp taêng daàn 
(incremental). 
Slide 339 Faculty of Computer Science and Engineering - HCMUT 
Ñoái xöùng treân voøng troøn 
Giaûm phí toån tính toaùn baèng caùch duøng pheùp ñoái 
xöùng treân voøng troøn 
‟ Chæ caàn xaùc ñònh caùc pixel töông öùng vôùi moät 
cung laø 1/8 voøng troøn, ôû ñaây choïn cung AB. 
(x, y) 
(y, x) 
(y, x) 
( x, y) (x, y) 
( y, x) 
( y, x) 
( x, y) 
x 
y 
A 
B 
Slide 340 Faculty of Computer Science and Engineering - HCMUT 
Sai soá khi choïn pixel 
Giaû söû coù pixel toát nhaát taïi böôùc thöù i - 1 laø P
i - 1
 = 
(x
i - 1
, y
i - 1
) 
Ñònh nghóa 
 S
i
 = (x
i - 1
 + 1, y
i - 1
) 
 T
i
 = (x
i - 1
 + 1, y
i - 1
 - 1) 
Ñònh nghóa sai soá 
 e(P) = (x
2
 + y
2
) - R
2 
Ñònh nghóa haøm soá quyeát ñònh 
 d
i
 = e(S
i
) + e(T
i
) 
xi 
1 
xi 
yi 1 
Pi 1 Si 
Ti 
Slide 341 Faculty of Computer Science and Engineering - HCMUT 
Qui taéc choïn pixel xaáp xæ toát cung voøng troøn 
 xi 
1 
xi 
yi 1 
Pi 1 Si 
Ti 
Neáu d
i
 < 0 thì choïn S
i 
coøn neáu khoâng thì choïn T
i 
Caàn kieåm tra tính ñuùng ñaén cuûa quy taéc treân! 
Slide 342 Faculty of Computer Science and Engineering - HCMUT 
Kieåm tra tính ñuùng ñaén cuûa quy taéc choïn pixel 
Nhaéc laïi: d
i
 = e(S
i
) + e(T
i
) 
Tröôøng hôïp: d
i
 < 0 (S
i 
gaàn ñöôøng troøn hôn)
Si Si Si 
Ti Ti 
Ti 
e(Si) > 0 
e(Ti) < 0 
e(Si) > 0 
e(Ti) > 0 
e(Si) < 0 
e(Ti) < 0 
OK! OK, vì di < 0 
 S
i
 gaàn ñöôøng troøn hôn
Khoâng theå! 
Slide 343 Faculty of Computer Science and Engineering - HCMUT 
Kieåm tra tính ñuùng ñaén cuûa quy taéc choïn pixel (tieáp) 
Nhaéc laïi: d
i
 = e(S
i
) + e(T
i
) 
Tröôøng hôïp: d
i
 0 (T
i
 gaàn ñöôøng troøn hôn)
Si Si Si 
Ti Ti 
Ti 
e(Si) > 0 
e(Ti) < 0 
e(Si) > 0 
e(Ti) > 0 
e(Si) < 0 
e(Ti) < 0 
Khoâng theå! OK!
OK, vì d
i
 0 
 T
i
 gaàn ñöôøng troøn hôn 
Slide 344 Faculty of Computer Science and Engineering - HCMUT 
Tính haøm soá quyeát ñònh moät caùch höõu hieäu 
Nhaéc laïi: e(P) = (x2 + y2) - R2 
Coù theå chöùng minh ñöôïc (baøi taäp): 
 d
i + 1
 = d
i
 + 4 x
i - 1
 + 6 + 2(y
i
2
 - y
i - 1
2
) - 2(y
i
 - y
i - 1
) 
 Theo quy taéc choïn pixel 
‟ neáu d
i
 < 0 thì ta coù y
i
 = y
i - 1 
, do ñoù choïn T
i
 d
i + 1
 = d
i
 + 4 x
i - 1
 + 6 
‟ neáu khoâng thì y
i
 = y
i - 1
 - 1, do ñoù choïn S
i
 d
i + 1
 = d
i
 + 4(x
i - 1
 - y
i - 1
) + 10 
Giaûi thuaät baét ñaàu nhö theá naøo? 
 x
0
 = 0, y
0
 = R 
 do ñoù S
1
 = (1, R) vaø T
1
 = (1, R - 1), vaäy 
 d
1
=e(S
1
) + e(T
1
) =(1
2
+R
2
-R
2
)+(1
2+
(R-1)
2
-R
2)=
3 - 2R 
Slide 345 Faculty of Computer Science and Engineering - HCMUT 
Giaûi thuaät cuûa Michener 
Bieåu dieãn voøng troøn trong frame buffer 
procedure MichCirc(xc : col; yc : row; Rad : integer; value : color); 
{Veõ voøng troøn coù taâm (xc, yc), baùn kính Rad, vaø maøu value} 
var 
 x : col; 
 y : row; 
 d : integer; 
begin 
 x := 0; y := Rad; 
 d := 3 - 2*Rad; 
Slide 346 Faculty of Computer Science and Engineering - HCMUT 
Giaûi thuaät cuûa Michener (tieáp) 
 while x <= y do begin 
 SetPixel(xc + x, yc + y, value); {draw 8 points } 
 SetPixel(xc - x, yc + y, value); {based on (x, y)} 
 SetPixel(xc + x, yc - y, value); 
 SetPixel(xc - x, yc - y, value); 
 SetPixel(xc + y, yc + x, value); 
 SetPixel(xc - y, yc + x, value); 
 SetPixel(xc + y, yc - x, value); 
 SetPixel(xc - y, yc - x, value); 
 if d < 0 then d := d + 4*x + 6 {update error term} 
 else begin 
 d := d + 4*(x - y) + 10; 
 y := y - 1 
 end; 
 x := x + 1 
 end 
end; {MichCirc} 
Slide 347 Faculty of Computer Science and Engineering - HCMUT 
Ñònh nghóa vuøng 
Ñònh nghóa vuøng baèng pixel 
Ñònh nghóa vuøng baèng ña giaùc 
Slide 348 Faculty of Computer Science and Engineering - HCMUT 
Định nghĩa vùng bằng pixel 
 Dựa trên màu của các pixel 
 Hai cách định nghĩa tính kết nối: 
– 4-connected: 2 điểm ảnh được xem là kết nối nếu 
chúng nằm kề nhau theo chiều ngang hay chiều dọc 
– 8-connected: 2 điểm ảnh được xem là kết nối nếu 
chúng nằm kề nhau theo chiều ngang, chiều dọc hay 
đường chéo 
 Hai cách xác định vùng bởi: 
– Tất cả các điểm ảnh trong vùng có cùng 1 màu, có thể 
có lỗ trống (hole) bên trong. 
– Vùng được xác định bởi các điểm ảnh có cùng màu của 
đường bao quanh, các điểm ảnh bên trong không có 
màu bao, có thể có lỗ trống bên trong 
Slide 349 Faculty of Computer Science and Engineering - HCMUT 
Ví duï 
Slide 350 Faculty of Computer Science and Engineering - HCMUT 
Giải thuật tô màu tràn đệ qui 
 Dùng trong các phần mềm đồ họa 
 Vùng xác định bởi 1 màu và 4-connected 
 Bắt đầu bằng bởi 1 điểm hạt giống (seed) nằm bên trong vùng cần tô 
procedure FloodFill(x : col; y : row; int_color, new_color : color); 
{bắt đầu từ điểm (x,y), đổi từ màu int_color sang new_color} 
begin 
 if GetPixel(x, y) = int_color then 
 begin 
 SetPixel(x, y, new_color); 
 FloodFill(x – 1, y, int_color, new_color); 
 FloodFill(x + 1, y, int_color, new_color); 
 FloodFill(x, y + 1, int_color, new_color); 
 FloodFill(x, y – 1, int_color, new_color); 
 end 
end; 
Slide 351 Faculty of Computer Science and Engineering - HCMUT 
Giải thuật tô màu tràn đệ qui (tt.) 
 Vùng xác định bởi 1 màu và 8-connected 
 Bắt đầu bằng bởi 1 điểm hạt giống (seed) nằm bên trong vùng 
cần tô 
 Thêm: 
 FloodFill(x – 1, y – 1, int_color, new_color); 
 FloodFill(x – 1, y + 1, int_color, new_color); 
 FloodFill(x + 1, y + 1, int_color, new_color); 
 FloodFill(x + 1, y – 1, int_color, new_color); 
. Nhược điểm: 
 - bị lặp lại nhiều lần 
 - dễ bị tràn stack 
Slide 352 Faculty of Computer Science and Engineering - HCMUT 
Giải thuật tô màu tràn đệ qui (tt.) 
 Vùng xác định bởi màu bao và 4-connected 
 Bắt đầu bằng bởi 1 điểm hạt giống (seed) nằm bên trong vùng cần tô 
procedure FloodFill(x : col; y : row; int_color, new_color : color); 
{bắt đầu từ điểm (x,y), đổi từ màu int_color sang new_color} 
begin 
 if (GetPixel(x, y) >< new_color) then 
 begin 
 SetPixel(x, y, new_color); 
 FloodFill(x – 1, y, int_color, new_color); 
 FloodFill(x + 1, y, int_color, new_color); 
 FloodFill(x, y + 1, int_color, new_color); 
 FloodFill(x, y – 1, int_color, new_color); 
 end 
end; 
Slide 353 Faculty of Computer Science and Engineering - HCMUT 
Run of Pixels 
 Giaû thieát caùc pixel laø 4-connected 
 Giaûi thuaät 
 Push address of seed pixel on the stack; 
 while stack not empty do 
 Pop the stack to provide the next seed; 
 Fill in the run defined by the seed; 
 Examine the row above for runs reachable from this run; 
 Push the address of the rightmost pixels of each such 
run; 
 Do the same for the row below the current run; 
 end; 
Slide 354 Faculty of Computer Science and Engineering - HCMUT 
Ví duï 
Slide 355 Faculty of Computer Science and Engineering - HCMUT 
Ví duï 
D 
C 
Slide 356 Faculty of Computer Science and Engineering - HCMUT 
Ví duï 
J 
I 
G 
F 
C 
Slide 357 Faculty of Computer Science and Engineering - HCMUT 
Tô màu vùng đa giác 
Xét từng dòng ngang trên bộ đệm màn hình: 
– Tìm các giao điểm của dòng với tất cả các cạnh của 
đa giác 
– Sắp xếp các giao điểm theo chiều tăng dần giá trị x 
– Tô các điểm ảnh nằm giữa các cặp giao điểm 
Slide 358 Faculty of Computer Science and Engineering - HCMUT 
Tô màu vùng đa giác 
 Cạnh nằm ngang không cần phải xử lý 
 Tính chẵn lẻ không còn đúng khi ở điểm mút không phải là cực trị 
địa phương. 
– Cách giải quyết: dịch điểm đầu mút của một cạnh xuống 1 pixel 
Slide 359 Faculty of Computer Science and Engineering - HCMUT 
Tô màu vùng đa giác 
 Active Edge List (AEL) lợi dụng tính lân cận của cạnh 
– những cạnh cắt bởi scanline y sẽ cắt bởi scanline y+1 
– giá trị x của giao điểm có thể dự đoán trước 
 type 
 edge_ptr = ^edge_info 
 edge_info = record 
 y_upper : row; 
 x_int : real; 
 recip_slope : real; 
 next : egde_ptr; 
 end; 
Slide 360 Faculty of Computer Science and Engineering - HCMUT 
Tô màu vùng đa giác 
 update AEL cho scanline y+1 
– xóa tất cả những cạnh có y_upper < new_y 
– thay đổi x_value bằng cách cộng thêm recip_slope 
– có thể thêm vào cạnh mới có y_lower = new_y 
– thứ tự của giao điểm có thể bị xáo trộn, nên phải sắp 
xếp lại 
Slide 361 Faculty of Computer Science and Engineering - HCMUT 
Tô màu vùng đa giác 
 Xây dựng bảng cạnh: edge_table: array [row] of edge_ptr 

File đính kèm:

  • pdfbai_giang_do_hoa_may_tinh_chuong_1_gioi_thieu_do_hoa.pdf