Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 22

VẼ HÌNH ELIPSE BẰNG

THUẬT TOÁN BRESENHAM


Nhóm trình bày: Nhóm 5
NỘI DUNG TRÌNH BÀY
1. GIỚI THIỆU KHÁI QUÁT VỀ HÌNH ELIPSE BRESENHAM – LÊ MINH
NGHĨA
2. PHÂN TÍCH CHI TIẾT THUẬT TOÁN – PHẠM NĂNG QUYỀN
3. CODE MINH HỌA THUẬT TOÁN VẼ HÌNH ELIPSE – PHẠM ĐỨC ANH
GIỚI THIỆU KHÁI QUÁT VỀ HÌNH
ELIPSE BRESENHAM
LÊ MINH NGHĨA
GIỚI THIỆU KHÁI QUÁT VỀ HÌNH ELIPSE BRESENHAM

Thuật toán Bresenham là một thuật toán được sử dụng để vẽ các


đường thẳng và các hình dạng khác trên màn hình của máy tính hoặc
các thiết bị hiển thị khác. Thuật toán này được đặt tên theo tên của tác
giả của nó, Jack E. Bresenham, và được phát triển vào những năm
1960.
GIỚI THIỆU KHÁI QUÁT VỀ HÌNH ELIPSE BRESENHAM

Thuật toán vẽ đường Ellipse Bresenham sử dụng phương pháp quét


theo chiều cung và chiều ngang để tìm các điểm trên đường Ellipse.
Thuật toán này bắt đầu với việc tính toán bán kính lớn (a) và bán kính
nhỏ (b) của Ellipse. Sau đó, nó tính toán các giá trị đặc trưng cho từng
điểm trên đường Ellipse và vẽ nó trên màn hình.
GIỚI THIỆU KHÁI QUÁT VỀ HÌNH ELIPSE BRESENHAM

Thuật toán sử dụng các giá trị để xác định vị trí của từng điểm trên
đường Ellipse, bao gồm khoảng cách đến điểm tiếp theo, các giá trị sai
số, và các hệ số góc độ. Thuật toán này cần tính toán các giá trị này cho
mỗi điểm trên đường Ellipse, cho đến khi đã vẽ xong toàn bộ đường.
Thuật toán vẽ đường Ellipse Bresenham là một thuật toán hiệu quả
và chính xác để vẽ các đường Ellipse trên màn hình máy tính, và được
sử dụng rộng rãi trong các ứng dụng đồ họa và trò chơi.
PHÂN TÍCH CHI TIẾT THUẬT TOÁN
PHẠM NĂNG QUYỀN
PHÂN TÍCH CHI TIẾT THUẬT TOÁN

Do tính đối xứng qua trục tọa dộ nên chỉ cần vẽ


ellipse, rồi lấy đối xúng qua trục tọa độ

Tại mỗi bước ta cho x tăng từ 0 đến a sau đó


tính y
PHÂN TÍCH CHI TIẾT THUẬT TOÁN

Đầu tiên ta chọn điểm Q là tiếp điểm của


tiếp tuyến ellip hệ số góc -1

Ta chia ellipse thành 2 phần :


+ Phần 1 từ A(0,b) đến Q(x0,y0)
+ Phần 2 từ Q(x0,y0) đến B (a,0)
PHÂN TÍCH CHI TIẾT THUẬT TOÁN
Vẽ phần 1 của ellipse từ (0,b) đến Q(x0,y0):
Giả sử tại bước i ta vẽ được điểm (xi,yi)
Tại bước i+1 phải xác định điểm kế tiếp (xi+1 ,yi+1)
đó là điểm P(xi +1,yi ) hoặc
S(xi +1,yi -1)
Xác định điểm kế tiếp phụ thuộc vào d1 và
d2
PHÂN TÍCH CHI TIẾT THUẬT TOÁN
Vì điểm K(Xi +1, y) thuộc đường ellipse
nên ta có :
y2 = b 2 -

Gọi d1 = yi2 – y2 = yi2 +


