TRƯỜNG ĐẠI HỌC CÔNG NGHIỆPKhoa Công Nghệ Thông Tin BÀI TẬP LỚN MÔN:Đồ Họa Máy Tính Đề Tài:”Cài đặt thuật toán Bresenham, MidPoint vẽ đường tròn và tô màu theo 2thuật toán : tô màu theo d
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP
Khoa Công Nghệ Thông Tin
BÀI TẬP LỚN MÔN:Đồ Họa Máy Tính
Đề Tài:”Cài đặt thuật toán Bresenham, MidPoint vẽ đường tròn và tô màu theo 2thuật toán : tô màu theo dòng quét và tô màu lân cận.Sử dụng các phép biến đổi:phép tịnh tiến, phép quay, phép co dãn, phép đối xứng qua điểm, phép kết hợp.”Giáo viên hướng dẫn:
Sinh viên thực hiện:
1 Dương Thị Hồng MSV:0641360273
2 Sái Hoàng Quân MSV: 0641360114
3 Nguyễn Thế Việt MSV: 0441060022
Trang 2Mục lục
Mục lục 2
CHƯƠNG I:KHẢO SÁT 4
1.1 Mục đich nghiên cứu: 4
1.2 Đối tượng nghiên cứu 4
CHƯƠNG II: PHÂN TÍCH 5
2.1Thuật toán vẽ đường tròn: 5
2.1.1 Thuật toán Bresenham: 5
2.1.2 Thuật toán MidPoint: 6
2.2 Thuật toán tô màu: 9
2.2.1 Theo dòng quét: 9
2.2.2 Tô màu lân cận: 10
2.3 Các phép biến hình 11
2.3.1Các phép biến hình cơ bản 11
2.3.2 Phép tịnh tiến 11
2.3.3Phép quay: 12
2.3.4 Phép co dãn: 16
2.3.5 Đối xứng qua điểm: 17
2.3.6 Kết hợp phép quay và phép biến đổi tỷ lệ 17
2.3.7 Kết hợp phép tịnh tiến và phép biến đổi tỉ lệ 18
CHƯƠNG III CÀI ĐẶT CHƯƠNG TRÌNH 19
Trang 3Lời nói đầu
Sự phát triển của khoa học, kĩ thuật, nghệ thuật, kinh doanh,
và công nghệ luôn luôn phụ thuộc vào khả năng truyền đạt thông tin của chúng ta, hoặc thông qua các bit dữ liệu lưu trữ trong
microchip hoặc thông qua giao tiếp bằng tiếng nói Câu châm ngôn từ xa xưa “một hình ảnh có giá trị hơn cả vạn lời" hay "trăm nghe không bằng một thấy" cho thấy ý nghĩa rất lớn của hình ảnh trong việc chuyển tải thông tin Hình ảnh bao giờ cũng được cảm nhận nhanh và dễ dàng hơn, đặc biệt là trong trường hợp bất
đồng về ngôn ngữ Do đó không có gì ngạc nhiên khi mà ngay từ khi xuất hiện máy tính, các nhà nghiên cứu đã cố gắng sử dụng nó
để phát sinh các ảnh trên màn hình Trong suốt gần 50 năm phát triển của máy tính, khả năng phát sinh hình ảnh bằng máy tính của chúng ta đã đạt tới mức mà bây giờ hầu như tất cả các máy tính đều có khả năng đồ họa
Đồ họa máy tính là một trong những lĩnh vực lí thú nhất và phát triển nhanh nhất của tin học Ngay từ khi xuất hiện, đồ họa máy tính đã có sức lôi cuốn mãnh liệt, cuốn hút rất nhiều người ở nhiều lĩnh vực khác nhau như khoa học, nghệ thuật, kinh doanh, quản lí, Tính hấp dẫn và đa dạng của đồ họa máy tính có thể được minh họa rất trực quan thông qua việc khảo sát các ứng dụng của nó
Qua quá trính học tập và tìm hiểu nhóm đã được giao đề tài
“Cài đặt thuật toán Bresenham,MidPoint vẽ đường tròn và tô màu theo 2 thuật toán : tô màu theo dòng quét và tô màu lân cận.Sử dụng các phép biến đổi: phép tịnh tiến, phép quay, phép co dãn, phép đối xứng qua điểm, phép kết hợp.”
Trang 4Do quá trình tìm hiểu còn nhiều thiếu xót nên chương trình còn nhiều hạn chế, nhóm thực hiện rât mong được ý kiến đóng góp từ phía cô giáo và các bạn để chương trình được hoàn thiện hơn.
CHƯƠNG I:KHẢO SÁT
1.1 Mục đich nghiên cứu:
- Củng cố kiến thức đã học.
- Rèn luyện kỹ thuật lập trình đồ họa
1.2 Đối tượng nghiên cứu
Đường tròn
Các thuật toán vẽ đường tròn và tô màu đường tròn
Trang 5CHƯƠNG II: PHÂN TÍCH
2.1Thuật toán vẽ đường tròn:
Xét đường tròn (C) tâm O(xc,yc) bán kính R
Phương trình tổng quát của đường tròn có dạng:
(-x,y), (-x,-y), (-y,-x), (y,-x), (x,-y) cũng ∈ (C)
Vì vay, ta chỉ cần vẽ một phần 8 cung tròn sau đó lấy đối xứng qua gốc O và 2 trục tọa độ thì ta có được toàn bộ đường tròn
2.1.1 Thuật toán Bresenham:
Giả sử (xi ,yi) đã vẽ được Cân chọn điểm kế tiếp là (xi +1,yi) hoac (xi +1,yi -1)(Hình 1.5)
Từ phương trình: x2 + y2 = R2
ta tính được giá trị y thực ứng với tọa độ xi +1 là:y2 = R2 - (xi +1)2
đặt d1 = yi2 - y2= yi2 - R2 + (xi + 1)
d2 = y2 - (yi - 1)2 = R2 - (xi + 1)2 - (yi - 1)2
suy ra
pi = d1 - d2 = 2.(xi + 1)2 + yi2 + (yi - 1)2 - 2R2 (2)
Từ (2) và (3) ta có:
pi+1 - pi = 4xi + 6 + 2.(yi+12 - yi2) - 2.(yi+1 - yi)
⇒pi+1 = pi + 4xi + 6 + 2.(yi+12 - yi2) - 2.(yi+1 - yi) (4)
Nhận xét:
Nêu pi < 0: chọn yi+1 = yi (4) ⇒ pi+1 = pi + 4xi + 6
Nêu pi ¿0: chọn yi+1 = yi - 1 (4) ⇒ pi+1 = pi + 4.(xi - yi) + 10
Ta chọn điểm đầu tiên cần vẽ (0,R), theo (2) ta có: p1 = 3 - 2R
Tóm lại ta có thuật toán vẽ đường tròn:
Bước 1 chọn điểm đầu cần vẽ: (x1,y1) = (0,R)
Bước 2 Tính P đầu tiên: p1 = 3 – 2R
Nêu p < 0: chọn điểm kê tiếp là (xi +1,yi) Ngược lại thì chọn điểm (xi + 1,yi - 1)
Bước 3 x:=x+1 tính lại p
Trang 6Nêu pi < 0: pi+1 = pi + 4xi + 6 Ngược lại: pi+1 = pi + 4.(xi - yi) + 10
Khi đó :
Nêu pi+1 < 0: chọn điểm kê tiêp là (xi+1,yi+1) Ngược lại chọn điểm (xi+1,yi+1-1)
Bước 4 lặp lại bước 3 cho đên khi x = y.
Sau đây là thủ tục để cài đặt thuật toán:
2.1.2 Thuật toán MidPoint:
Do tính đối xứng của đường tròn (C) nên ta chỉ cần vẽ cung (C1/8) là cung 1/8
xám trong hình vẽ) :
Trang 7Hình 2.16 – Các vị trí đối xứng trên đường tròn (C) tương ứng với (x,y)
Như vậy nếu có (x, y) Î (C1/8) thì các điểm : (y, x), (y,-x), (x,-y), x,-y), y,-x), y,x), (-x,y) sẽ thuộc (C)
và P
Như vậy :
Tương tự như thuật toán MidPoint vẽ đoạn thẳng, việc quyết định chọn một trong hai điểm S và P sẽ được thực hiện thông qua việc xét dấu của một hàm nào đó tại điểm MidPoint là điểm nằm giữa chúng
Hình 2.17 – Thuật toán MidPoint vẽ đường tròn
Trang 92.2 Thuật toán tô màu:
2.2.1 Theo dòng quét:
có thể là đa giác lồi, đa giác lõm, và cả đa giác tự cắt, …
Hình 2.18 sau minh họa ý tưởng chính của thuật toán Với mỗi dòng quét, ta sẽ xác định phần giao của đa giác và dòng quét rồi tô màu các pixel thuộc đoạn giao đó
Để xác định các đoạn giao ta tiến hành việc tìm giao điểm của dòng quét với các cạnh của đa giác, sau đó các giao điểm này sẽ được sắp theo thứ tự tăng dần của hoành độ giao điểm Các đoạn giao chính là các đoạn thẳng được giới hạn bởi từng cặp giao điểm một, ví dụ như (0,1), (2,3), …
Hình 2.18 – Thuật toán scan-line với một dòng quét nào đó
Ta có thể tóm bắt các bước chính của thuật toán :
giác
Sắp xếp các hoành độ giao điểm theo thứ tự tăng dần : x0, x1, …
Nếu chỉ dừng ở mức này và chuyển sang cài đặt, chúng ta sẽ gặp một số vấn đề sau :
Trang 10 Nhận xét rằng, ứng với mỗi dòng quét, không phải lúc nào tất cả các cạnh của đa giác cũng tham gia cắt dòng quét Do đó để cải thiện tốc độ cần phải
có một cách nào đó để hạn chế được số cạnh cần tìm giao điểm ứng với mỗi dòng quét
phức tạp như nhân, chia, … trên số thực nếu ta dùng cách giải hệ phương trình tìm giao điểm Điều này sẽ làm giảm tốc độ thuật toán khi phải lặp đi lặp lại nhiều lần thao tác này khi dòng quét quét qua đa giác
nhóm từng cặp giao điểm kế tiếp nhau để hình thành các đoạn tô có thể sẽ không chính xác Điều này chỉ xảy ra khi dòng quét đi ngang qua các đỉnh của đa giác Nếu tính số giao điểm tại đỉnh dòng quét đi ngang qua là hai thì
có thể sẽ cho kết quả tô không chính xác như trong trường hợp của hình 2.19 Ngoài ra, việc tìm giao điểm của dòng quét với các cạnh nằm ngang là một trường hợp đặc biệt cần phải có cách xử lí thích hợp
2.2.2 Tô màu lân cận:
Lây P(x,y) ∈ S, tô màu P
Xét các điểm lân cận của P
Nêu các điểm lân cận đó vẫn còn thuộc S và chưa được tô màu thì tô màu cho các điểm lân cận đó
Thuật toán trên có thê được minh học bằng thử tục đệ quy sau:
Procedure Tomaulancan(x,y:Integer; Color:Word);
Trang 11100 010 tlxtly0
Nếu gọi ttx và tty lần lượt là độ dời theo trục hoành và trục tung thì tọa độ của điểm mới Q(x’,y’) sau khi tịnh tiến điểm P(x,y) sẽ là:
Khi đó (ttx,tty) được gọi là vecto tịnh tiến hay độ dời
§ Ma trận biến đổi
Thuật toán cài đặt
void TinhTien(float &x,float &y,float ttx,float tty)
{
x=x+ttx;
Trang 12{x∗ ¿ x.cosα−y.sinα ¿¿¿¿
Trang 13Phép quay quanh một điểm
1800
Hình 3.3 – Phép quay một đối tượng quanh gốc tọa
độ một góc 60
Trang 14Phép quay quanh một điểm bất kỳ
Hình 3.3 : Phép quay quanh một điểm bất kỳ
Xét điểm P(P.x,P.y) quay quanh điểm V(V.x, V.y) một góc -0- đến điểm
Q(Q.x,Q.y) Ta có thể xem phép quay quanh tâm V được kết hợp từ phép các biến đổi cơ bản sau:
- Phép tịnh tiến (-V.x, -V.y) để dịch chuyển tâm quay về gốc tọa độ
- Quay quanh gốc tọa độ O một góc
-0 Phép tịnh tiến (+V.x, +V.y) để đưa tâm quay về vị trí ban đầu
Ta cần xác định tọa độ của điểm Q (xem hình 3.3)
- Từ phép tịnh tiến (-V.x,-V.y) biến đổi điểm P thành P' ta được:
P' = P + V
hay
- Phép quay quanh gốc tọa độ biến đổi điểm P' thành Q'
Q' = P'.M
Trang 15- Phép tịnh tiến (+V.x, +V.y) biến đổi điểm Q' thành Q ta được
Q = Q' + V
hay
Vậy Q = P.M + tr
Với
Thuật toán cài đặt
void Quay(float &x,float &y,float goc)
Trang 162.3.4 Phép co dãn:
và , ta nhân và lần lượt cho các tọa độ của P
, và được gọi là các hệ số tỉ lệ
Khi các giá trị , nhỏ hơn 1, phép biến đổi sẽ thu nhỏ đối tượng, ngược lại khi các giá trị này lớn hơn 1, phép biến đổi sẽ phóng lớn đối tượng Khi , bằng nhau, ta gọi đó là phép đồng dạng (uniform scaling), phép đồng dạng là phép biến đổi bảo toàn tính cân xứng của đối tượng
Tâm tỉ lệ là điểm không bị thay đổi qua phép biến đổi tỉ lệ Phép biến đổi tỉ lệ mô tảnhư trên còn gọi là phép biến đổi tỉ lệ quanh gốc tọa độ vì có tâm tỉ lệ là gốc tọa độ.Nhận xét rằng khi phép biến đổi tỉ lệ thu nhỏ đối tượng, đối tượng sẽ được dời về gần gốc tọa độ hơn, tương tự khi phóng lớn đối tượng, đối tượng sẽ được dịch chuyển xa gốc tọa độ hơn
Hình 3.2 – Phép biến đổi tỉ lệ với và
2.3.5 Đối xứng qua điểm:
Phép đối xứng tâm là phép biến hình biến điểm I thành chính nó, biến mỗi điểm M khác I thành M’ sao cho I là trung điểm của đoạn thẳng MM’
thức:
Trang 17Y’=2y- ym
2.3.6 Kết hợp phép quay và phép biến đổi tỷ lệ
Ta có điểm M biến đổi thành M1 qua phép biến đổi tỉ lệ T1 rồi từ M1 biến đổi
biến đổi
M T1 M1 T2- M2
Thuật toán cài đặt
void QuayTiLe(int n,float tlx,float tly, float goc)
Trang 182.3.7 Kết hợp phép tịnh tiến và phép biến đổi tỉ lệ
Ta có điểm M biến đổi thành M1 qua phép tịnh tiến T1 rồi từ M1 biến đổi thành M2 qua phép biến đổi tỉ lệ T2 Như vậy biến đổi điểm M thành M2 kết hợp của
2 phép biến đổi
M T1 M1 T2- M2
Thuật toán cài đặt
void TinhTien_BienDoiTiLe(int n, float ttx,float tty,float tlx,float tly)
Trang 19CHƯƠNG III CÀI ĐẶT CHƯƠNG TRÌNH
Trang 20{
xw1=x1;yw1=y1;xw2=x2;yw2=y2; }
void khungNhin(int x1,int y1,int x2, int y2) {
xv1=x1;yv1=y1;xv2=x2;yv2=y2; tlx=(xv2-xv1)/(xw2-xw1);
}
void veDen(float x, float y)
{
int xm = (int) (tlx*(x-xw1)+xv1); int ym = (int) (tly*(yw2-y)+yv1); lineto(xm,ym);
}
Trang 24{ 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); }
Trang 29Duongtron_BRE(xc,yc,r,3);
Trang 30
cout<<"nhap toa do tam I,xc:";cin>>xc;
cout<<"nhap toa do tam I,yc:";cin>>yc;
cout<<"nhap ban kinh duong tron:";cin>>r;
duongtron_midpoint(xc,yc,r,12);
MylabelDT1:;
cout<<" ban hay chon phep bien doi"<<endl<<endl;
cout<<" 1.tinhtien 2.quay 3.codan 4.doixungquadiem 5.kh_tinhtientyle 6.kh_tylequay 7.exit 8.tieptuc:=";
cin>>m;