Tải bản đầy đủ (.pdf) (16 trang)

Bài giảng Các đối tượng đồ họa cơ sở - Phan Phúc Doãn

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (454.54 KB, 16 trang )

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



×