BỘ CÔNG THƯƠNG
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ỌA MÁY TÍNH
ĐỀ TÀI: XÂY DỰNG PHẦN MỀM HỖ TRỢ HỌC SINH CẤP 3
HỌC KHẢO SÁT VÀ VẼ ĐỒ THỊ HÀM SỐ BẰNG OPENGL.
Giảng viên hướng dẫn: ThS. Vũ Minh Yến
Nhóm thực hiện: NHÓM 7 – HTTT- K5
Hà Nội ngày 6/8/2012
BÁO CÁO BÀI TẬP LỚN
MÔN ĐỒ HỌA MÁY TÍNH
ĐỀ TÀI: XÂY DỰNG PHẦN MỀM HỖ TRỢ HỌC SINH CẤP 3 HỌC
KHẢO SÁT VÀ VẼ ĐỒ THỊ HÀM SỐ BẰNG OPENGL.
Giảng viên hướng dẫn: ThS. Vũ Minh Yến
Nhóm thực hiện: NHÓM 7 – HTTT- K5
NHÓM 7_H3TK5
Lơi mơ đầu
Trong thơi đại phát triển của ngành công nghệ thông tin ngày nay, việc ứng dụng
công nghệ thông tin và cuốc sống có vai trò vô cùng ý nghĩa góp phần tích cực xây
dựng một xã hội hiện đại, sánh vại với các nước hiện đại trên thế giới .
Xây dựng phần mềm hỗ trợ học sinh cấp 3 học khảo sát và vẽ đồ thị hàm
số.
Yêu cầu :
3
Page 3
• Mỗi thành viên phải hiểu và phân tích được toàn bộ đề tài đã làm
của nhóm.
• Ngôn ngữ lập trình được áp dụng : DEV C++
2. Chức năng của phần mềm
Giúp khảo sát 2 hàm cơ bản trong chương trình cấp 3
+ Hàm đa thức bậc 2: y=ax2 + bx2 + c (a#0)
+ Hàm đa thức bậc 3: y=ax3 +bx2 + cx + d (a#0)
+ Hàm đa thức bậc 4( trùng phương): y=ax4 + bx2 + c (a#0)
Ngươi dùng chỉ việc kích chuột phải và chọn loại hàm đa thức
nào( có trong menu) và phần mềm sẽ tự động khảo sát và vẽ bảng biến
thiên và đồ thị hàm số.
Phần 1. Giơi thiệu về OPENGL.
I. Tìm hiểu về Opengl
1.Lịch Sử Phát Triển :
Nguyên thủy, GL do Silicon Graphics Incorporated (SGI) thiết kế để dùng cho
các trạm làm việc (workstation) đồ họa IRIS của họ. IRIS GL với các cấu hình
phần cứng khác thì có vấn đề phát sinh.
OpenGL là kết quả nổ lực của SGI nhằm cải thiện tính tương thích của IRIS
GL. Ngôn ngữ mới này có khả năng của GL, đồng thơi “mơ “ nghĩa là dễ dàng
4
5
Page 5
Khơi tạo vị trí bắt đầu cửa sổ, x là left of the screen, y là top of the screen, nói
chung đây là điểm bên trái, phía trên của cửa sổ, từ đây ta kéo xuống phía dưới,
bên phải là được 1 cửa sổ . Đơn vị của x, y là pixel.
void glutInitWindowSize(int width, int height);
Khơi tạo kích thước cửa sổ. với chiều dài và chiều rộng, cộng thêm 1 điểm bắt
đầu mới nói ơ trên nữa, bạn đã tương tượng ra đc 1 cái cửa sổ chưa
void glutInitDisplayMode(unsigned int mode)
Định nghĩa mode hiển thị, chỉ ra màu của mode và số + kiểu của buffer
+ GLUT_RGBA or GLUT_RGB : cửa sổ màu RGBA, đây là mode mặc định
+ GLUT_SINGLE : cửa sổ buffer đơn
+ GLUT_DOUBLE : cửa sổ buffer đôi
+ GLUT_DEPTH : cửa sổ buffer sâu
int glutCreateWindow(char *title);
Tạo cửa sổ có tiêu đề title
void glutDisplayFunc(void (*func)(void));
Hàm này báo cho GLUT biết phải trình diễn theo hàm nào , đối số của nó là một
con trỏ hàm trả về kiểu void
void glutMainLoop(void) ;
Cuối cùng ta phải lặp lại hàm main liên tục để “trình diễn hình ảnh”. Giống như
ngươi ta làm phim hoạt hình đó, các frame nối tiếp nhau trên một màn ảnh.
Buộc việc vẽ hoàn tất
7
Page 7
Đối với các ứng dụng đồ họa chạy qua mạng, trong đó client chạy phần chương
trình chính và hiển thị kết quả đến server, thương thì client sẽ gom nhiều lệnh vẽ
vào một packet, sau đó mới gửi đến server. Nhưng làm sao để client biết được khi
nào thì ảnh trên server đã vẽ xong và gửi tiếp packet khác? Do đó nó sẽ đợi đến khi
nào packet đầy mới gửi tiếp. Nhưng packet có thể không bao giơ đầy vì việc vẽ
bên client đã hoàn tất và như vậy server không thấy được trọn vein kết quả vẽ
OpenGL cung cấp hàm glFlush() để chúng ta giải quyết vấn đề này. Lệnh này buộc
client gửi packet ngay cả khi packet chưa đầy. Lệnh này không đợi cho việc vẽ
hoàn tất, nó buộc việc vẽ phải bắt đầu thực hiện và do đó đảm bảo tất cả các lệnh
trước đó thực hiện trong một thơi gian giới hạn. Nếu máy chạy local thì ta không
cần dùng lệnh này.
Một lệnh khác cũng gần giống là lệnh glFinish(), nó thực hiện chức năng giống
glFlush() nhưng nó đợi phản hồi từ phần cứng đang vẽ hoặc mạng để khẳng định
việc vẽ đã hoàn tất. Lệnh này hữu dụng khi ta muốn đồng bộ hóa các phần vẽ. Ví
dụ ta muốn một phần nào đó vẽ hoàn tất xong thì mới thực hiện các phần khác.
Nhưng lạm dụng lệnh này sẽ làm chậm chương trình vì nó phải đợi phản hồi.
Phần II. Code và chương trình
chạy đồ thị
1. Code chính chạy đồ thị
Dưới đây là code để chạy DTHS cần vẽ.
#include<windows.h>
vediem("* CHAO MUNG CAC BAN DEN VOI BAI GIANG VE HAM
SO.",-0.1,0.5);
vediem("* BAI GIANG DUOC THUC HIEN BOI NHOM 19-H3TK5.",0.1,0.3);
vediem("* CHUC CAC BAN CO MOT BUOI HOC VUI VE.",-0.1,0.1);
9
Page 9
vediem("* XIN VUI LONG NHAP PHAI CHUOT VA CHON MUC CHO
BAI HOC.",-0.1,-0.1);
vediem("THANK YOU!!!",0.8,-0.8);
glFlush();
}
//----------------************ CAC BUOC VE DO THI*******---------------------void hamso0()
{ glClearColor(0.0,0.0,0.0,0.0);//---------***********XOA MAU********-------glShadeModel(GL_SMOOTH);
glColor4d(0.9,0.7,0.5,0.2);//-----*****TAO MAU CHO NET VE*********-----glClear(GL_COLOR_BUFFER_BIT);//-------******XOA MAN HINH TRONG
WINDAOW***----setWindow(-1.50,1.50,-1.50,1.50);//------******CUA SO*****-------------------setViewport(-50,600,-90,670); //------****KHUNG NHIN*****-------------------//--------------*************CAC BUOC VE DO THI**********-------------vediem("*____CAC BUOC VE DTHS____*",-0.7,1.0);
vediem("* B1: Tim TXD cua ham so",-0.1,0.9);
vediem(" - Voi ham bac 3,4 co TXD la |R",-0.1,0.8);
vediem(" - Voi ham y=(ax+b)/(cx+d) thi co TXD la |R\{-d/c}",-0.1,0.7);
vediem("* B2: Khao sat su bien thien cua ham so",-0.1,0.6);
vediem(" . Tinh y',giai PT y'=0",-0.1,0.5);
vediem(" . Tinh cac gioi han(tiem can_neu co)",-0.1,0.4);
vediem(" . Lap bang bien thien",-0.1,0.3);
vediem(" . Tu bang bien thien suy ra",-0.1,0.2);
vediem(" - Cac khoang dong bien, ngich bien cua ham so",-0.1,0.1);
vediem(" - Cac diem cuc tri(neu co) cua ham so",-0.1,0.0);
vediem("* B3: Ve DTHS",-0.1,-0.1);
vediem(" . Tim giao diem cua DT voi truc Oy( cho x=0, tinh y",-0.1,-0.2);
vediem(" . Tim giao diem cua DT voi truc Ox( cho y=0, tinh x",-0.1,-0.3);
glVertex2f(0.0,-1.1);
//-----------**************VE MUI TEN CHO DO THI**************-----glVertex2f(1.2,0);
glVertex2f(1.15,0.025);
glVertex2f(1.2,0);
glVertex2f(1.15,-0.025);
glVertex2f(0,1.1);
glVertex2f(-0.025,1.05);
glVertex2f(0,1.1);
glVertex2f(0.025,1.05);
glEnd();
//------------******** CHIA TOA DO CHO DO THI************-------------glBegin(GL_LINES);//-----------**********DANH DAU DO THI******-----11
Page 11
glVertex2f(0.15,0);//-------********DANH DAU TRUC OX**********------glVertex2f(0.15,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(0.3,0);
glVertex2f(0.3,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(0.45,0);
glVertex2f(0.45,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(0.6,0);
glVertex2f(0.6,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(0.75,0);
glBegin(GL_LINES);
glVertex2f(-0.75,0);
glVertex2f(-0.75,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(-0.9,0);
glVertex2f(-0.9,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(-1.05,0);
glVertex2f(-1.05,0.02);
glEnd();
glBegin(GL_LINES);//---------********DANH DAU TRUC OY********----glVertex2f(0,0.2);//---------********DANH DAU TRUC DUONG OY****--glVertex2f(0.02,0.2);
glEnd();
glBegin(GL_LINES);
glVertex2f(0,0.4);
glVertex2f(0.02,0.4);
glEnd();
glBegin(GL_LINES);
glVertex2f(0,0.6);
glVertex2f(0.02,0.6);
glEnd();
glBegin(GL_LINES);
glVertex2f(0,0.8);
glVertex2f(0.02,0.8);
glEnd();
glBegin(GL_LINES);
glVertex2f(0,1.0);
glVertex2f(0.02,1.0);
glEnd();
vediem("-1",0.05,-0.2);
vediem("-2",0.05,-0.4);
vediem("-3",0.05,-0.6);
vediem("-4",0.05,-0.8);
vediem("-5",0.05,-1.0);
vediem("NHOM 19_HTTT_VE DTHS",0.3,-1.1);
//------------*************DANH DAU TRUC OX*********----------------------vediem("1",0.15,-0.05);
vediem("2",0.3,-0.05);
vediem("3",0.45,-0.05);
vediem("4",0.6,-0.05);
vediem("5",0.75,-0.05);
vediem("6",0.9,-0.05);
vediem("7",1.05,-0.05);
14
Page 14
vediem("Ox",1.2,-0.06);
vediem("-1",-0.15,-0.05);
vediem("-2",-0.3,-0.05);
vediem("-3",-0.45,-0.05);
vediem("-4",-0.6,-0.05);
vediem("-5",-0.75,-0.05);
vediem("-6",-0.9,-0.05);
vediem("-7",-1.05,-0.05);
vediem("Do thi ham so Y=AX^3+BX^2+CX+D",1.05,1.1);
vediem("Voi A>0 va y'=0 co nghiem kep",1.05,1);
vediem("Do thi co 1 diem uon",1.05,0.9);
//--------------*************CAC BUOC VE DO THI**********------------------//----------------**********VE HAM SO************------------------------------//----------**************NHAP DANG DO THI CAN VE*******---------------float x=-0.45;
float dx=0.0001;
glVertex2f(0.0,1.1);//------------*********VE OY**********---------------glVertex2f(0.0,0.0);
glVertex2f(0.0,-1.1);
//-----------**************VE MUI TEN CHO DO THI**************---------glVertex2f(1.2,0);
glVertex2f(1.15,0.025);
glVertex2f(1.2,0);
glVertex2f(1.15,-0.025);
glVertex2f(0,1.1);
glVertex2f(-0.025,1.05);
glVertex2f(0,1.1);
glVertex2f(0.025,1.05);
glEnd();
//------------******** CHIA TOA DO CHO DO THI************-----------------glBegin(GL_LINES);//-----------**********DANH DAU DO THI******-----glVertex2f(0.15,0);//-------********DANH DAU TRUC OX**********------glVertex2f(0.15,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(0.3,0);
glVertex2f(0.3,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(0.45,0);
glVertex2f(0.45,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(0.6,0);
glVertex2f(0.6,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(0.75,0);
16
Page 16
glEnd();
glBegin(GL_LINES);
glVertex2f(-0.9,0);
glVertex2f(-0.9,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(-1.05,0);
glVertex2f(-1.05,0.02);
glEnd();
glBegin(GL_LINES);//---------********DANH DAU TRUC OY********----glVertex2f(0,0.2);//---------********DANH DAU TRUC DUONG OY****--17
Page 17
glVertex2f(0.02,0.2);
glEnd();
glBegin(GL_LINES);
glVertex2f(0,0.4);
glVertex2f(0.02,0.4);
glEnd();
glBegin(GL_LINES);
glVertex2f(0,0.6);
glVertex2f(0.02,0.6);
glEnd();
glBegin(GL_LINES);
glVertex2f(0,0.8);
glVertex2f(0.02,0.8);
glEnd();
glBegin(GL_LINES);
glVertex2f(0,1.0);
glVertex2f(0.02,1.0);
vediem("O",0.02,-0.05);
vediem("-1",0.05,-0.2);
vediem("-2",0.05,-0.4);
vediem("-3",0.05,-0.6);
vediem("-4",0.05,-0.8);
vediem("-5",0.05,-1.0);
vediem("NHOM 19_HTTT_VE DTHS",0.3,-1.1);
//------------*************DANH DAU TRUC OX*********----------------------vediem("1",0.15,-0.05);
vediem("2",0.3,-0.05);
vediem("3",0.45,-0.05);
vediem("4",0.6,-0.05);
vediem("5",0.75,-0.05);
vediem("6",0.9,-0.05);
vediem("7",1.05,-0.05);
vediem("Ox",1.2,-0.06);
vediem("-1",-0.15,-0.05);
vediem("-2",-0.3,-0.05);
vediem("-3",-0.45,-0.05);
vediem("-4",-0.6,-0.05);
vediem("-5",-0.75,-0.05);
vediem("-6",-0.9,-0.05);
vediem("-7",-1.05,-0.05);
vediem("Do thi ham so Y=AX^3+BX^2+CX+D",1.05,1.1);
vediem("Voi A>0 va pt y'=0 vo nghiem",1.05,1);
vediem("Do thi khong co diem uon",1.05,0.9);
//--------------*************CAC BUOC VE DO THI**********------------------//----------------**********VE HAM SO************------------------------------//----------**************NHAP DANG DO THI CAN VE*******---------------float x=-0.35;
float dx=0.0001;
float a= 10;
19
Page 19
//-----------**************VE MUI TEN CHO DO THI**************---------glVertex2f(1.2,0);
glVertex2f(1.15,0.025);
glVertex2f(1.2,0);
glVertex2f(1.15,-0.025);
glVertex2f(0,1.1);
20
Page 20
glVertex2f(-0.025,1.05);
glVertex2f(0,1.1);
glVertex2f(0.025,1.05);
glEnd();
//------------******** CHIA TOA DO CHO DO THI************-----------------glBegin(GL_LINES);//-----------**********DANH DAU DO THI******-----glVertex2f(0.15,0);//-------********DANH DAU TRUC OX**********------glVertex2f(0.15,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(0.3,0);
glVertex2f(0.3,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(0.45,0);
glVertex2f(0.45,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(0.6,0);
glVertex2f(0.6,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(0.75,0);
glVertex2f(0.75,0.02);
glVertex2f(-0.75,0);
glVertex2f(-0.75,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(-0.9,0);
glVertex2f(-0.9,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(-1.05,0);
glVertex2f(-1.05,0.02);
glEnd();
glBegin(GL_LINES);//---------********DANH DAU TRUC OY********----glVertex2f(0,0.2);//---------********DANH DAU TRUC DUONG OY****--glVertex2f(0.02,0.2);
glEnd();
glBegin(GL_LINES);
glVertex2f(0,0.4);
glVertex2f(0.02,0.4);
glEnd();
glBegin(GL_LINES);
glVertex2f(0,0.6);
glVertex2f(0.02,0.6);
glEnd();
glBegin(GL_LINES);
glVertex2f(0,0.8);
glVertex2f(0.02,0.8);
glEnd();
glBegin(GL_LINES);
glVertex2f(0,1.0);
glVertex2f(0.02,1.0);
22
Page 22
vediem("-2",0.05,-0.4);
vediem("-3",0.05,-0.6);
vediem("-4",0.05,-0.8);
vediem("-5",0.05,-1.0);
vediem("NHOM 19_HTTT_VE DTHS",0.3,-1.1);
//------------*************DANH DAU TRUC OX*********----------------------vediem("1",0.15,-0.05);
23
Page 23
vediem("2",0.3,-0.05);
vediem("3",0.45,-0.05);
vediem("4",0.6,-0.05);
vediem("5",0.75,-0.05);
vediem("6",0.9,-0.05);
vediem("7",1.05,-0.05);
vediem("Ox",1.2,-0.06);
vediem("-1",-0.15,-0.05);
vediem("-2",-0.3,-0.05);
vediem("-3",-0.45,-0.05);
vediem("-4",-0.6,-0.05);
vediem("-5",-0.75,-0.05);
vediem("-6",-0.9,-0.05);
vediem("-7",-1.05,-0.05);
vediem("Do thi ham so Y=AX^3+BX^2+CX+D",1.05,1.1);
vediem("Voi A>0 va y'=0 co 2 nghiem phan biet",1.05,1);
vediem("Do thi cat truc ox tai 3 diem phan biet",1.05,0.9);
//--------------*************CAC BUOC VE DO THI**********------------------//----------------**********VE HAM SO************------------------------------//----------**************NHAP DANG DO THI CAN VE*******---------------float x=-0.37;
float dx=0.0001;
float a= 10;
glVertex2f(0.0,1.1);//------------*********VE OY**********---------------glVertex2f(0.0,0.0);
glVertex2f(0.0,-1.1);
//-----------**************VE MUI TEN CHO DO THI**************-----glVertex2f(1.2,0);
glVertex2f(1.15,0.025);
glVertex2f(1.2,0);
glVertex2f(1.15,-0.025);
glVertex2f(0,1.1);
glVertex2f(-0.025,1.05);
glVertex2f(0,1.1);
glVertex2f(0.025,1.05);
glEnd();
//------------******** CHIA TOA DO CHO DO THI************-------------glBegin(GL_LINES);//-----------**********DANH DAU DO THI******-----glVertex2f(0.15,0);//-------********DANH DAU TRUC OX**********------glVertex2f(0.15,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(0.3,0);
glVertex2f(0.3,0.02);
glEnd();
glBegin(GL_LINES);
glVertex2f(0.45,0);
glVertex2f(0.45,0.02);
glEnd();
25
Page 25