d2 = y2 – (yi-1)2= - -(yi-1)2
Xác định điểm kế tiếp phụ thuộc vào d1 và d2
nếu d1-d2<0 thì K gần P nên chọn P
Nếu d1-d2>=0 thì K gần S nên chọn S
PHÂN TÍCH CHI TIẾT THUẬT TOÁN
Từ đó ta có công thức tìm điểm

Suy ra :

Nếu Pi <0 tức d1<d2 thì chọn điểm P(xi+1,yi)


Suy ra
Nếu Pi ≥0 , tức d1 ≥ d2 thì chọn điểm S(xi +1,yi -1),
Suy ra
Điểm đầu tiên (0,b):
PHÂN TÍCH CHI TIẾT THUẬT TOÁN
Vẽ phần thứ 2 của hình ellipse

Dể vẽ phần 2 ta chỉ cần thay đổi vai trò :

+ của x và y
+ của a và B
PHÂN TÍCH CHI TIẾT THUẬT TOÁN
Lưu đồ thuật toán ellipse :
CODE MINH HỌA THUẬT TOÁN VẼ
HÌNH ELIPSE
PHẠM ĐỨC ANH
CODE MINH HỌA THUẬT TOÁN VẼ HÌNH ELIPSE

CODE minh họa Giải thích


void drawEllipse(int x0, int y0, int rx, int ry) Hàm này cần đầu vào là tọa độ tâm của
elip (x0, y0), bán kính trục ngang rx và
bán kính trục dọc ry. Khi được gọi, hàm
sẽ tính toán và vẽ hình elip trên màn
hình bằng thuật toán Bresenham.
CODE MINH HỌA THUẬT TOÁN VẼ HÌNH ELIPSE

CODE minh họa Giải thích


int x = 0, y = ry; Biến x được gán giá trị là 0, và biến y được gán giá trị là bán
kính theo trục y (ry).
int p1 = pow(ry, 2) - pow(rx, 2) * ry +
pow(rx, 2) / 4; Biến p1 được sử dụng để tính toán giá trị lỗi của thuật toán.
Công thức tính giá trị ban đầu của p1 là pow(ry, 2) - pow(rx, 2) *
ry + pow(rx, 2) / 4.
Trong đó, pow(ry, 2) là bình phương của bán kính theo trục y,
pow(rx, 2) là bình phương của bán kính theo trục x, và pow(rx,
2) / 4 là một giá trị hằng số.
Công thức tính giá trị lỗi này được sử dụng để quyết định việc
tăng giá trị của x và y trong quá trình vẽ elipse.
CODE MINH HỌA THUẬT TOÁN VẼ HÌNH ELIPSE

CODE minh họa Giải thích


while (2 * pow(ry, 2) * x < 2 * pow(rx, 2) * y) { Đây là vòng lặp while để vẽ nửa phía trên của hình
putpixel(x0 + x, y0 + y, WHITE); ellipse. Điều kiện dừng của vòng lặp là 2 * ry^2 * x >=
putpixel(x0 - x, y0 + y, WHITE); 2 * rx^2 * y, tức là vẽ tới khi điểm (x, y) của ellipse nằm
putpixel(x0 + x, y0 - y, WHITE); trên đường chéo chính của hình.
putpixel(x0 - x, y0 - y, WHITE); Trong vòng lặp, đầu tiên vẽ 4 điểm ứng với 4 phần tư
if (p1 < 0) { của hình ellipse bằng cách tính toán tọa độ của điểm (x,
x++; y) và lấy tọa độ tâm (x0, y0) làm gốc. Sau đó, nếu giá trị
p1 += 2 * pow(ry, 2) * x + pow(ry, 2); p1 < 0, tăng giá trị x lên 1 và cập nhật p1, nếu không thì
} tăng x và giảm y đi 1 và cập nhật p1. Giá trị p1 được sử
else { dụng để xác định vị trí tiếp theo của điểm trên đường
x++; ellipse.
y--;
p1 += 2 * pow(ry, 2) * x - 2 * pow(rx, 2) * y +
pow(ry, 2);
}
}
CODE MINH HỌA THUẬT TOÁN VẼ HÌNH ELIPSE

