Bài tập thực hành đồ họa máy tính - các đối tượng đồ họa cơ bản | Đại học Bách Khoa, Đại học Đà Nẵng

Bài tập thực hành đồ họa máy tính - các đối tượng đồ họa cơ bản | Đại học Bách Khoa, Đại học Đà Nẵng giúp sinh viên tham khảo, ôn luyện và phục vụ nhu cầu học tập của mình cụ thể là có định hướng, ôn tập, nắm vững kiến thức môn học và làm bài tốt trong những bài kiểm tra, bài tiểu luận, bài tập kết thúc học phần, từ đó học tập tốt và có kết quả cao cũng như có thể vận dụng tốt những kiến thức mình đã học

BÀI THỰC HÀNH ĐỒ HỌA MÁY TÍNH
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ BẢN
Nhóm học phần:
Mã Sinh viên, Họ và Tên:
1) 102220052, Nguyễn Phương Bình.
2) 102220056, Nguyễn Hồ Bá Doãn.
3) 102220065, Hồ Xuân Huy.
MỤC LỤC
1. Chuẩn bị....................................................................................................................1
2. Chương trình lab01hcn.cpp.....................................................................................2
3. Chương trình lab01hinhcau.cpp.............................................................................3
4. Bài tập.......................................................................................................................4
1. Chuẩn bị
Cấu hình Project sử dụng thư viện OpenGL trong Dev-Cpp
Tải file từ LINK01 và giải nén vào thư mục Dev-Cpp 5.7.1.rar C:\ Dev-Cpp 5.7.1
Vào thư mục Dev-Cpp 5.7.1\libOpenGL: Sao chép các file thư viện glut32.dll,
glut.dll, glut32.dll vào hai thư mục sau:
C:\Windows\SysWOW64\*.*
C:\Windows\System32\*.*
Tạo mới một Project: Menu => Chọn . Nhập tên. OKFile\New\Project Empty Project
Trong cửa sổ (hoặc nhấn Alt + P): Chọn Project Options tab Parameter => Linker
khai báo như sau:
-lglu32 -lglut32 -lopengl32
KhoaCNTT – Trường ĐHBK 1
Chọn OK.
Trong Project vừa tạo, tạo một tập tin chương trình và lưu lab01*.cpp
2. Chương trình lab01hcn.cpp
Vẽ một hình chữ nhật màu trắng trên nền đen
#include "GL/glut.h"
//Ham thuc hien ve doi tuong
void display(void)
{
//Xoa moi pixel
glClear(GL_COLOR_BUFFER_BIT);
// Ve hinh chu nhat co diem trai-tren (0.25, 0.25, 0.0) va phai-duoi
// (0.75, 0.75, 0.0)
glColor3f (1.0, 1.0, 1.0); //Thiet lap mau ve: mau trang
glBegin(GL_POLYGON); //Bat dau ve da giac
glVertex3f (0.25, 0.25, 0.0); //cac dinh cua da giac
glVertex3f (0.75, 0.25, 0.0);
glVertex3f (0.75, 0.75, 0.0);
glVertex3f (0.25, 0.75, 0.0);
glEnd(); //Ket thuc ve da giac
glFlush (); //Thuc hien qua trinh day ra buffer
}
// Ham khoi tao cac thông so khi chay
void init (void)
{
//Chon mau de xoa nen
glClearColor (0.0, 0.0, 0.0, 0.0); /* mau den */
//Thiet lap cac thong so cho view
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
//Khoi tao che do ve single buffer va he mau RGB
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
//Khoi tao window kich thuoc 250 x 250
glutInitWindowSize (250, 250);
//Khoi tao window tai vi tri (100,100) tren screen
glutInitWindowPosition (100, 100);
glutCreateWindow (" "); // Thay ten SV vaoLab01 HO VA TEN
//Khoi tao mot so che do do hoa
init ();
glutDisplayFunc(display); //Thiet lap ham ve la ham display()
glutMainLoop(); //Bat dau chu trinh lap the hien ve
return 0;
} //main
KhoaCNTT – Trường ĐHBK 2
Kết quả
>> Sinh viên chụp kết quả chạy chương trình tại đây. Chú ý đặt tên cửa sổ Chương trình
là Họ và tên SV
3. Chương trình lab01hinhcau.cpp
Vẽ mặt cầu/bình trà
#include <GL/glut.h>
#include <math.h>
#include "stdio.h"
#define M_PI 3.14159265358979323846
static GLfloat gocX = 0.0f;
static GLfloat gocY = 0.0f;
static GLfloat gocZ = 0.0f;
static GLfloat size = 0.5;
int HinhVe=1;
void veBinhTra(GLfloat s)
{
glutWireTeapot(s);
}
void veMatCong(float r) //ve mat cau
{
float x,y,z,Delta_U,Delta_V,u,v,Pi_2;
Pi_2 = M_PI/2;
Delta_U = 0.1;
Delta_V=0.1;
glBegin(GL_POINTS);
for(v = -Pi_2;v<Pi_2;v+=Delta_V)
{
for(u=0;u<2*M_PI;u+=Delta_U)
{
x= r*cos(u)*cos(v);
y= r*sin(u)*cos(v);
z= r*sin(v);
glVertex3f(x,y,z);
}
}
glEnd();
}
//----------------------------------------------------
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(gocX, 1.0f, 0.0f, 0.0f);
glRotatef(gocY, 0.0f, 1.0f, 0.0f);
KhoaCNTT – Trường ĐHBK 3
glRotatef(gocZ, 0.0f, 0.0f, 1.0f);
//Goi cac ham ve mat tron xoay o day
switch (HinhVe) {
case 1 : veBinhTra(size); break;
case 2 : veMatCong (size); break;
default: break;
}
glPopMatrix();
glutSwapBuffers();
}
void myKeyboard(int key, int x, int y)
{
if(key == GLUT_KEY_END) exit(0);
if(key == GLUT_KEY_DOWN) gocX-= 5.0f;
if(key == GLUT_KEY_UP) gocX += 5.0f;
if(key == GLUT_KEY_RIGHT) gocY -= 5.0f;
if(key == GLUT_KEY_LEFT) gocY += 5.0f;
if(key == GLUT_KEY_PAGE_DOWN) gocZ -= 5.0f;
if(key == GLUT_KEY_PAGE_UP) gocZ += 5.0f;
glutPostRedisplay();
}
void myColor(unsigned char k, int x, int y)
{
printf("k= %d",k);
switch (k) {
case 114 : glColor3f(1, 0, 0); //r
glutPostRedisplay();
break;
case 103 : glColor3f(0, 1, 0); //g
glutPostRedisplay();
break;
case 98 : glColor3f(0, 0, 1); //b
glutPostRedisplay();
break;
case 49 : HinhVe=1;
glutPostRedisplay();
break;
case 50 : HinhVe=2;
glutPostRedisplay();
break;
default: break;
}
}
void myMouse(int button, int state, int x, int y)
{
if ((button==GLUT_LEFT_BUTTON) & (state==GLUT_DOWN)) size = size + 0.05;
if ((button==GLUT_RIGHT_BUTTON) & (state==GLUT_DOWN)) size = size - 0.05;
glutPostRedisplay();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (600, 600);
glutInitWindowPosition (50, 50);
glutCreateWindow("Lab01 HO VÀ TEN");
glClearColor(0.0, 0.0, 0.0, 0.0 );
glColor3f(0, 0, 1);
glutDisplayFunc(myDisplay);
glutSpecialFunc(myKeyBoard);
glutKeyboardFunc(myColor);
glutMouseFunc(myMouse);
glutMainLoop();
return 0;
}//main
Kết quả
KhoaCNTT – Trường ĐHBK 4
4. Bài tập
1. Lập trình OpenGL vẽ một đối tượng đơn giản (ngôi nhà, khối tứ diện, …)
2. Lập trình OpenGL 2D vẽ một đường tròn ngoại tiếp/nộp tiếp tam giác ABC các
điểm A(x , y ), B(x , y ), C(x , y ) cho trước không thẳng hàng.
a a b b c c
3. Lập trình OpenGL 2D vẽ logo Khoa CNTT Trường ĐHBK.
4. Lập trình OpenGL 2D vẽ các đường cong biểu diễn dưới dạng tham số như dưới đây.
Lưu ý thiết lập cửa sổ, khung nhìn khoảng biến thiên thích hợp cho tham số , để t
được kết quả như hình sau.
y=sin(x)
y=cos(x)
x = t + 2.0*sin(2.0*t); y = t + 2.0*cos(5.0*t);
x = cos(t) - cos(80*t)*sin(t); y = 2.0*sin(t) - sin(80*t);
x = cos(t); y = sin(t + sin(5.0*t));
x = sin(t+sin(t)); y = cos(t + cos(t));
x = t + sin(2.0*t); y = t + sin(3.0*t);
x = sin(3.0*t); y = sin(4.0*t);
KhoaCNTT – Trường ĐHBK 5
Hình 16 Đường cong tham số
5. Lập trình OpenGL 2D vẽ ngôi sao 5 cánh
Một ngôi sao có 5 đỉnh sẽ cách đều tâm, hai đỉnh kề nhau sẽ cách nhau một góc 72 .
o
Để xác định đỉnh, chúng ta chỉ cần chọn 1 điểm cách tâm 1 khoảng r, sau đó quay quanh tâm
theo góc 72 ta sẽ được đỉnh tiếp theo.
o
Từ 5 đỉnh của ngôi sao, sử dụng thuật toán nối các điểm thành các đường thẳng tạo thành
ngôi sao.
Thuật toán
+ Bước 1: Xác định đỉnh của ngôi sao bằng công thức
x[i] = x *cos(i* 72 ) – y *sin(y * 72 ) + (y +r)sin(i * 72 ) + x(1- cos(i*72
o o o o
))
y[i] = x *sin(i* 72 ) + y *cos(y * 72 ) + (y +r)(1-cos(i * 72 )) + x*sin(i*72 )
o o o o
+ Bước 2: Sử dụng lệnh kẻ đường thẳng nối các điểm: 1 và 3, 1 và 4, 2 và 3, 2 và 5, 3 và 5.
KhoaCNTT – Trường ĐHBK 6
void ngoisao(Graphics g, intxt, intyt, intr) {
floatx[] = newfloat[5], y[] = newfloat[5], grad = (float) ((72 * 3.14) / 180);
x[0] = xt;
y[0] = yt - r;
for (inti = 1; i < 5; i++) {
x[i] = (float) (x[0] * Math.cos(i * grad) - y[0] * Math.sin(i * grad) + yt *
Math.sin(i * grad) + xt * (1 - Math.cos(i * grad)));
y[i] = (float) (x[0] * Math.sin(i * grad) + y[0] * Math.cos(i * grad) + yt * (1 -
Math.cos(i * grad)) - xt * Math.sin(i * grad));
}//for
}
6. Lập trình OpenGL vẽ quốc kỳ Việt nam
https://giaphiep.com/blog/ve-quoc-ky-viet-nam-bang-flutter-28004
----------------------------------------------------------
KhoaCNTT – Trường ĐHBK 7
| 1/7

