Các đối tượng đồ họa cơ sở
Phan Phúc Doãn
1
Hệ tọa độ thực và hệ tọa độ thiết bị
•
Hệ tọa độ thực:
– Tọa độ là số thực, liên tục
– Lớn, nhỏ tùy ý
•
Hệ tọa độ thiết bị:
–
–
–
–
Tọa độ nguyên, rời rạc
Tọa độ bị giới hạn trong một khoảng nào đó
X thuộc [0, 639]
Hệ tọa độ thiết bị qui ước bàn tay trái
2
Điểm
•
•
Là thành phần cơ sở
Tọa độ, màu sắc
3
Đường thẳng, đường gấp khúc
•
Phương trình đoạn chắn: ( x − x1 )( y2 − y1 ) = ( y − y1 )( x2 − x1 )
•
Phương trình tổng quát: Ax + By + C = 0
x = (1 − t ) x1 + tx2
•
Phương trình tham số:
•
Đường gấp khúc là tập các đoạn thẳng nối nhau xác định bởi
các đỉnh
y = (1 − t ) y1 + ty2
4
Đường thẳng, đường gấp khúc (tt)
•
Màu sắc
•
Độ rộng nét vẽ
•
Kiểu nét vẽ: liền, đứt,..
5
Vùng tô
•
Đường biên và vùng bên trong
•
Đường biên: giống đoạn thẳng
•
Vùng bên trong: màu tô và mẫu tô
6
Kí tự, chuỗi kí tự
•
Màu sắc
•
Font chữ
•
Kích thước
•
Khoảng cách giữa các kí tự
•
Sự canh chỉnh
•
Cách hiển thị tuần tự các kí tự
•
Hướng của kí tự
7
Vẽ đường thẳng
8
Đường thẳng trên màn hình
Đường thẳng được hình thành
từ các điểm rời rạc
Các điểm được xác định từ
phương trình của đường
thẳng
Ideal Line
Rasterized line
9
Đặc điểm của đường thẳng nguyên
Xấp xỉ đường thẳng thực
Không liên tục
Dạng răng cưa (hình bậc
thang)
Nhanh – Thao tác cơ bản để
tạo thành các đối tượng
khác
10
Phương trình đường thẳng thực
(x1,y1)
Dy
Dx
(x2,y2)
y m x b
Dx
x2 x1
Dy
y2 y1
m Dy / Dx
b y1 m x1
11
Thuật toán Slope Intercept
SlopeInterceptLine(int x1, int y1, int x2, int y2, int color) {
int Dx = x2 – x1;
int Dy = y2 – y1;
int x = x1, y = y1;
putpixel(x, y, color);
if (Dx != 0)
float m =
float b =
int stepX
{
(float)Dy / (float)Dx;
y1 - m*x1;
= (x2 > x1) ? 1 : -1;
while (x != x2) {
x += stepX;
y = round(m*x + b);
putpixel(x, y, color);
}
}
}
12
Lưu ý
Khi độ lớn của hệ số góc đường thẳng lớn hơn
1 thì các điểm trên đường thẳng rời rạc.
(x2,y2)
Khắc phục:Tính tọa độ x theo y, nghĩa là x =
g(y)
Dy
Dx
(x1,y1)
13
ImprovedSlopeInterceptLine(int x1, int y1, int
x2, int y2, int color) {
int Dx = x2 – x1;
int Dy = y2 – y1;
int x = x1, y = y1;
putpixel(x, y, color);
Thuật toán cải tiến
if (abs(Dx) > abs(Dy)) {
float m = (float)Dy / (float)Dx;
float b = y1 - m*x1;
int stepX = (Dx < 0) ? -1 : 1;
while (x != x2) {
x += stepX;
putpixel(x, round(m*x + b), color);
}
} else if (Dy != 0) {
float m = (float)Dx / (float)Dy;
float b = x - m*y;
int stepY = (Dy < 0) ? -1 : 1;
while (y != y2) {
y += stepY;
putpixel(round(m*y + b), y, color);
}
}
}
14
Cải tiến
Vòng lặp bên trong:
while (x != x2) {
x += stepX;
putpixel(x, round(m*x + b), color);
}
Giá trị của y được tính trực tiếp từ phương trình
Chúng ta có thể tính giá trị của y bằng cách khác:
float t = m * x + b + 0.5;
while (x != x2) {
x += stepX;
t += m;
putpixel(x, (int)t, color);
}
15
Digital Differential Analyzer
DDALine(int x1, int y1, int x2, int y2, int color) {
int Dx = x2 – x1;
int Dy = y2 – y1;
float t = 0.5;
int x = x1, y = y1;
putpixel(x, y, color);
if (abs(Dx) > abs(Dy)) {
float m = (float)Dy / (float)Dx;
float b = y - m*x;
int stepX = (Dx < 0) ? -1 : 1;
t += b + m*x;
m *= (float)stepX;
while (x != x2) {
x += stepX;
t += m;
putpixel(x, (int)t, color);
}
} else if (Dy != 0) {
// swap x & y to do other slopes
}
}
16