Professional Documents
Culture Documents
kịch bản
kịch bản
T i
gia
n
1 Slide mở đầu = Tên nhóm + Mở slide
Thành viên + Đề tài Xin chào mọi người nhóm mình là
nhóm… với các thành viên… và
hôm nay bọn mình sẽ nói về chủ đề:
Đổi màu một hình tròn theo 3 màu
được lựa chọn.
2 Slide 2: Tại sao bọn mình lại chọn đề tài
Mục đích đề tài này ? Chính xác thì việc đổi màu
1.Trong thiết kế đồ họa một hình tròn có ý nghĩa gì ? Trên
Ảnh 1 thực tế việc việc đổi màu một hình
2.Trong thiết kế game tròn có rất nhiều ứng dụng như:
Ảnh 2 1.Trong thiết kế đồ họa:Đổi màu
một hình tròn có thể được sử dụng
để tạo ra các hiệu ứng hình ảnh đặc
biệt. Ví dụ, bạn có thể tạo ra ánh
sáng lóa, hiệu ứng mờ, hiệu ứng
lăng kính hoặc hiệu ứng phát sáng
xung quanh hình tròn.
2. Trong thiết kế game: việc đổi
màu một hình tròn có thể được sử
dụng để thể hiện trạng thái, điểm số
hoặc tương tác của nhân vật hoặc
đối tượng trong trò chơi. Ví dụ,
hình tròn có thể thay đổi màu khi
nhân vật tham gia trận đấu, khi
nhân vật thay đổi trạng thái như đói
hoặc no, hay biến thành màu đỏ khi
nhân vật vào vùng nguy hiểm…
4 Slide 3: 3. Trong cuộc sống đổi màu một
Mục đích đề tài hình tròn có thể biểu thị của việc
1.Trong đời sống thay đổi trạng thái của một phòng
Ảnh 3 + Ảnh 4 như đừng làm phiền, không có
trong phòng, đang trong một cuộc
họp,làm ơn gõ cửa,…
Hay trong công việc, trong các tài
liệu, bảng điểm, sơ đồ, đồ thị hoặc
bất kỳ tài liệu nào cần sự nhấn
mạnh, bạn có thể sử dụng việc đổi
màu một hình tròn để ghi chú, làm
nổi bật hoặc phân biệt các phần tử
quan trọng
5 Ảnh: Để đổi màu một hình tròn bọn mình
Visual Studio sẽ dùng Visual Stuido 2022 và viết
C++ bằng ngôn ngữ C++ cùng với thư
OpenGL viện OpenGL
x++;
};
}
Ảnh code: Sau khi vẽ được hình tròn, chúng ta
// Hàm tô màu hình tròn bắt đầu tô màu hình tròn theo thuật
void scanlineFillCircle(int toán đường quét.
centerX, int centerY, int radius) rong hàm scanlineFillCircle, chúng
{ ta duyệt qua mỗi dòng ngang trong
for (int y = centerY - radius; y phạm vi từ centerY -
<= centerY + radius; y++) { radius đến centerY + radius. Điều
float leftX = centerX - này đảm bảo rằng chúng ta duyệt
sqrt(radius * radius - (y - qua tất cả các dòng ngang mà
centerY) * (y - centerY)); đường tròn có thể chạm vào.
float rightX = centerX + Với mỗi dòng ngang, chúng ta tính
sqrt(radius * radius - (y - toán giới hạn bên trái và bên phải
centerY) * (y - centerY)); của dòng ngang trong đường tròn
bằng cách sử dụng công thức hình
for (int x = leftX; x <= học. Điều này được thực hiện bằng
rightX; x++) { cách tính toán vị trí x trái (leftX) và
glBegin(GL_POINTS); x phải (rightX) trên dòng ngang,
dựa trên bán kính của đường tròn và
glColor3fv(currentColor); vị trí y.
glVertex2i(x, y); Công thức sqrt(radius * radius - (y -
glEnd(); centerY) * (y - centerY)) tính toán
} khoảng cách từ trục y đến đường
} tròn trên cùng hoặc dưới cùng của
} dòng ngang hiện tại. Điều này được
thực hiện bằng cách sử dụng định lý
Pythagoras để tính căn bậc hai của
hiệu số giữa bán kính và khoảng
cách từ tâm đến trục y.
centerX - sqrt(radius * radius - (y -
centerY) * (y - centerY)) tính toán
vị trí x trái trên dòng ngang.
centerX + sqrt(radius * radius - (y -
centerY) * (y - centerY)) tính toán
vị trí x phải trên dòng ngang.
Sau khi tính toán vị trí x trái (leftX)
và x phải (rightX), chúng ta duyệt
qua mỗi điểm trên dòng ngang
từ leftX đến rightX. Điều này đảm
bảo rằng chúng ta duyệt qua tất cả
các điểm nằm trong đường tròn trên
dòng ngang hiện tại.
Với mỗi điểm, chúng ta sử
dụng glBegin(GL_POINTS) để bắt
đầu vẽ điểm và glEnd() để kết thúc
vẽ điểm. Trong trường hợp này,
chúng ta sử dụng glVertex2i(x,
y) để vẽ điểm tại vị trí x và y,
và glColor3fv(currentColor) để đặt
màu sắc của điểm bằng màu hiện tại
(currentColor).
Tuy nhiên, lưu ý rằng cách thực
hiện này dựa trên việc sử dụng các
điểm đơn lẻ để vẽ đường tròn, và
không tận dụng được tính chất đối
xứng của đường tròn. Điều này có
thể dẫn đến hiệu suất không tốt đối
với các đường tròn lớn hoặc có lỗ
hổng bên trong. Để tối ưu hóa thuật
toán và tận dụng tính chất đối xứng,
bạn có thể khTrong đoạn mã trên,
chúng ta sử dụng thuật toán
"scanline" để tô màu một đường
tròn. Dưới đây là giải thích rõ ràng
cho từng phần của mã:
Hàm scanlineFillCircle nhận ba
tham số: centerX và centerY là tọa
độ của tâm đường tròn, và radius là
bán kính của đường tròn.
Chúng ta duyệt qua từng dòng
ngang trong đường tròn bằng cách
thiết lập một vòng lặp cho
biến y từ centerY -
radius đến centerY + radius.
Trong mỗi dòng ngang, chúng ta
tính toán giới hạn bên trái và bên
phải của dòng ngang trong đường
tròn.
Biến leftX là giới hạn bên trái và
được tính toán bằng công
thức centerX - sqrt(radius * radius -
(y - centerY) * (y - centerY)).
Biến rightX là giới hạn bên phải và
được tính toán bằng công
thức centerX + sqrt(radius * radius
- (y - centerY) * (y - centerY)).
Trong công thức trên, chúng ta sử
dụng định lý Pythagoras để tính
toán khoảng cách từ tâm đường tròn
đến dòng ngang hiện tại. Chúng ta
trừ tọa độ y của dòng ngang từ tọa
độ y của tâm đường tròn, sau đó
tính căn bậc hai của hiệu số giữa
bán kính và khoảng cách đó.
Tiếp theo, chúng ta duyệt qua từng
điểm trên dòng ngang
từ leftX đến rightX. Chúng ta sử
dụng vòng lặp for cho biến x trong
phạm vi từ leftX đến rightX.
Trong mỗi điểm trên dòng ngang,
chúng ta sử
dụng glBegin(GL_POINTS) để bắt
đầu vẽ điểm và glEnd() để kết thúc
vẽ điểm.
Sử dụng glColor3fv(currentColor),
chúng ta đặt màu sắc của điểm bằng
màu hiện tại (currentColor). Lưu ý
rằng currentColor cần được khai
báo và cung cấp màu sắc trước khi
gọi hàm scanlineFillCircle.
Cuối cùng, chúng ta sử
dụng glVertex2i(x, y) để vẽ điểm
tại tọa độ x và y trên màn hình.
Điều này tạo ra các điểm liên tiếp
trên dòng ngang và tạo nên hình
dạng của đường tròn
1. Thuật toán Midpoint Circle là một thuật toán đơn giản và hiệu quả để vẽ đường
tròn. Nó được gọi là "Midpoint" vì nó sử dụng giá trị "giữa" (midpoint) để quyết
định điểm tiếp theo trên đường tròn.
Bắt đầu vòng lặp while với điều kiện x <= y. Điều này đảm bảo rằng thuật toán chỉ
vẽ một nửa đường tròn và áp dụng đối xứng để vẽ phần còn lại.
Bên trong vòng lặp, chúng ta vẽ các điểm tương ứng với tám phần tử đối xứng trên
đường tròn. Điểm này được vẽ bằng cách gọi hàm glVertex2i để vẽ một điểm ở tọa
độ (x, y).
Tiếp theo, chúng ta cần quyết định điểm tiếp theo trên đường tròn. Điều này được
thực hiện bằng cách kiểm tra giá trị d.
Nếu d < 0, điểm tiếp theo nằm ở vị trí (x+1, y). Để cập nhật giá trị d, chúng ta thực
hiện d += 2 * x + 3.
Nếu d >= 0, điểm tiếp theo nằm ở vị trí (x+1, y-1). Để cập nhật giá trị d, chúng ta
thực hiện d += 2 * (x - y) + 5 và giảm giá trị y đi 1 đơn vị.
Đơn giản và dễ hiểu: Thuật toán Midpoint Circle khá đơn giản và dễ hiểu, không
yêu cầu nhiều kiến thức toán học phức tạp.
Hiệu quả: Thuật toán này chỉ vẽ một nửa đường tròn và áp dụng đối xứng để vẽ
phần còn lại, giúp giảm số lượng lệnh vẽ được gọi và tiết kiệm tài nguyên tính
toán.
Hạn chế của thuật toán Midpoint Circle:
Không vẽ đường tròn hoàn hảo: Vì thuật toán chỉ vẽ một phần của đường tròn và
áp dụng đối xứng, nên đường tròn vẽ ra có thể không hoàn hảo, đặc biệt là khi bán
kính đường tròn lớn.
Không hỗ trợ điểm cong tạo thành đường cong: Thuật toán Midpoint Circle chỉ vẽ
các điểm rời rạc trên đường tròn. Nếu bạn muốn vẽ các đường cong mượt mà, bạn
cần sử dụng các thuật toán khác như Bresenham's Circle Algorithm hoặc thuật toán
vẽ đường tròn dựa trên phép biến đổi ma trận.
Hiệu suất bị ảnh hưởng bởi kích thước đường tròn: Thuật toán Midpoint Circle có
độ phức tạp thời gian O(r), trong đó r là bán kính của đường tròn. Vì vậy, hiệu suất
của thuật toán có thể bị ảnh hưởng nếu bán kính đường trònlớn. Với các bán kính
lớn, số lượng điểm cần vẽ cũng tăng, làm giảm hiệu suất của thuật toán.
2.. Dưới đây là một phương pháp thuật toán tô màu theo đường quét (scanline)
cho việc tô màu một đường tròn:
Khởi tạo tâm và bán kính của đường tròn (centerX, centerY, radius).
Duyệt qua từng dòng ngang trong phạm vi từ (centerY - radius) đến (centerY +
radius).
Với mỗi dòng ngang, tính toán giới hạn bên trái và bên phải của dòng ngang trong
đường tròn.
Tính toán vị trí x trái (leftX) và x phải (rightX) trên dòng ngang bằng cách sử dụng
công thức hình học: leftX = centerX - sqrt(radius^2 - (y - centerY)^2) và rightX =
centerX + sqrt(radius^2 - (y - centerY)^2).
Duyệt qua mỗi điểm trên dòng ngang từ leftX đến rightX.
Với mỗi điểm, sử dụng glVertex2i để vẽ điểm đó với màu hiện tại (currentColor).
Thuật toán tô màu theo đường quét (scanline fill) có những ưu điểm và hạn chế
sau:
Ưu điểm:
Tính toán đơn giản: Thuật toán scanline fill không yêu cầu tính toán phức tạp và
không đòi hỏi nhiều tài nguyên tính toán. Việc tính toán giới hạn bên trái và bên
phải của mỗi dòng ngang dễ dàng thực hiện bằng cách sử dụng công thức hình học
đơn giản.
Hiệu suất tốt cho hình dạng phức tạp: Thuật toán scanline fill hoạt động tốt đối với
các hình dạng phức tạp, bao gồm cả các hình dạng có lỗ hổng bên trong. Bằng cách
duyệt qua từng dòng ngang và tính toán giới hạn bên trái và bên phải, thuật toán có
thể tô màu các hình dạng không liên thông và có nhiều lỗ hổng một cách chính
xác.
Tận dụng tính chất đối xứng: Thuật toán scanline fill có thể tận dụng tính chất đối
xứng của các hình dạng để giảm số lượng tính toán và cải thiện hiệu suất. Bằng
cách chỉ tính toán giới hạn bên trái và bên phải cho một nửa đường tròn và sau đó
áp dụng đối xứng, ta có thể tô màu cả đường tròn một cách hiệu quả.
Hạn chế:
Không hiệu quả với các hình dạng lớn: Thuật toán scanline fill không hiệu quả khi
áp dụng cho các hình dạng lớn, đặc biệt là khi bán kính của hình tròn lớn. Vì thuật
toán dựa trên việc duyệt qua từng dòng ngang và tính toán giới hạn bên trái và bên
phải, số lượng điểm cần tính toán và vẽ trở nên lớn, ảnh hưởng đến hiệu suất và tốn
tài nguyên.
Không phù hợp với các hình dạng không liên tục: Thuật toán scanline fill không
phù hợp cho việc tô màu các hình dạng không liên tục, chẳng hạn như các hình
dạng có lỗ hổng không liên thông. Vì thuật toán dựa trên việc tính toán giới hạn
bên trái và bên phải trên từng dòng ngang, nó không thể xác định được các vùng
không liên thông trong hình dạng và không thể tô màu chính xác.
Không hỗ trợ các hình dạng phức tạp khác: Thuật toán scanline fill cũng không hỗ
trợ tô màu các hình dạng phức tạp khác ngoài đường tròn, chẳng hạn như các hình
dạng đa giác, elip, hay các hình dạng không đều. Việc tính toán giới hạn bên trái và
bên phải cho các hình dạng này trở nên phức tạp hơn và yêu cầu các phép tính toán
phức tạp hơn.
Tóm lại, thuật toán tô màu theo đường quét có những ưu điểm trong tính toán đơn
giản, hiệu suất tốt với hình dạng phức tạp và khả năng tận dụng tính chất đốixứng,
nhưng cũng có nhược điểm khi không hiệu quả với các hình dạng lớn, không phù
hợp với các hình dạng không liên tục và không hỗ trợ các hình dạng phức tạp khác
ngoài đường tròn.