Preview text:

BÀI THỰC HÀNH ĐỒ HỌA MÁY TÍNH
CÁC ĐỐI TƯỢNG ĐỒ HỌA CƠ BẢN Nhóm học phần:
Mã Sinh viên, Họ và Tên:

1) 102220052, Nguyễn Phương Bình.
2) 102220056, Nguyễn Hồ Bá Doãn. 3) 102220065, Hồ Xuân Huy. MỤC LỤC
1. Chuẩn bị....................................................................................................................1
2. Chương trình lab01hcn.cpp.....................................................................................2
3. Chương trình lab01hinhcau.cpp.............................................................................3
4. Bài tập.......................................................................................................................4
1. Chuẩn bị
Cấu hình Project sử dụng thư viện OpenGL trong Dev-Cpp
 Tải file Dev-Cpp 5.7.1.rar từ LINK01 và giải nén vào thư mục C:\ Dev-Cpp 5.7.1
 Vào thư mục Dev-Cpp 5.7.1\libOpenGL: Sao chép các file thư viện glut32.dll,
glut.dll, glut32.dll vào hai thư mục sau: C:\Windows\SysWOW64\*.* C:\Windows\System32\*.*
 Tạo mới một Project: Menu File\New\Project => Chọn Empty Project. Nhập tên. OK
 Trong cửa sổ Project Options (hoặc nhấn Alt + P): Chọn tab Parameter => Linker khai báo như sau:
