Bài giảng Các đối tượng đồ họa cơ sở do Phan Phúc Doãn thực hiện nhằm cung cấp cho các bạn những kiến thức về hệ tọa độ thực và hệ tọa độ thiết bị; điểm; đường thẳng, đường gấp khúc; vùng tô; kí tự, chuỗi kí tự; đường thẳng trên màn hình; đặc điểm của đường thẳng nguyên; thuật toán Slope - Intercept và một số nội dung khác.
Các đối tượng đồ họa cơ sở Phan Phúc Dỗn 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 Điểm • • Là thành phần cơ sở Tọa độ, màu sắc Đườ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 Đườ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, 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ơ 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ự Vẽ đường thẳng Đườ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 Đặ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; 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 other slopes } } 16 ... 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ự Vẽ đường thẳng Đườ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ừ ... 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... (float)Dx; y1 - m*x1; = (x2 > x1) ? : -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