VẼ MẶT TRỜI ĐỨNG YÊN TẠI TÂM MÀN HÌNH, TRÁI ĐẤT QUAY QUANH MẶT TRỜI (QUỸ ĐẠO ELLIP), MẶT TRĂNG QUAY QUANH TRÁI ĐẤT (QUỸ ĐẠO HÌNH TRÒN)

27 1.7K 5
VẼ MẶT TRỜI ĐỨNG YÊN TẠI TÂM MÀN HÌNH, TRÁI ĐẤT QUAY QUANH MẶT TRỜI (QUỸ ĐẠO ELLIP), MẶT TRĂNG QUAY QUANH TRÁI ĐẤT (QUỸ ĐẠO HÌNH TRÒN)

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN  BÁO CÁO BÀI TẬP LỚN MƠN HỌC ĐỒ HỌA MÁY TÍNH ĐỀ TÀI : VẼ MẶT TRỜI ĐỨNG YÊN TẠI TÂM MÀN HÌNH, TRÁI ĐẤT QUAY QUANH MẶT TRỜI (QUỸ ĐẠO ELLIP), MẶT TRĂNG QUAY QUANH TRÁI ĐẤT (QUỸ ĐẠO HÌNH TRỊN) Nhóm sinh viên thực hiện: Nhóm Nguyễn Văn Long Nguyễn Chí Thanh Phạm Đình Chiến Lớp: ĐH KTPM – K6 Giáo viên hướng dẫn: THS Nguyễn Thị Cẩm Ngoan Hà Nội, ngày 26 tháng 02 năm 2013 LỜI NĨI ĐẦU Đồ họa máy tính lĩnh vực khoa học máy tính nghiên cứu sở toán học, thuật toán kĩ thuật phép tạo, hiển thị điều khiển hình ảnh hình máy tính Đồ họa máy tính có liên quan nhiều đến số lĩnh vực đại số, hình học giải tích, hình học họa hình, quang học, kĩ thuật máy tính, đặc biệt chế tạo phần cứng (các loại hình, thiết bị xuất, nhập, vi mạch đồ họa ) Trong bài tập lớn bộ môn đồ họa máy tính nhóm em được giao đề tài: “Vẽ mặt trời đứng yên tâm hình, trái đất quay quanh mặt trời quỹ đạo ellip, mặt trăng quay quanh trái đất quỹ đạo hình trịn” Được sự hướng dẫn của cô giáo bộ môn cũng qua các cổng thông tin Internet, tài liệu và sự tìm tòi các cuốn sách tài liệu liên quan tới đề tài nhóm em đã hoàn thành bài tập lớn được giao Trong quá trình hoàn thành nhóm đã gặp được một số khó khăn cũng thuận lợi và còn nhiều hạn chế Nhóm em rất mong được sự đóng góp, bổ sung ý kiến để bài tập lớn của nhóm em có thể hoàn thành tốt các đề tài tiếp theo cũng đề tài của nhóm sau này MỤC LỤC 2.1.1 Thuật toán Bresenham: 10 2.1.2 Thuật toán MidPoint: 12 2.2 Thuật tốn tơ màu 14 2.2.1 Theo dòng quét: 14 2.2.2 Tô màu lân cận: .16 PHÂN TÍCH KHẢO SÁT MỤC TIÊU ĐỐI TƯỢNG 1.1 Định nghĩa số #define SUNRADIUS 80 // bán kính mặt trời 80 pixel #define EARTHRADIUS 10 // bán kính trái đất 10 pixel #define MOONRADIUS // bán kính mặt trăng pixel #define SUNEARTH 200 // khoảng cách từ tâm mặt trời đến tâm trái đất 200 pixel #define EARTHMOON 30 // khoảng cách từ tâm trái đất đến tâm mặt trăng 30 pixel #define DELAY 20 // Tốc độ chuyển động 1.2 Mặt trời Để vẽ mặt trời đứng yên tâm hình Đầu tiên cần phải xác định tọa độ xsun, ysun Tọa độ xsun=getmax()/2; ysun=getmaxy()/2; tức trả nửa chiều rộng (theo x) nửa chiều cao (theo y) tối đa chế độ hình dùng Tiếp theo ta vẽ đường trịn thuật toán Bresenham biết tọa độ xsun, ysun: void Duongtron_BRE(int xc, int yc, int R, int color) { int x, y, d; x = 0; y = R; d = - * R; while (x =0) { p = p+(a2*(3 - 2*y)); p =p + a2*(3-2*y); } else{ x++; fx += 2*b2; p += b2*(2*x+2) + a2*(-2*y +3); } plot(xc, yc, x, y, color); } } Tạo chuyển động cho trái đất quay quanh mặt trời: int earth_angle = { delay(DELAY); setcolor(BLACK); setfillstyle(SOLID_FILL, BLACK); fillellipse(xearth, yearth, EARTHRADIUS, EARTHRADIUS);//to mau den cho trai dat earth_angle += 1; //dieu chinh toc quay cua trai dat xearth = xsun + SUNEARTH * cos(M_PI * earth_angle / 180); yearth = ysun + SUNEARTH * sin(M_PI * earth_angle / 180); } while(!kbhit()); //chuong trinh se dung lai ta bam mot phim bat ki 1.4 Mặt trăng Để vẽ mặt trăng quay quanh trái đất với quỹ đạo hình trịn, ta khởi tạo tọa độ tâm mặt trăng vị trí xác định xmoon, ymoon, sau thực phép quay quanh tâm mặt trời Với xmoon = xearth + EARTHMOON; ymoon= getmaxy()/2; - Vẽ tô màu cho mặt trăng: setcolor(WHITE); setfillstyle(SOLID_FILL, WHITE); fillellipse(xmoon, ymoon, MOONRADIUS, MOONRADIUS);//ve mat trang - Sử dụng phép quay mặt trăng quay quanh trái đất quỹ đạo hình trịn: moon_angle = 0; { delay(DELAY); setcolor(BLACK); setfillstyle(SOLID_FILL, BLACK); fillellipse(xmoon, ymoon, MOONRADIUS, MOONRADIUS);//to mau den cho mat trang xmoon = xearth + EARTHMOON * cos(M_PI * moon_angle / 180); ymoon = yearth + EARTHMOON * sin(M_PI * moon_angle / 180); } while (!kbhit()); //chuong trinh se dung lai ta bam mot phim bat ki CÁC THUẬT TOÁN SỬ DỤNG 2.1 Thuật tố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 qt đường trịn có dạng: (x-xc)2 + (y – yc)2= R2 (*) ↔ y = yc ± R − ( x − xc ) Để đơn giản thuật toán ta xét đường có tâm gốc tọa độ (xc=0 yc=0) * Ý tưởng: Do tính đỗi xứng đường trịn nên điểm (x,y) ∈(C) điểm (y,x), (-y,x), (-x,y), (-x,-y), (-y,-x), (y,-x), (x,-y) ∈ (C) Vì vậy, ta cần vẽ phần cung trịn sau lấy đối xứng qua gốc O trục tọa độ ta có tồn đường trịn 2.1.1 Thuật tốn Bresenham: Giả sử (x i ,y i ) vẽ Cần chọn điểm (x i +1, y i ) (xi +1,yi -1) Từ phương trình: x2 + y2 = R2 ta tính 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 pi = d1 - d2 = 2.(xi + 1)2 + yi2 + (yi - 1)2 - 2R2 (2) ⇒ pi+1 = 2.(xi+1 + 1)2 + y2i+1 + (yi+1 - 1)2 - 2R2 (3) Từ (2) (3) ta có: 2 pi+1 - pi = 4xi + + 2.(y i +1 - y i ) - 2.(y i +1 - y i ) ⇒ pi+1 = pi + 4xi + + 2.(y i2+1 - y i2 ) - 2.(y i +1 - y i ) (4) 10 Hình 2.1 – Các vị trí đối xứng đường tròn (C) tương ứng với (x,y) Như có (x, y) Ỵ (C1/8) điểm : (y, x), (y,-x), (x,-y), (-x,-y), (-y,-x), (-y,x), (-x,y) thuộc (C) Chọn điểm bắt đầu để vẽ điểm (0,R) Dựa vào hình vẽ, tìm bước thứ i, điểm điểm nguyên bước thứ (i+1) lựa chọn S P Như : Tương tự thuật toán MidPoint vẽ đoạn thẳng, việc định chọn hai điểm S P thực thông qua việc xét dấu hàm điểm MidPoint điểm nằm chúng Hình 2.2 – Thuật tốn MidPoint vẽ đường trịn Đặt , ta có : 13 Xét • Ta có : Nếu , điểm MidPoint nằm đường tròn Lúc điểm thực Q gần S nên ta chọn S, tức • Ngược lại, , điểm MidPoint nằm ngồi đường trịn Lúc điểm thực Q gần P nên ta chọn P, tức Mặt khác : Vậy : , ta chọn , Ta tính giá trị ta chọn ứng với điểm ban đầu 2.2 Thuật tốn tơ màu 2.2.1 Theo dịng qt: Giả sử vùng tô cho đa giác N đỉnh : Đa giác đa giác lồi, đa giác lõm, đa giác tự cắt, … Hình 2.18 sau minh họa ý tưởng thuật tốn Với dịng qt, ta xác định phần giao đa giác dòng quét tơ màu pixel thuộc đoạn giao Để 14 xác định đoạn giao ta tiến hành việc tìm giao điểm dịng qt với cạnh đa giác, sau giao điểm theo thứ tự tăng dần hoành độ giao điểm Các đoạn giao đoạn thẳng giới hạn cặp giao điểm một, ví dụ (0,1), (2,3), … Hình 2.3 – Thuật tốn scan-line với dịng qt Ta tóm bắt bước thuật tốn : • Tìm , giá trị lớn nhất, nhỏ tập tung độ đỉnh đa giác cho , • Ứng với dịng qt • Tìm tất hồnh độ giao điểm dịng qt • Sắp xếp hồnh độ giao điểm theo thứ tự tăng dần : x0, x1, … • Tô màu đoạn thẳng đường thẳng cặp , với k thay đổi từ đến , lặp : với cạnh đa giác giới hạn Nếu dừng mức chuyển sang cài đặt, gặp số vấn đề sau : • Nhận xét rằng, ứng với dịng qt, khơng phải lúc tất cạnh đa giác tham gia cắt dòng quét Do để cải thiện tốc độ cần phải có cách để hạn chế số cạnh cần tìm giao điểm ứng với dịng qt • Việc tìm giao điểm cạnh đa giác với dịng qt gặp phép tốn phức tạp nhân, chia, … số thực ta dùng cách giải hệ phương trình tìm giao điểm Điều làm giảm tốc độ thuật toán phải lặp lặp lại nhiều lần thao tác dòng quét quét qua đa giác 15 • Nếu số giao điểm tìm cạnh đa giác dịng qt lẻ việc nhóm cặp giao điểm để hình thành đoạn tơ khơng xác Điều xảy dòng quét ngang qua đỉnh đa giác Nếu tính số giao điểm đỉnh dịng qt ngang qua hai cho kết tơ khơng xác trường hợp hình 2.19 Ngồi ra, việc tìm giao điểm dòng quét với cạnh nằm ngang 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 điểm lân cận P Nêu điểm lân cận cịn thuộc S chưa tơ màu tơ màu cho điểm lân cận Thuật tốn có thê minh học thử tục đệ quy sau: Procedure Tomaulancan(x,y:Integer; Color:Word); Begin If (P(x,y) ∈ S)and(P(x,y)chưa tô) Then Begin PutPixel(x,y,Color); Tomaulancan (x+1,y,Color); Tomaulancan (x-1,y,Color); Tomaulancan (x,y+1,Color); Tomaulancan (x,y-1,Color); End; End; 16 2.3 Phép quay: Phép quay làm thay đổi hướng đối tượng Một phép quay địi hỏi phải có tâm quay, góc quay Góc quay dương thường quy ước chiều ngược chiều kim đồng hồ Ta có công thức biến đổi phép quay điểm quanh gốc tọa độ góc góc α tạo thành điểm ảnh Q(x*,y*) có cơng thức sau:  x* = x cos α − y sin α   y* = x sin α + y cos α Hình 2.4 – Phép quay đối tượng quanh gốc tọa độ góc 600 180 Hình 2.5 - Phép quay quanh điểm Phép quay quanh điểm 17 Hình 2.6 : Phép quay quanh điểm Xét điểm P(P.x,P.y) quay quanh điểm V(V.x, V.y) góc -0- đến điểm Q(Q.x,Q.y) Ta xem phép quay quanh tâm V kết hợp từ phép biến đổi sau: - Phép tịnh tiến (-V.x, -V.y) để dịch chuyển tâm quay gốc tọa độ - Quay quanh gốc tọa độ O góc -0- Phép tịnh tiến (+V.x, +V.y) để đưa tâm quay vị trí ban đầu Ta cần xác định tọ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 - Phép tịnh tiến (+V.x, +V.y) biến đổi điểm Q' thành Q ta 18 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) { goc=(M_PI/180)*goc; float a=x,b=y; x=a*cos(goc)-b*sin(goc); y=a*sin(goc)+b*cos(goc); } 19 GIAO DIỆN CHƯƠNG TRÌNH Hình 3.1 – Giao diện chạy chương trình Hình 3.2 – Giao diện chạy chương trình 20 CHƯƠNG TRÌNH CÀI ĐẶT #include #include #include #include #define SUNRADIUS 80 //dinhnghia cac gia tri la hang so #define EARTHRADIUS 10 #define MOONRADIUS #define SUNEARTH 200 #define EARTHMOON 30 #define DELAY 20 #define ROUND(a)((long)a+0.5); void Duongtron_BRE(int xc, int yc, int R, int color) { int x, y, d; x = 0; y = R; d = - * R; while (x =0) { p = p+(a2*(3 - 2*y)); p =p + a2*(3-2*y); } else{ x++; fx += 2*b2; p += b2*(2*x+2) + a2*(-2*y +3); } plot(xc, yc, x, y, color); } } void he_mat_troi() { int xsun, ysun, xearth, yearth, xmoon, ymoon;//khai bao toa cua mat trang, mat troi, trai dat int earth_angle = 0, moon_angle = 0; rectangle(0, 0, getmaxx(), getmaxy());//getmaxy la ham lay dai chieu doc cua man hinh 24 //getmaxx() la ham lay gia tri dai chieu ngang cua man hinh xsun = getmaxx() / 2; ymoon = yearth = ysun = getmaxy() / 2; xearth = xsun + SUNEARTH; xmoon = xearth + EARTHMOON; Duongtron_BRE(xsun,ysun,60,14);//ve mat troi for(int i = 0; i < 2; i++) { FloodFill (xsun,ysun,0,14);//to mau cho mat troi } { //Mid_ellipse(317,239,190,199,12);//(ngang,doc,do ngang,do doc) ve quy dao di chuyen cua trai dat setcolor(GREEN);//ve mau vien cua trai dat setfillstyle(SOLID_FILL, GREEN);//to mau trai dat fillellipse(xearth, yearth, EARTHRADIUS, EARTHRADIUS);//trai dat setcolor(WHITE); setfillstyle(SOLID_FILL, WHITE); fillellipse(xmoon, ymoon, MOONRADIUS, MOONRADIUS);//ve mat trang //tao chuyen dong cho trai dat va mat trang delay(DELAY); setcolor(BLACK); setfillstyle(SOLID_FILL, BLACK); fillellipse(xearth, yearth, EARTHRADIUS, EARTHRADIUS);//to mau den cho trai dat 25 fillellipse(xmoon, ymoon, MOONRADIUS, MOONRADIUS);//to mau den cho mat trang earth_angle += 1;//dieu chinh toc quay cua trai dat moon_angle -= 12;//dieu chinh toc quay cua mat trang //cac gia tri cua trai dat va mat trang se thay doi lam cho trai dat va mat trang quay xearth = xsun + SUNEARTH * cos(M_PI * earth_angle / 180); yearth = ysun + SUNEARTH * sin(M_PI * earth_angle / 180); xmoon = xearth + EARTHMOON * cos(M_PI * moon_angle / 180); ymoon = yearth + EARTHMOON * sin(M_PI * moon_angle / 180); } while (!kbhit());//chuong trinh se dung lai ta bam mot phim bat ki } main() { int gr_drive = DETECT, gr_mode; initgraph(&gr_drive, &gr_mode, ""); he_mat_troi(); getch(); closegraph(); } 26 TÀI LIỆU THAM KHẢO GIÁO TRÌNH: KỸ THUẬT ĐỒ HỌA - THS TRỊNH THỊ VÂN ANH GIÁO TRÌNH ĐỒ HỌA MÁY TÍNH – THS NGUYỄN THỊ CẨM NGOAN http://d.violet.vn/uploads/resources/50/1557698/preview.swf http://www.vn-zoom.com/f174/cac-ban-giup-minh-bai-pascal-nay-voi1173071.html#post6921914 27 ... máy tính nhóm em được giao đề tài: ? ?Vẽ mặt trời đứng yên tâm hình, trái đất quay quanh mặt trời quỹ đạo ellip, mặt trăng quay quanh trái đất quỹ đạo hình trịn” Được sự hướng dẫn của cô... phim bat ki 1.4 Mặt trăng Để vẽ mặt trăng quay quanh trái đất với quỹ đạo hình trịn, ta khởi tạo tọa độ tâm mặt trăng vị trí xác định xmoon, ymoon, sau thực phép quay quanh tâm mặt trời Với xmoon... #define EARTHMOON 30 // khoảng cách từ tâm trái đất đến tâm mặt trăng 30 pixel #define DELAY 20 // Tốc độ chuyển động 1.2 Mặt trời Để vẽ mặt trời đứng yên tâm hình Đầu tiên cần phải xác định tọa

Ngày đăng: 06/11/2014, 01:12

Từ khóa liên quan

Mục lục

  • 2.1.1 Thuật toán Bresenham:

  • 2.1.2 Thuật toán MidPoint:

  • 2.2 Thuật toán tô màu

    • 2.2.1. Theo dòng quét:

    • 2.2.2. Tô màu lân cận:

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

Tài liệu liên quan