-lglu32 -lglut32 -lopengl32 KhoaCNTT – Trường ĐHBK 1 Chọn OK.
Trong Project vừa tạo, tạo một tập tin chương trình và lưu lab01*.cpp
2. Chương trình lab01hcn.cpp
 Vẽ một hình chữ nhật màu trắng trên nền đen #include "GL/glut.h" //Ham thuc hien ve doi tuong void display(void) { //Xoa moi pixel glClear(GL_COLOR_BUFFER_BIT);
// Ve hinh chu nhat co diem trai-tren (0.25, 0.25, 0.0) va phai-duoi // (0.75, 0.75, 0.0)
glColor3f (1.0, 1.0, 1.0); //Thiet lap mau ve: mau trang
glBegin(GL_POLYGON); //Bat dau ve da giac
glVertex3f (0.25, 0.25, 0.0); //cac dinh cua da giac glVertex3f (0.75, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.25, 0.75, 0.0); glEnd(); //Ket thuc ve da giac glFlush ();
//Thuc hien qua trinh day ra buffer }
// Ham khoi tao cac thông so khi chay void init (void) { //Chon mau de xoa nen
glClearColor (0.0, 0.0, 0.0, 0.0); /* mau den */
//Thiet lap cac thong so cho view glMatrixMode(GL_PROJECTION); glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); }
int main(int argc, char** argv) { glutInit(&argc, argv);
//Khoi tao che do ve single buffer va he mau RGB
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
//Khoi tao window kich thuoc 250 x 250
glutInitWindowSize (250, 250);
//Khoi tao window tai vi tri (100,100) tren screen
glutInitWindowPosition (100, 100); glutCreateWindow (" "); // Thay ten SV vao Lab01 HO VA TEN
//Khoi tao mot so che do do hoa init ();
glutDisplayFunc(display); //Thiet lap ham ve la ham display() glutMainLoop();
//Bat dau chu trinh lap the hien ve return 0; } //main KhoaCNTT – Trường ĐHBK 2  Kết quả
>> Sinh viên chụp kết quả chạy chương trình tại đây. Chú ý đặt tên cửa sổ Chương trình là Họ và tên SV
3. Chương trình lab01hinhcau.cpp
 Vẽ mặt cầu/bình trà #include #include #include "stdio.h"
#define M_PI 3.14159265358979323846 static GLfloat gocX = 0.0f; static GLfloat gocY = 0.0f; static GLfloat gocZ = 0.0f; static GLfloat size = 0.5; int HinhVe=1; void veBinhTra(GLfloat s) { glutWireTeapot(s); }
void veMatCong(float r) //ve mat cau {
float x,y,z,Delta_U,Delta_V,u,v,Pi_2; Pi_2 = M_PI/2; Delta_U = 0.1; Delta_V=0.1; glBegin(GL_POINTS); for(v = -Pi_2;v{
for(u=0;u<2*M_PI;u+=Delta_U) { x= r*cos(u)*cos(v); y= r*sin(u)*cos(v); z= r*sin(v); glVertex3f(x,y,z); } } glEnd(); }
//---------------------------------------------------- void myDisplay(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix();
glRotatef(gocX, 1.0f, 0.0f, 0.0f);
glRotatef(gocY, 0.0f, 1.0f, 0.0f); KhoaCNTT – Trường ĐHBK 3
glRotatef(gocZ, 0.0f, 0.0f, 1.0f);
//Goi cac ham ve mat tron xoay o day switch (HinhVe) { case 1 : veBinhTra(size); break; case 2 : veMatCong (size); break; default: break; } glPopMatrix(); glutSwapBuffers(); }
void myKeyboard(int key, int x, int y) { if(key == GLUT_KEY_END) exit(0); if(key == GLUT_KEY_DOWN) gocX-= 5.0f; if(key == GLUT_KEY_UP) gocX += 5.0f; if(key == GLUT_KEY_RIGHT) gocY -= 5.0f; if(key == GLUT_KEY_LEFT) gocY += 5.0f; if(key == GLUT_KEY_PAGE_DOWN) gocZ -= 5.0f; if(key == GLUT_KEY_PAGE_UP) gocZ += 5.0f; glutPostRedisplay(); }
void myColor(unsigned char k, int x, int y) { printf("k= %d",k); switch (k) { case 114 : glColor3f(1, 0, 0); //r glutPostRedisplay(); break; case 103 : glColor3f(0, 1, 0); //g glutPostRedisplay(); break; case 98 : glColor3f(0, 0, 1); //b glutPostRedisplay(); break; case 49 : HinhVe=1; glutPostRedisplay(); break; case 50 : HinhVe=2; glutPostRedisplay(); break; default: break; } }
void myMouse(int button, int state, int x, int y) {
if ((button==GLUT_LEFT_BUTTON) & (state==GLUT_DOWN)) size = size + 0.05;
if ((button==GLUT_RIGHT_BUTTON) & (state==GLUT_DOWN)) size = size - 0.05; glutPostRedisplay(); }
int main(int argc, char** argv) { glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (600, 600);
glutInitWindowPosition (50, 50);
glutCreateWindow("Lab01 HO VÀ TEN");
glClearColor(0.0, 0.0, 0.0, 0.0 ); glColor3f(0, 0, 1); glutDisplayFunc(myDisplay); glutSpecialFunc(myKeyBoard); glutKeyboardFunc(myColor); glutMouseFunc(myMouse); glutMainLoop(); return 0; }//main  Kết quả KhoaCNTT – Trường ĐHBK 4  4. Bài tập
1. Lập trình OpenGL vẽ một đối tượng đơn giản (ngôi nhà, khối tứ diện, …)
2. Lập trình OpenGL 2D vẽ một đường tròn ngoại tiếp/nộp tiếp tam giác ABC có các điểm A(xa, ya), B(x , y b
b), C(xc, yc) cho trước không thẳng hàng.
3. Lập trình OpenGL 2D vẽ logo Khoa CNTT Trường ĐHBK.
4. Lập trình OpenGL 2D vẽ các đường cong biểu diễn dưới dạng tham số như dưới đây.
Lưu ý thiết lập cửa sổ, khung nhìn và khoảng biến thiên thích hợp cho tham số t, để
được kết quả như hình sau.  y=sin(x)  y=cos(x)
 x = t + 2.0*sin(2.0*t); y = t + 2.0*cos(5.0*t);
 x = cos(t) - cos(80*t)*sin(t); y = 2.0*sin(t) - sin(80*t);
 x = cos(t); y = sin(t + sin(5.0*t));
 x = sin(t+sin(t)); y = cos(t + cos(t));
 x = t + sin(2.0*t); y = t + sin(3.0*t);
 x = sin(3.0*t); y = sin(4.0*t); KhoaCNTT – Trường ĐHBK 5
Hình 16 Đường cong tham số
5. Lập trình OpenGL 2D vẽ ngôi sao 5 cánh 
Một ngôi sao có 5 đỉnh sẽ cách đều tâm, hai đỉnh kề nhau sẽ cách nhau một góc 72 . o 
Để xác định đỉnh, chúng ta chỉ cần chọn 1 điểm cách tâm 1 khoảng r, sau đó quay quanh tâm
theo góc 72 ta sẽ được đỉnh tiếp theo. o 
Từ 5 đỉnh của ngôi sao, sử dụng thuật toán nối các điểm thành các đường thẳng tạo thành ngôi sao. Thuật toán
+ Bước 1: Xác định đỉnh của ngôi sao bằng công thức
x[i] = x *cos(i* 72o) – y *sin(y * 72o) + (y +r)sin(i * 72o) + x(1- cos(i*72o))
y[i] = x *sin(i* 72o) + y *cos(y * 72o) + (y +r)(1-cos(i * 72o)) + x*sin(i*72o)
+ Bước 2: Sử dụng lệnh kẻ đường thẳng nối các điểm: 1 và 3, 1 và 4, 2 và 3, 2 và 5, 3 và 5. KhoaCNTT – Trường ĐHBK 6
void ngoisao(Graphics g, intxt, intyt, intr) {
floatx[] = newfloat[5], y[] = newfloat[5], grad = (float) ((72 * 3.14) / 180); x[0] = xt; y[0] = yt - r;
for (inti = 1; i < 5; i++) {
x[i] = (float) (x[0] * Math.cos(i * grad) - y[0] * Math.sin(i * grad) + yt *
Math.sin(i * grad) + xt * (1 - Math.cos(i * grad)));
y[i] = (float) (x[0] * Math.sin(i * grad) + y[0] * Math.cos(i * grad) + yt * (1 -
Math.cos(i * grad)) - xt * Math.sin(i * grad)); }//for … }
6. Lập trình OpenGL vẽ quốc kỳ Việt nam
https://giaphiep.com/blog/ve-quoc-ky-viet-nam-bang-flutter-28004
---------------------------------------------------------- KhoaCNTT – Trường ĐHBK 7