You are on page 1of 3

BÀI TẬP VẺ ĐOẠN THẲNG

Bài 1.

a) Hãy tính giá trị các điểm tọa độ nguyên hiển thị trên màn hình để vẽ đoạn thẳng
nối 2 điểm A(12, 20) và B(25, 37) bằng thuật toán DDA.
i xi yi pi
0 12 20 20
1 13 21 21.3
2 14 23 22.6
3 15 24 23.9
4 16 25 25.2
5 17 27 26.5
6 18 28 27.8
7 19 29 29.1
8 20 30 30.4
9 21 32 31.7
10 22 33 33
11 23 34 34.3
12 24 36 35.6
13 25 37 36.9

b) Cài đặt minh họa thuật toán DDA bằng ngôn ngữ C/C++.
#define Round(a) int(a+0.5)
int Color = GREEN;
void LineDDA (int x1, int y1, int x2, int y2)
{
int x = x1;
float y = y1;
float m = float(y2-y1)/(x2-x1);
putpixel(x, Round(y), Color);
for(int i=x1; i<x2; i++)
{
x++;
y +=m;
putpixel(x, Round(y), Color);
}
c) Vấn đề tối ưu trong trong các thuật toán vẻ đường thẳng là gì?
Cải thiện tốc độ : Sử dụng công thức yi + 1 = yi + m thay cho y = mx + b, tránh
phép nhân số thực

Bài 2.
a) Trình bày hàm vẽ đường thẳng theo thuật toán Bresenham bằng ngôn ngữ C++ vẻ
đường thằng từ tọa độ (x1, y1) đến tọa độ (x2, y2):
void LineBresenham(int x1, int y1, int x2, int y2, int color)
{
int Dx, Dy, p, Const1, Const2;
int x, y;
Dx = x2 - x1;
Dy = y2 - y1;
p = 2*Dy - Dx; // Dy <<1 - Dx
Const1 = 2*Dy; // Dy <<1
Const2 = 2*(Dy-Dx); // (Dy-Dx) <<1
x = x13;
y = y1;
putpixel(x, y, Color);
for(i=x1; i<x2; i++)
{
if (p<0)
p += Const1;
else
{
p += Const2;
y++;
}
x++;
putpixel(x, y, Color);
}

b) Hãy tính giá trị các điểm tọa độ nguyên hiển thị trên màn hình để vẽ đoạn thẳng
nối 2 điểm A(11, 20) đến B(22, 27)
• Dx = 22-11=11 , Dy = 27-20=7
• Const1 = 2Dy = 14, Const2 = 2(Dy-Dx) = -8
• Po = 2Dy – Dx = 14 – 11 = 3
i xi yi pi
0 11 20 3
1 12 21 -5
2 13 21 9
3 14 22 1
4 15 23 -7
5 16 23 7
6 17 24 -1
7 18 24 13
8 19 25 5
9 20 26 -3
10 21 26 11
11 22 27 3

c) Ý tưởng chính của thuật toán nằm ở chỗ nào? Tại sao phải so sánh giá trị pi với 0
trong thuật toán Bresenham, bản chất của việc so sánh này là gì?
Ý tưởng chính của thuật toán nằm ở chỗ xét dấu Pi để quyết định điểm kế tiếp, và sử dụng
công thức truy hồi Pi + 1 – Pi để tính Pi bằng các phép toán đơn giản trên số nguyên. Giá trị Pi
tạo ra không có phép chia nguyên , tính toán nhanh và chính xác hơn là tính trực tiếp

You might also like