You are on page 1of 4

Ngô Huỳnh Kiều Nga

Lý thuyết
Bài 1: Hãy chạy bằng tay giải thuật Bresenham, vẽ đường ellipse, tâm (0,0) với
a=10, b=8.
2
a
XT = = 7,8
√ a2 +b2
x y Pi Tính Pi P
2 2
0 8 P1 10 ( 1− 2.8 ) +2.8 -1372
2
1 8 P2 −1372+2.8 ( 2.0+3 ) -988
2
2 8 P3 − 988+2.8 ( 2.1+ 3 ) -348
2
3 8 P4 −348+ 2.8 ( 2.2+3 ) 548
2 2
4 7 P5 548+2.8 ( 2.3+3 )+ 4.10 ( 1− 8 ) -1100
2
5 7 P6 −1100+2.8 ( 2.4+3 ) 308
2 2
6 6 P7 308+2.8 ( 2.5+3 )+ 4.10 ( 1− 7 ) -428
2
7 6 P8 − 428+2.8 ( 2.6+3 ) 1492

Bài 2: Hãy chạy bằng tay giải thuật Midpoint, vẽ đường ellipse tâm (0,0) với
a=10, b=8.
#include <GL/glut.h>
#include <vector>

struct Point {
double x, y;

Point(double _x, double _y) : x(_x), y(_y) {}


};

class Polygon {
public:
std::vector<Point> vertices;

void addVertex(double x, double y) {


vertices.push_back(Point(x, y));
}
};

Polygon samplePolygon; // Đa giác mẫu

void createSamplePolygon() {
samplePolygon.addVertex(-0.5, -0.5);
samplePolygon.addVertex(0.5, -0.5);
samplePolygon.addVertex(0.5, 0.5);
samplePolygon.addVertex(-0.5, 0.5);
}

void drawPolygon() {
glBegin(GL_LINE_LOOP);
glColor3f(1.0, 1.0, 1.0); // Màu vẽ (trắng)
for (const Point& vertex : samplePolygon.vertices) {
glVertex2f(vertex.x, vertex.y);
}
glEnd();
}

void display() {
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -5.0f);

drawPolygon();

glFlush();
}

void init() {
glClearColor(0.0, 0.0, 0.0, 0.0); // Màu nền đen
}

int main(int argc, char** argv) {


createSamplePolygon();

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400, 400);
glutCreateWindow("OpenGL Polygon");

init();
glutDisplayFunc(display);
glutMainLoop();

return 0;
}
Bài 3: Hãy so sánh 2 giải thuật và 2 chương trình Bresenham và Midpoint để vẽ
đường ellipse.
So sánh giữa Bresenham và Midpoint:
 Cả hai giải thuật đều sử dụng nguyên tắc tìm điểm trung điểm (Midpoint)
để quyết định điểm tiếp theo trên đường vẽ.
 Cả hai đều giả định rằng giá trị của hàm đường thẳng là một hằng số trên
các đoạn nằm giữa hai điểm.
Bài 4: SV tìm hiểu thêm về sự kiện thay đổi kích thước cửa sổ. Cho các ví dụ
đơn giản.
#include <GL/glut.h>

float trianglePositionX = 0.0f; // Vị trí ban đầu của tam giác theo trục x
float trianglePositionY = 0.0f; // Vị trí ban đầu của tam giác theo trục y

void drawTriangle() {
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 1.0f, 1.0f); // Màu trắng
glVertex2f(trianglePositionX, trianglePositionY + 0.2f); // Đỉnh trên
glVertex2f(trianglePositionX - 0.2f, trianglePositionY - 0.2f); // Đỉnh dưới
bên trái
glVertex2f(trianglePositionX + 0.2f, trianglePositionY - 0.2f); // Đỉnh dưới
bên phải
glEnd();
}

void display() {
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();

drawTriangle();

glFlush();
}

void timer(int value) {


// Di chuyển tam giác dọc theo trục y sau mỗi lần gọi timer
trianglePositionY -= 0.01f;

glutPostRedisplay(); // Yêu cầu cập nhật lại cửa sổ đồ họa


// Gọi lại hàm timer sau một khoảng thời gian (ở đây là 10ms)
glutTimerFunc(10, timer, 0);
}

void init() {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Màu nền đen
}

int main(int argc, char** argv) {


glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400, 400);
glutCreateWindow("Moving Triangle");

init();
glutDisplayFunc(display);

// Gọi hàm timer để bắt đầu di chuyển tam giác


glutTimerFunc(0, timer, 0);

glutMainLoop();

return 0;
}

Bài 5: SV hãy viết thuật toán trung điểm vẽ cung CB cho hình ellipse.

You might also like