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 Doã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: Phương trình tổng quát: Ax + By + C = 0 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 Đườ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 13 August 2001 Chris Weigle - Comp 136 Đườ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 Phương trình đường thẳng thực y = m * x + b Dx = x2 - x1 Dy = y2 - y1 m = Dy / Dx b = y1 - m * x1 (x1,y1) (x2,y2) Dy Dx 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)Dy / (float)Dx; float b = y1 - m*x1; int stepX = (x2 > x1) ? 1 : -1; while (x != x2) { x += stepX; y = round(m*x + b); putpixel(x, y, color); } } } 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. Khắc phục:Tính tọa độ x theo y, nghĩa là x = g(y) (x2,y2) (x1,y1) Dy Dx Thuật toán cải tiến 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); if (abs(Dx) > abs(Dy)) { float m = (float)Dy / (float)Dx; float b = y1 - m*x1; int stepX = (Dx 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 + ; while (x != x2) { x += stepX; t += m; putpixel(x, (int)t, color); } Digital Differential Analyzer DDALine(int x1, int y1, int x2, int y2, int color) { int Dx = x2 – x1; int Dy = y2 – y1; float t = ; 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 } }