LỜI MỞ ĐẦU Đồ họa máy tính đượ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.. Đầu tiên kỹ thuật đồ họa được phát triển bởi các nhóm kỹ sư sử dụng máy tính lớn.. Ngày na
Trang 1LỜI MỞ ĐẦU
Đồ họa máy tính đượ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 Đầu tiên kỹ thuật đồ họa được phát triển bởi các nhóm kỹ sư sử dụng máy tính lớn Trong giai đoạn đầu của sự phát triển người ta phải tốn nhiều tiền cho việc trang bị các thiết bị phần cứng Ngày nay, nhờ vào sự tiến bộ của vi
xử lý, giá thành của máy tính càng lúc càng phù hợp với túi tiền của người sử dụng trong khi các kỹ thuật ứng dụng đồ họa của nó ngày càng cao hơn nên có nhiều người quan tâm nghiên cứu đến lĩnh vực này Chúng ta có thể vẽ ra những hình ảnh không chỉ là ảnh tĩnh mà còn có thể biến đổi thành những hình ảnh sinh động qua các phép quay, tịnh tiến Do vậy, đồ họa máy tính trở thành một lĩnh vực lý thú và có nhiều ứng dụng trong thực tế
Với mong muốn cho các mọi người hiểu một phần nào về môn ĐHMT này,
nhóm chúng em đã “ Cài đặt thuật toán Bresenham vẽ đường tròn, ellip và
thuật toán tô màu tràn”
Với sự giúp đỡ rất nhiệt tình của thầy PGS.TS Ngô Quốc Tạo chúng em đã
hoàn thành đề tài này Tuy nhiên chương trình này không tránh khỏi những hạn chế và thiếu xót Vì vậy nhóm thực hiện chúng em rất mong được sự giúp đỡ, đóng góp của thầy cô và bạn bè để chương trình được hoàn thiện và phong phú hơn
Chúng em xin chân thành cảm ơn!
Trang 3Phát Biểu Bài Toán:
- Cài đặt thuật toán Bresenham cho:
Đường tròn tâm (xc,yc) bán kính R: (x-xc)2 + (y-yc)2= R2
Đường elip tâm (0,0) bán kính dài là a, rộng là b:
(x2 / a2 ) + (y2/ b2 ) = 1
- Cài đặt thuật toán tô màu tràn:
Thuật Giải:
- Cài đặt thuật toán Bresenham cho đường tròn
Xét đường tròn tâm (xc,yc) bán kính R: (x-xc)2 + (y-yc)2 = R2
- Đường tròn có tính đối xứng nên ta chỉ cần vẽ 1/8 cung tròn và lấy đối xứng
Hình 1 : Vẽ hình tròn.
Thuật toán Bresenham:
• Giả sử đường cong được xấp xỉ thành các điểm lần lượt là (xi,yi) Các điểm này có tọa độ nguyên và được hiển thị trên màn hình
Trang 4• Bài toán đặt ra là nếu biết được tọa độ (xi,yi) của bước thứ i, thì điểm ở bước i +1 là (xi+1,yi+1) sẽ được xác định như thế nào ?
• Trong trường hợp này, chúng ta có xi+1=xi+1 và yi+1=yi hay yi+1=yi-1
• Phương trình đường tròn tâm (xc,yc) bán kính R: (x-xc)2 + (y-yc)2= R2
• Đặt d1= (yi)2 – y2 và d2= y2 - (yi-1)2,
• Đặt Pi = d1 – d2 do đó việc chọn tọa độ của yi+1 phụ thuộc vào dấu của Pi :
Hình 2 : xác định và vẽ các tọa độ
• d1= (yi)2 – y2 = (yi)2 - (R2 – (xi + 1)2 )
• d2= y2 - (yi-1)2 = (R2 – (xi + 1)2 ) - (yi-1)2
• Xét pi = (d1 - d2) = (yi)2 + (yi-1)2 - 2 (R2 – (xi + 1)2 )
• Tính pi+1 – pi = 4xi + 6 +2((yi-1)2 - (yi)2 )-2(yi+1 -yi)
• Từ đây, ta suy ra cách tính pi+1 theo pi:
– pi+1= pi + 4xi + 6+2((yi-1)2 - (yi)2 )-2(yi+1 -yi)
• Xác định dấu của pi thì ta xác định được yi+1
– Nếu pi<0 thì yi+1=yi khi đó pi+1 = pi + 4xi + 6
– Nếu Pi >= 0 thì yi+1=yi-1 nên pi+1 = pi + 4(xi –yi) + 10
• Giá trị p đầu tiên được tính tại (x1, y1) = (0,R) là p1 = 3-2R
Trang 5Hình 3: Sơ đồ thuật toán
+ Chương trình thuật toán Bresenham:
• Bresenham_Circle(int xc, int yc, int R, int color)
• {
• int x, y, p;
• x = 0;
• y = R;
• p = 3 - 2 * R;
• while (x <= y)
Trang 6• {
• putpixel(xc + x, yc + y, color);
• putpixel(xc - x, yc + y, color);
• putpixel(xc + x, yc - y, color);
• putpixel(xc - x, yc - y, color);
• putpixel(xc + y, yc + x, color);
• putpixel(xc - y, yc + x, color);
• putpixel(xc + y, yc - x, color);
• putpixel(xc - y, yc - x, color);
• if (p < 0)
• p = p + 4 * x + 6;
• else
• {
• p = p + 4 * (x-y) + 10;
• y ;
• }
• x++;
• }
• }
- Tóm lại thuật toán Bresenham vẽ đường tròn:
• Xác định d1 và d2 sao cho d1 là độ lệch từ y đến điểm hiện hành yi
• Xác định dấu của pi với pi = (d1 – d2)
• Tính pi+1 theo pi theo 2 trường hợp pi < 0 và pi >= 0
• Tính p1 với (x1, y1) = (0,R) là: p1 = 3-2R
- Thuật toán Bresenham vẽ đường elip:
+ Cài đặt thuật toán Bresenham cho đường Elip:
Trang 7Xét Đường elip tâm (0,0) bán kính dài là a, rộng là b:
x2/a2+y2/b2=1
Đường Elip có tính đối xứng nên ta chỉ cần vẽ ¼ cung Elip và lấy đối xứng trục
Trong đó chia thành 2 vùng :
* Vùng 1:
- Biến quyết định p
- Nếu p < 0 : Chẵn E, x tăng 1, y không thay đổi
- Nếu p >= 0 : Chẵn SE, x tăng 1, y giảm 1
* Vùng 2: ta chỉ thay đổi vai trò của x và y
- Nếu p < 0: Chẵn SE, x tăng 1, y giảm 1
- Nếu p >= 0: Chẵn S, x không tăng, y giảm 1
Hình 4 : ¼ cung Elip
- Thuật Toán Bresenham:
• Xét Đường elip tâm (0,0) bán kính dài là a, rộng là b:
x2 / a2 + y2/ b2 = 1
• Đặt d1= (yi)2 – y2 và d2= y2 - (yi-1)2,
• Đặt Pi = d1 – d2 do đó việc chọn tọa độ của yi+1 phụ thuộc vào dấu của Pi :
Trang 8Hình 5 : xác định và vẽ các tọa độ
• Xét pi = (d1 - d2) =( (yi)2 – y2 )-(y2 - (yi-1)2 )
• Tính pi+1 – pi = 2((yi+1 )2 - (yi)2 )- 2(yi+1 -yi) + (2b2 /a2 )*(2xi +3)
• Từ đây, ta suy ra cách tính pi+1 theo pi:
pi+1= pi + 2((yi+1 )2 - (yi)2 )- 2(yi+1 -yi) + (2b2 /a2 )*(2xi +3)
• Xác định dấu của pi thì ta xác định được yi+1 và pi+1
• - Nếu pi < 0 thì yi+1=yi khi đó pi+1 = pi + (2b2 /a2 )*(2xi +3)
• - Nếu Pi >= 0 thì yi+1=yi-1 nên pi+1 = pi + (2b2 /a2 )*(2xi +3) +4(1-yi)
• Giá trị pi đầu tiên ở vùng 1 (x1, y1) = (0,b) là p1 = 2b2 /a2 – 2b+1
*Thuật toán Bresenham vẽ vùng 1
p1=2b2/a2–2b+1
T1=(2b2/a2)*(2xi+3)
T2=(2b2/a2)*(2xi+3)+4(1-yi)
Z1=(b2/a2)
A = Z1*(x/y)
Trang 9Hình 6 : Sơ đồ thuật toán
+Chương trình thuật toán Bresenham:
• void Bre_Ellipse(int xc,int yc,int a,int b,int color)
• {
• /* ve khi x tang deu va y giam cham */
Trang 10• long v=(long)b*b;
• while(u*y>v*x)
• { if(p>=0)
• }
• /* ve khi y tang deu va x giam cham */
• while(u*y<=v*x)
• {
Trang 11• p+=uv*(2*y+3);
• }
• }
•
+Thuật toán tô màu tràn:
Vùng được định nghĩa bởi màu của pixel, chia làm 3 phần:
- Vùng trong (interior)
- Vùng ngoài (exterior)
- Biên vùng liên tục (boundary)
Hình 7 : vùng tô màu
Liên thông 4 và liên thông 8
+ Liên thông 4 : 2 pixel liên thông với nhau nếu chúng kề nhau theo
chiều ngang hay chiều dọc
+ Liên thông 8 : 2 pixel liên thông với nhau nếu chúng kề nhau theo chiều ngang, hay chiều dọc, hay đường chéo
Trang 12Cách thức định nghĩa (pixel-defined region)
- Interior defined
Tất cả các pixel trong vùng có cùng một màu, gọi là inside-color
Các pixel trên biên không có màu này
Có thể có lỗ trong vùng
- Boundary defined
Các pixel thuộc biên có cùng màu – boundary-color
Các pixel trong vùng không có màu này
Nếu một số pixel trong vùng có màu boundary-color thì vùng sẽ chứa lỗ
Trang 13Đổi màu của tất cả các interior-pixel thành màu tô – fill color.
Quá trình tô màu bắt đầu từ một điểm (seed pixel) thuộc phía trong vùng
tô và lan truyền khắp vùng tô => Flood-Fill
Trang 14+Thuật toán:
- Nếu pixel tại (x,y) thuộc vùng trong – màu của pixel đó là inside-color thì đổi màu của nó thành fill-color
- Áp dụng quá trình trên cho 4 điểm lân cận nó (4-connected)
- Ngược lại, không làm gì
+Thuật toán FloodFill:
void FloodFill(int x, int y, int inside_color, int fill_color)
{
Trang 15putpixel(x,y,fill_color);
FloodFill(x-1,y, inside_color, fill_color);
FloodFill(x+1,y, inside_color, fill_color);
FloodFill(x,y+1, inside_color, fill_color);
FloodFill(x,y-1, inside_color, fill_color);
} }
Trang 16Tài liệu tham khảo
[1] Giáo trình DHMT thầy Ngô Quốc Tạo
[2] Giáo Trình Đồ Họa Máy Tính, Auth: Dương Anh Đức
[3] Computer Graphics, Auth: Francis S Hill, Jr 1990 (Vol I & II)
………
Trong thời gian ngắn, chúng em vừa tìm hiểu tài liệu , tìm hiểu ngôn ngữ, nên chắc chắn còn nhiều thiếu sót Nhưng trong thời gian tới, em sẽ hoàn thiện kĩ thuật và đưa ra một trương trình hoàn hảo.Em xin chân thành cảm ơn thầy đã tận tụy hướng dẫn và giúp đỡ em hoàn tất đề tài này.
Em Xin Chân Thành Cám Ơn!
Đ5- CNTT, Epu.Edu.Vn
Hà Nội, Ngày 06 tháng 06 năm 2013