Đồ họa máy tính - Các thuật toán vẽ đường pps

8 1.5K 23
Đồ họa máy tính - Các thuật toán vẽ đường pps

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

Thông tin tài liệu

TH- ðỒ HỌA MÁY TÍNH 1 GVHD: Huynh Duc Nghia CÁC THUẬT TOÁN VẼ ðƯỜNG Bài 1 : Mục tiêu : Bài thực hành cho biết cách dùng hàm InitGraph khởi tạo chế ñộ ñồ họa hàm closegraph ngưng làm việc trên chế dộ ñồ họa hàm putpixel(x,y,color) vẽ một ñiểm ảnh tại vị trí x, y với màu color hàm getpixel(x,y) trả về giá trị màu sắc tại vị trí x, y Xây dựng hàm khởi tạo chế ñộ ñồ họa #include <graphics.h> void InitGraph() { int gd=DETECT,gm; //Khai báo 2 biến gd và gm kiểu số nguyên initgraph(&gd,&gm,"C:\\NGHIA\\THUCHANH\\DOHOA\\TC\\BGI"); // Goi hàm khởi tạo ñồ họa } Cấu trúc một chương trình ñồ họa thông thường void main () { Inputdata(); // Nhập dữ liệu cho chương trình – Tọa ñộ của một ñiểm, bán kính InitGraph(); // Khoi tao che do do hoa Draw(); // Các thao tác ñồ họa closegraph(); // Ngừng chế ñộ làm việc của ñồ họa } * Chương trình vẽ bầu trời sao nhấp nháy minh họa các hàm vừa nêu trên #include <graphics.h> #include <stdlib.h> #include <conio.h> viod DrawSky() { int x,y,color; randomize(); //khoi tao random (stdlib.h) while(!kbhit()) // int kbhit() = 0 Neu bo dem ban phim rong (conio.h) { x = random(640); y = random(480); color = random(16); if(getpixel(x,y) != color) //Lay gia tiị mau tai vi tri x,y so sanh voi mau se ve putpixel(x,y,color); // Ve mau khac neu khong phai la mau da ve else putpixel(x,y,1); //Ve lai gia tri mau nen BLACK } } void main() { InitGraph(); DrawSky(); closegraph() TH- ðỒ HỌA MÁY TÍNH 2 GVHD: Huynh Duc Nghia } Bài 2: Viết hàm main() vẽ hình chữ nhật và hình tròn Gợi ý : Dùng hàm line() hoặc rectangle() và circle() do chương trình C cung cấp. ðường thẳng, hình vuông, hình tròn ñược vẽ như thế nào? Bài 3: Cài ñặt giải thuật vẽ ñường thẳng bằng thuật toán thô, vẽ ñường thẳng có các tọa ñộ x1 = 150, y1 = 150, x2 = 250, y2 = 200 và màu tùy ý. Gợi ý: tạo hàm DT(x1,y1,x2,y2,Color) - Vẽ ñiểm ñầu tiên (x1,y1) - Tính hệ số góc m và hệ số b - ðiểm tiếp theo cho ñến ñiểm (x2,y2) , dùng: for (int x=x1; x<x2; x++) { y=m*x+b; putpixel(x,Round(y),Color); } Chương trình minh hoa #include <graphics.h> #include <stdlib.h> #include <conio.h> #define Round(a) int(a+0.5) void Line(int x1, int y1, int x2, int y2) { putpixel(x1,y1,RED); float m=(float)(y2-y1)/(x2-x1); float b=y1-m*x1; int y; for (int x=x1; x<x2; x++) { y=m*x+b; putpixel(x,Round(y),RED); } } void InitGraph() { int gd=DETECT,gm; initgraph(&gd,&gm,"C: \\NGHIA\\THUCHANH\\DOHOA\\TC\\BGI"); } void main() { InitGraph(); Line(150,150,250,200); getch(); closegraph(); } Câu hỏi: Trường hợp giải thuật trên áp dụng cho m thuộc khoảng miền giá nào? Hãy dùng giải thuật trên vẽ hình vuông , chữ nhật, tam giác, tứ giác, da giác lồi, lõm. Bài 4: Cài ñặt thuật toán DDA, vẽ ñường thẳng như bài 3 Giải thuật: (với 0<m<1) TH- ðỒ HỌA MÁY TÍNH 3 GVHD: Huynh Duc Nghia #define Round(a) int(a+0.5) //ðịnh nghĩa hàm làm tròn số a nguyên void LineDDA (int x1, int y1, int x2, int y2, int Color) { int x = x1; float y = y1; float m = float(y2-y1)/(x2-x1); putpixel(x, Round(y), Color); for(int i=x1; i<x2; i++) { x++; y +=m; putpixel(x, Round(y), Color); } } // LineDDA Yêu cầu : - Hãy dùng giải thuật trên vẽ hình vuông , chữ nhật, tam giác, tứ giác, da giác lồi, lõm. - Cài ñặt thuật toán DDA với m>1, vẽ ñường thẳng, có các tọa ñộ x1 = 100, y1 = 100, x2 = 200, y2 = 300 và màu tùy ý (ðối xứng TH với 0<m<1) Bài 5: Cài ñặt thuật toán Bresenham, Dùng thuật toán Bresenham vẽ ñường thẳng như bài 3 Giải thuật: (với 0<m<1) void LineBres1 (int x1, int y1, int x2, int y2, int Color) { int Dx, Dy, p, twoDy, twoDyDx, Const2; int x, y; Dx = x2 - x1; Dy = y2 - y1; twoDy = 2*Dy; // Dy <<1 twoDyDx = 2*(Dy-Dx); // (Dy-Dx) <<1 p = twoDy - Dx; // Dy <<1 - Dx putpixel(x, y, Color); for(x=x1; x<x2; x++) { if (p<0) p += twoDy; else { p += twoDyDx; y++; } putpixel(x, y, Color); } } // LineBres1 Yêu cầu : - Hãy dùng giải thuật trên vẽ hình vuông , chữ nhật, tam giác, tứ giác, da giác lồi, lõm. - Cài ñặt thuật toán Bresenham ñể vẽ ñường thẳng có hệ số góc tùy ý (LineBresX) ñược mô tả như sau: Void LineBresX(x1,y1,x2,y2,Color) { *Nếu x1!=x2, thì: Tính hệ số góc m. TH- ðỒ HỌA MÁY TÍNH 4 GVHD: Huynh Duc Nghia Nếu 0<m<1 => gọi hàm LineBres1(); Nếu m>1 => gọi hàm LineBres2(); Nếu -1<m<0 => gọi hàm LineBres3(); Nếu m<-1 => gọi hàm LineBres4(); *Ngược lại gọi hàm LineBresV(); //Vẽ ñường thẳng ñứng } Bài 6: Cài ñặt thuật toán vẽ ñường tròn MidPoint // Ve 8 diem doi xung void Put8Pixel(int x, int y, int Color) { putpixel(x, y, Color); putpixel(y, x, Color); putpixel(y, -x, Color); putpixel(x, -y, Color); putpixel(-x, -y, Color); putpixel(-y, -x, Color); putpixel(-y, x, Color); putpixel(-x, y, Color); } // Put8Pixel void CircleMidPoint (int R) { int x, y; x = 0; y = R; Put8Pixel(x, y,WHITE); int p = 1 - R; //Tại sao ở ñây có số 1? while (x < y) { if (p < 0) p += 2*x + 3; else { p += 2*(x -y) + 5; y ; } x++; Put8Pixel(x, y,WHITE); } } // CircleMidPoint Yêu cầu : - Hãy dùng giải thuật trên vẽ ñường tròn. - Vẽ ñường tròn tâm x c ,y c bất kỳ Bài 7: Cài ñặt thuật toán vẽ ñường tròn Bresenham void CircleBres (int R) { int x, y; x = 0; y = R; Put8Pixel(x, y,WHITE); TH- ðỒ HỌA MÁY TÍNH 5 GVHD: Huynh Duc Nghia p = 3 – 2*R; while (x < y) { x++; if (p < 0) p += 4*x + 6; else { y ; p += 4*(x -y) + 10; } Put8Pixel(x, y,WHITE); } } // CircleBres Yêu cầu: - Dùng giải thuật trên vẽ ñường tròn. - Vẽ ñường tròn tâm x c ,y c bất kỳ. Tự cài ñặt chương trình: vẽ ellipse, parabol, và một số ñường cong khác,… CÁC THUẬT TOÁN TÔ MÀU Tô màu dựa theo ñường biên Bài 1 : Cài ñặt giải thuật tô màu với lân cận 4. Cài ñặt giải thuật: void FloodFill4(int x, int y, int bc, int nc) //bc: back color, nc: new color { int color= getpixel(x,y); if ((color != bc) && (color != nc)) { putpixel(x,y,nc); delay(30); FloodFill4(x-1,y,bc,nc); FloodFill4(x+1,y,bc,nc); FloodFill4(x,y-1,bc,nc); FloodFill4(x,y+1,bc,nc); } } Chương tình minh họa #include <graphics.h> #include <stdlib.h> #include <conio.h> #include <stdio.h> #include <dos.h> #define Round(a) int(a+0.5) int Color = WHITE; void FloodFill4(int x, int y, int bc, int nc) { int color= getpixel(x,y); if ((color != bc) && (color != nc)) { TH- ðỒ HỌA MÁY TÍNH 6 GVHD: Huynh Duc Nghia putpixel(x,y,nc); //delay(30); FloodFill4(x-1,y,bc,nc); FloodFill4(x+1,y,bc,nc); FloodFill4(x,y-1,bc,nc); FloodFill4(x,y+1,bc,nc); } } void RecTangle(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { line(x1,y1,x2,y2); line(x4,y4,x3,y3); line(x1,y1,x4,y4); line(x2,y2,x3,y3); } void InitGraph() { int gd=DETECT,gm; initgraph(&gd,&gm,"C:\\TC\\BGI"); } void main() { InitGraph(); RecTangle(100,100,100,120,150,120,150,100); FloodFill4(125,110,Color,RED); getch(); closegraph(); }// End programing Bài 2 : Cài ñặt giải thuật tô màu với lân cận chéo. Cài ñặt giải thuật void FloodFillD(int x, int y, int bc, int nc) { int color= getpixel(x,y); if ((color != bc) && (color != nc)) { putpixel(x,y,nc); delay(30); FloodFillD(x+1,y+1,bc,nc); FloodFillD(x+1,y-1,bc,nc); FloodFillD(x-1,y-1,bc,nc); FloodFillD(x-1,y+1,bc,nc); } } Bài 3 : Cài ñặt giải thuật tô màu với lân cận 8. Cài ñặt giải thuật void FloodFill8(int x, int y, int bc, int nc) { int color= getpixel(x,y); if ((color != bc) && (color != nc)) { putpixel(x,y,nc); TH- ðỒ HỌA MÁY TÍNH 7 GVHD: Huynh Duc Nghia delay(30); FloodFill4(x,y,bc,nc); // lan can 4 FloodFillD(x,y,bc,nc); // va lan can cheo } } Yêu cầu: Vẽ và tô ñường tròn, tam giác, ½, ¼ ñường tròn với các màu khac nhau. Tự làm: vẽ và tô ellipse, prarabol, và một số ñường cong khác Tô màu dựa theo dòng quét Bài 1: Tô màu hình chữ nhật Cài ñặt giải thuật void ScanLineFillR(int l, int r, int t, int b, int color) { for (int y= t; y<=b; y++) LineDDA(l,y,r,y,color); } Bài 2: Tô màu hình tam giác Cài ñặt giải thuật (ðáy phẳng y2=y3) void FillFlatBottom(int x1, int y1, int x2, int y2, int x3, int y3, int color) { float ml, mr, xl, xr; ml = (float)(y2-y1)/(x2-x1); mr = (float)(y3-y1)/(x3-x1); xl=xr=x1; for(int y=y1;y<=y2;y++) { xl += 1/ml; xr += 1/mr; LineDDA(round(xl),y,round(xr),y,color); } } Cài ñặt giải thuật (ðỉnh phẳng y1= y2) void FillFlatTop(int x1, int y1, int x2, int y2, int x3, int y3, int color) { float ml, mr, xl, xr; ml = (float)(y3-y1)/(x3-x1); mr = (float)(y3-y2)/(x3-x2); xl=x1;xr=x2; for(int y=y2;y<=y3;y++) { xl = xl + 1/ml; xr = xr + 1/mr; LineDDA(round(xl),y,round(xr),y,color); } } Flat Bottom (ðáy phẳng) Flat Top (ðỉnh phẳng) (x2,y2) (x1,y1) (x3,y3) TH- ðỒ HỌA MÁY TÍNH 8 GVHD: Huynh Duc Nghia Bài 3: Tô màu tam giac tổng quát Hướng dẫn: Bước 1: Sắp xếp lại thứ tự các ñiểm, sao cho: y1>y2>y3 Bước 2: Nếu y2 = y3: gọi hàm tô màu tam giác ñáy phẳng Nếu y1= y2: gọi hàm tô màu tam giác ñỉnh phẳng Ngược lại (y1#y2#y3): gọi cả 2 hàm ñáy phẳng và ñỉnh phẳng. Tự làm: Tô màu ña giác lồi, tứ giác . TH- ðỒ HỌA MÁY TÍNH 1 GVHD: Huynh Duc Nghia CÁC THUẬT TOÁN VẼ ðƯỜNG Bài 1 : Mục tiêu : Bài thực hành cho biết cách dùng hàm InitGraph khởi tạo chế ñộ ñồ họa hàm closegraph . Yêu cầu: - Dùng giải thuật trên vẽ ñường tròn. - Vẽ ñường tròn tâm x c ,y c bất kỳ. Tự cài ñặt chương trình: vẽ ellipse, parabol, và một số ñường cong khác,… CÁC THUẬT TOÁN TÔ MÀU. putpixel(y, x, Color); putpixel(y, -x, Color); putpixel(x, -y, Color); putpixel(-x, -y, Color); putpixel(-y, -x, Color); putpixel(-y, x, Color); putpixel(-x, y, Color); } // Put8Pixel void

Ngày đăng: 11/07/2014, 16:20

Từ khóa liên quan

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

Tài liệu liên quan