Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 19 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
19
Dung lượng
590,6 KB
Nội dung
TRƯỜNG ĐẠI HỌC ĐIỆN LỰC KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO CHUYÊN ĐỀ HỌC PHẦN ĐỒ HỌA MÁY TÍNH ĐỀ TI: XÂY DỰNG CHƯƠNG TRÌNH VẼ ĐỒNG HỒ ĐIỆN TỬ Sinh viên thực : ĐỖ CHÍ ĐỨC - 20810310313 Giảng viên hướng dẫn : NGÔ NGỌC THNH Ngành : CÔNG NGHỆ THÔNG TIN Chuyên ngành : CÔNG NGHỆ PHẦN MỀM Lớp : D15CNPM3 Khóa : 2020 – 2025 PHIẾU CHẤM ĐIỂM Sinh viên thực hiện: Họ tên sinh viên Nội dung thực Điểm Chữ ký Đỗ Chí Đức 20810310313 Giảng viên chấm: Họ tên Giảng viên chấm : Giảng viên chấm : Chữ ký Ghi MỤC LỤC CHƯƠNG 1: TÌM HIỂU CHƯƠNG TRÌNH 1 Nền tảng chương trình Vẽ đường thẳng (thuật toán midpoint) .2 Vẽ đường trịn (thuật tốn midpoint) Thuật tốn tơ màu (Tơ màu tràn(Đệ quy)) CHƯƠNG 2: CHƯƠNG TRÌNH V KẾT QUẢ THỰC NGHIỆM 10 Mã code chương trình 10 Kết thực nghiệm 13 KẾT LUẬN 14 MỞ ĐẦU Đồ họa khơng cịn điều q đỗi lạ lẫm người dùng máy tính, bạn thấy hình ảnh từ 2D 3D đâu, lĩnh vực đặc biệt thiết kế sử dụng hình ảnh để làm việc, làm hoạt họa hay chí dùng cơng việc liên quan tới giải tích, hình học Vậy đồ họa máy tính Đồ họa máy tính phương pháp công nghệ dùng việc chuyển đổi qua lại liệu hình ảnh máy tính Đồ họa máy tính lĩnh vực khoa học máy tính nghiên cứu tố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, vỉ mạch đồ họa ) Từ học từ đồ họa máy tính, nhóm em muốn xây dựng chương trình ứng dụng kiến thức đồ họa máy tính, nên em chọn đề tài “Xây dựng chương trình vẽ đồng hồ điện tử” chương trình đúc kết kiến thức Có lẽ chương trình báo cáo em chưa chun nghiệp, hồn chỉnh nhất, cịn có thiếu xót Vì em mong thầy bạn góp ý để nhóm em xây dựng đề đạt kết tốt CHƯƠNG 1: TÌM HIỂU CHƯƠNG TRÌNH Nền tảng chương trình Đồ họa máy tính tất liên quan đến việc sử dụng máy tính để phát sinh hình ảnh Các vấn đề liên quan tới công việc bao gồm: tạo, lưu trữ, thao tác mơ hình (các mơ tả hình học đối tượng) ảnh Theo định nghĩa đồ họa máy tính bao gồm việc thiết kế phần cứng thiết bị hiển thị, thuật toán cần thiết để phát sinh thiết bị này, phần mềm sử dụng cho người lập trình hệ thống người lập trình ứng dụng đồ họa, chương trình ứng dụng tạo ảnh máy tính Đồ họa máy tính cung cấp phương cách tự nhiên cho việc truyền đạt thơng tin với máy tính Ngày nay, nhiều q trình thiết kế, cài đặt xây dựng, thơng tin lĩnh vực khơng thiếu, chương trình viết nhiều ngơn ngữ Trong mơn “Đồ họa máy tính” này, em xây dựng chương trình ngơn ngữ lập trình C++ Chương trình sử dụng thư viện graphics.h Do thư viện đồ họa graphics khơng tích hợp sẵn thư viện trình biên dịch C/C++ nên ta phải tự thêm thư viện muốn sử dụng chúng Sau đây, cách cài đặt thư viện graphics.h Bước 1: Đầu tiên vào link http://winbgim.codecutter.org/ tải WinBGIm Bước 2: Giải nén tập tin tải xuống Sẽ có ba tệp: graphics.h winbgim.h libbgi.a Bước 3: Copy hai file graphics.h winbgim.h vào thư mục include trình biên dịch(thường MinGw), cịn vị trí thư mục đâu cịn tùy vào lúc bạn cài MinGw Thư mục đường dẫn sau: C:\Program Files(x86)\Dev-cpp\MinGW\include C:\Program Files(x86)\ Dev-cpp \MinGW\include Bước 4: Copy file libbgi.a vào thư mục lib thư mục trình biên dịch(thường MinGw) Bước 5: Mở Code::Blocks Chọn Settings >> Compiler >> Linker settings Bước 6: Click vào Add, tìm đến file libbgi.a vừa copy bước Bước 7: Trong phần bên phải (other linker options) dán lệnh sau vào đó: -lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32 Bước 8: Nhấn OK Bước 9: Hầu hết sau bước bạn làm thành cơng Hãy thử biên dịch chương trình graphics.h C C++ để kiểm tra Có vài trường hợp lỗi Để giải nó, mở tệp graphics.h (đã dán thư mục bao gồm bước 3) Chuyển đến dòng số 302 thay dịng dịng này: int left = 0, int top = 0, int right = INT_MAX, int bottom = INT_MAX, Bước 10: lưu tệp Vẽ đường thẳng (thuật tốn midpoint) Đường thẳng hình máy tính tập hợp điểm có kích thước gần với điểm thực tế Để thu đường thẳng tốt ta cần lựa chọn điểm ảnh gần với đường thẳng thực tế Đó vấn đề giải thuật toán Midpoint Trong toán học, khái niệm đường thẳng đường kéo dài vô mỏng, thẳng tuyệt đối; qua hai điểm có đường thẳng qua Trên hình máy tính lại bao gồm nhiều điểm ảnh với kích thước cụ thể khác Vì vậy, khái niệm đường thẳng lại tập hợp điểm có kích thước xấp xỉ gần với điểm thực tế Để thu đường thẳng tốt cần lựa chọn điểm ảnh gần với đường thẳng thực tế Do đó, thuật toán vẽ đường thẳng đời nhằm giải toán Để vẽ đường thẳng nối từ hai điểm (x1, y1), (x2, y2), cần tính tốn điểm vẽ sau vẽ điểm (x0, y0) Recommandé pour toi 10 Suite du document ci-dessous PET Speaking visuals Hình thi nói PET part D15qlmtcn 13 Life A2B1 Wordlist tiếng anh đại học điện lực D15qlmtcn 100% (10) Dap an multiple choise - tiếng anh D15qlmtcn 14 100% (1) 100% (1) FRS Sample fastval D15qlmtcn 100% (1) Với thuâ ‚t toán Midpoint, tìm điểm cần tìm dựa vào vị trí trung điểm đối tượng nằm vùng lựa chọn so với đường thẳng vẽ Mơ tả thuật tốn midpoint: Đối với việc lựa chọn điểm vẽ sau A, có hai lựa chọn điểm P Q với M trung điểm chúng Việc định chọn điểm để vẽ phụ thuộc vào vị trí M so với đường thẳng vẽ Nếu M nằm phía đường thẳng, chọn điểm Q Ngược lại, M nằm phía đường thẳng ta chọn điểm P Xét trường hợp < m < Phương trình đường thẳng là: y = m * x + b, m = dy / dx ⇔ y = d x / dx * x + b ⇔ dy * x + (-dx * y) + b * dx = (1) Mà: F(x, y) = a * x + b * y + c = (2) (1), (2) ⇒ a = dy, b = -dx, c = b * dx Tìm d F(M) = F(xi + 1, yi + / 2) = F(xi, yi) + a + b / = + dy + dx / = dy + dx / Tìm dmax Đă ‚t d = F(M) Nếu d > 0, chọn điểm Q để vẽ Nếu d < 0, chọn điểm P để vẽ Trường hợp - chọn Q Mnew * (xi + 2, yi + / 2) ⇒ dnew = F(xi + 2, yi + / 2) (Δd)Q = dnew - dold = F(xi + 1, yi + / 2) - F(xi + 2, yi + / 2) = a = dy ⇒ dnew = dold + dy Trường hợp - chọn P Mnew * (xi + 2, yi + / 2) ⇒ dnew = F(xi + 2, yi + / 2) (Δd)P = dnew - dold = F(xi + 1, yi + / 2) - F(xi + 2, yi + / 2) = a + b = d y - dx ⇒ dnew = dold + dy - dx Thuâ ‚t giải Thuật giải nêu thực thuật toán trường hợp < m < 1, trường hợp cịn lại suy luận tương tự Input: (x1, y1), (x2, y2) Output: Tâ ‚p hợp điểm có tọa ‚ ngun Các bước thực hiê ‚n chính: Bước dx = x2 – x1, dy = y2 – y1; d = dy – dx/2; x = x1, y = y1; // Vẽ điểm (x, y) Bước while (x thì: x = x + 1; y = y; d = d + dy; Nếu d < thì: x = x + 1; y = y + 1; d = d + dy – dx; // Vẽ điểm (x, y) } Hiê ‚n thực void midpointLine(int x1, int y1, int x2, int y2) { int Dx = x2 - x1; int Dy = y2 - y1; int x = x1; int y = y1; putpixel(x1, y1, MAGENTA); float D = Dy - (Dx >> 1); // ~ float D = Dy - Dx/2; while(x x2 + y2 - r2 = Đặt f(x, y) = x2 + y2 - r2 Với điểm P(x, y) nằm hệ tọa độ Oxy: P(x, y) nằm đường tròn O f(x, y) = P(x, y) nằm ngồi đường trịn O f(x, y) > P(x, y) nằm đường tròn O f(x, y) < Do đường trịn có tính đối xứng qua cung 1/8, nghĩa ứng với điểm có tọa độ (x, y) thuộc cung bất kỳ, hồn tồn xác định tọa độ điểm lại cách lấy đối xứng qua cung Từ tính chất nên chỉnh cần vẽ 1/8 đường tròn đủ, sau lấy đối xứng để đường trịn hồn chỉnh Điểm vẽ điểm (x = 0, y = R) Trong cung 1/8 thứ khoảng biến thiên x lớn khoảng biến thiên y, nên xi+1 = xi + Giả sử vẽ (Xi, Yi) bước thứ i, cần xác định (Xi+1, Yi+1) bước thứ i + Xi+1 = Xi+1 Yi+1 ∈ {Yi, Yi - 1} Tính Fi Đặt Fi = F(X, Y - 1/2): F(Xi + 1, Yi - 1/2) = (Xi + 1)2 + (Yi - 1/2)2 - R2 Fi = Xi2 + 2Xi + Yi2 - Yi + 5/4 - R2 Nếu Fi < ⇔ (Xi+1, Y) gần với Yi ⇒ Yi+1 = Yi Nếu Fi ≥ ⇔ (Xi+1, Y) gần với Yi -1 ⇒ Yi+1 = Yi-1 Tính Fi +1 theo Fi Fi+1 - Fi = 2Xi + + (Yi + 12 - Yi2)+ (Yi+1 - Yi) (*) Nếu Fi < Fi+1 = Fi + 2Xi + 3, thay Yi+1 = Yi vào (*) Nếu Fi ≥ Fi+1 = Fi + 2(Xi - Yi) + 5, thay Yi+1 = Yi-1 vào (*) Tính giá trị F F(Xi + 1, Yi - 1/2) = (Xi + 1)2 + (Yi - 1/2)2 - R2 Fi = Xi2 + 2Xi + Yi2 - Yi + 5/4 - R2 Thay Xi = Yi = R công thức trên: F = 5/4 - R Hiện thực thuật toán Midpoint Hàm vẽ điểm đối xứng void put8pixel(int xc, int yc, int x, int y, int color) { putpixel(x + xc, y + yc, color); putpixel(-x + xc, y + yc, color); putpixel(x + xc, -y + yc, color); putpixel(-x + xc, -y + yc, color); putpixel( y + xc, x + yc, color); putpixel(-y + xc, x + yc, color); putpixel(y + xc, -x + yc, color); putpixel(-y + xc, -x + yc, color); } Hàm vẽ đường tròn void drawCircleMidpoint(int xc, int yc, int r, int color) { int x = 0, y = r; int f = - r; put8pixel(xc, yc, x, y, color); while (x < y) { if (f < 0) f += (x