CODE minh họa Giải thích


int p2 = pow(ry, 2) * pow((x + 0.5), 2) + Khởi tạo giá trị ban đầu cho biến p2, một biến kiểm soát được
pow(rx, 2) * pow((y - 1), 2) - pow(rx, 2) * sử dụng để xác định các điểm tiếp theo của elip. Công thức tính
pow(ry, 2); giá trị của p2 dựa trên công thức phương trình elip theo
Bresenham và điểm trên elip gần nhất đã được vẽ.
Cụ thể, công thức tính p2 là: ry^2 * (x+0.5)^2 + rx^2 * (y-1)^2 -
rx^2 * ry^2.
Trong đó, x là toạ độ của điểm trên trục ngang, y là toạ độ của
điểm trên trục dọc, rx và ry lần lượt là bán trục ngang và bán
trục dọc của elip, và (x+0.5, y-1) là điểm gần nhất đã được vẽ.
CODE MINH HỌA THUẬT TOÁN VẼ HÌNH ELIPSE

CODE minh họa Giải thích


while (y >= 0) { Vòng lặp while này sẽ chạy từ y = ry cho đến y = 0.
putpixel(x0 + x, y0 + y, WHITE); Trong mỗi lần lặp, tương tự như phần đầu hàm drawEllipse(),
putpixel(x0 - x, y0 + y, WHITE); chúng ta sẽ vẽ 4 điểm đối xứng qua các trục tọa độ.
putpixel(x0 + x, y0 - y, WHITE); Sau đó, chúng ta sẽ tính giá trị mới của p2, tương tự như cách
putpixel(x0 - x, y0 - y, WHITE); tính p1 ở phần đầu của hàm. p2 được tính để xác định việc chọn
if (p2 > 0) { điểm ở trên hay dưới đường tròn để vẽ tiếp.
y--; Nếu p2 > 0, ta chọn điểm nằm dưới đường tròn để vẽ, giảm giá
p2 -= 2 * pow(rx, 2) * y + pow(rx, 2); trị y đi 1 đơn vị và tính lại giá trị mới của p2.
}else { Ngược lại, nếu p2 <= 0, ta chọn điểm nằm trên đường tròn để
y--; vẽ, tăng giá trị x lên 1 đơn vị và tính lại giá trị mới của p2.
x++; Vòng lặp này sẽ tiếp tục lặp lại cho đến khi y = 0, tức là đã vẽ
p2 += 2 * pow(ry, 2) * x - 2 * pow(rx, 2) * y + hết elip.
pow(rx, 2);
}
}
CODE MINH HỌA THUẬT TOÁN VẼ HÌNH ELIPSE

CODE minh họa Giải thích


int main() { Hàm int gd = DETECT, gm; khởi tạo cấu hình đồ hoạ và tạo ra
int gd = DETECT, gm; biến gd để lưu trữ thông tin đồ hoạ.
initgraph(&gd, &gm, ""); Hàm initgraph(&gd, &gm, ""); tạo ra một cửa sổ đồ hoạ để vẽ
các hình ảnh, sử dụng thông số gd để thiết lập kiểu đồ hoạ và
drawEllipse(300, 200, 100, 50); gm để thiết lập kích thước của cửa sổ.
Hàm drawEllipse(300, 200, 100, 50); gọi hàm drawEllipse để vẽ
getch(); hình ellipse tại tọa độ (300, 200) với bán trục lớn a=100 và bán
closegraph(); trục nhỏ b=50.
Hàm getch(); chờ đợi người dùng bấm một phím bất kỳ trên
return 0; bàn phím để đóng cửa sổ đồ hoạ.
} Hàm closegraph(); đóng cửa sổ đồ hoạ và giải phóng bộ nhớ.
Hàm return 0; trả về giá trị 0 để kết thúc chương trình.
THANKS FOR WATCHING
OUR PRESENTATION

You might also like