Vẽ đường thẳng
description
Transcript of Vẽ đường thẳng
11
Vẽ đường thẳngVẽ đường thẳng
22
Đường thẳng trên màn hìnhĐường thẳng trên màn hình
Đường thẳng được hình thành Đường thẳng được hình thành từ các điểm rời rạctừ các điểm rời rạc
Các điểm được xác định từ Các điểm được xác định từ phương trình của đường phương trình của đường thẳngthẳng
Ideal LineIdeal Line
Rasterized lineRasterized line
33
Đặc điểm của đường thẳng nguyênĐặc điểm của đường thẳng nguyên
Xấp xỉ đường thẳng thựcXấp xỉ đường thẳng thực
Không liên tụcKhông liên tục
Dạng răng cưa (hình bậc thang)Dạng răng cưa (hình bậc thang)
Nhanh – Thao tác cơ bản để tạo Nhanh – Thao tác cơ bản để tạo thành các đối tượng khácthành các đối tượng khác
44
Phương trình đường thẳng thựcPhương trình đường thẳng thực
y y mm x x bb
Dx Dx xx22 x x11
Dy Dy yy22 y y11
mm Dy / Dx Dy / Dx
bb y y11 mm x x11
(x1,y1)
(x2,y2)
DyDx
55
Thuật toán Slope - InterceptThuật toán Slope - InterceptSlopeInterceptLine(int x1, int y1, int x2, int y2, int color) {SlopeInterceptLine(int x1, int y1, int x2, int y2, int color) {
int Dx = x2 – x1;int Dx = x2 – x1;int Dy = y2 – y1;int Dy = y2 – y1;int x = x1, y = y1;int x = x1, y = y1;
putpixel(x, y, color);putpixel(x, y, color); if (Dx != 0) {if (Dx != 0) { float m = (float)Dy / (float)Dx;float m = (float)Dy / (float)Dx; float b = y1 - m*x1;float b = y1 - m*x1; int stepX = (x2 > x1) ? 1 : -1;int stepX = (x2 > x1) ? 1 : -1;
while (x != x2) {while (x != x2) { x += stepX;x += stepX; y = round(m*x + b);y = round(m*x + b); putpixel(x, y, color);putpixel(x, y, color); }} }}}}
66
Lưu ýLưu ý
Khi độ lớn của hệ số góc đường thẳng lớn hơn 1 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.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)Khắc phục:Tính tọa độ x theo y, nghĩa là x = g(y)
(x2,y2)
(x1,y1)
Dy
Dx
77
Thuật toán cải tiếnThuật toán cải tiến
ImprovedSlopeInterceptLine(int x1, int y1, int ImprovedSlopeInterceptLine(int x1, int y1, int x2, int y2, int color) {x2, int y2, int color) {
int Dx = x2 – x1;int Dx = x2 – x1; int Dy = y2 – y1;int Dy = y2 – y1;
int x = x1, y = y1;int x = x1, y = y1; putpixel(x, y, color);putpixel(x, y, color);
if (abs(Dx) > abs(Dy)) {if (abs(Dx) > abs(Dy)) { float m = (float)Dy / (float)Dx;float m = (float)Dy / (float)Dx; float b = y1 - m*x1;float b = y1 - m*x1; int stepX = (Dx < 0) ? -1 : 1;int stepX = (Dx < 0) ? -1 : 1;
while (x != x2) {while (x != x2) { x += stepX;x += stepX; putpixel(x, round(m*x + b), color);putpixel(x, round(m*x + b), color); }} } else if (Dy != 0) {} else if (Dy != 0) { float m = (float)Dx / (float)Dy;float m = (float)Dx / (float)Dy; float b = x - m*y;float b = x - m*y; int stepY = (Dy < 0) ? -1 : 1;int stepY = (Dy < 0) ? -1 : 1; while (y != y2) {while (y != y2) { y += stepY;y += stepY; putpixel(round(m*y + b), y, color);putpixel(round(m*y + b), y, color); }} }}}}
88
Cải tiếnCải tiến
Vòng lặp bên trong:Vòng lặp bên trong:
while (x != x2) {while (x != x2) {
x += stepX;x += stepX;
putpixel(x, round(m*x + b), color);putpixel(x, round(m*x + b), color);
}}
Giá trị của y được tính trực tiếp từ phương trìnhGiá 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: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;float t = m * x + b + 0.5;
while (x != x2) {while (x != x2) { x += stepX;x += stepX; t += m;t += m; putpixel(x, (int)t, color);putpixel(x, (int)t, color);}}
99
Digital Differential AnalyzerDigital Differential AnalyzerDDALine(int x1, int y1, int x2, int y2, int color) {DDALine(int x1, int y1, int x2, int y2, int color) { int Dx = x2 – x1;int Dx = x2 – x1; int Dy = y2 – y1;int Dy = y2 – y1; float t = 0.5;float t = 0.5; int x = x1, y = y1;int x = x1, y = y1;
putpixel(x, y, color);putpixel(x, y, color);
if (abs(Dx) > abs(Dy)) {if (abs(Dx) > abs(Dy)) { float m = (float)Dy / (float)Dx;float m = (float)Dy / (float)Dx; float b = y - m*x;float b = y - m*x; int stepX = (Dx < 0) ? -1 : 1;int stepX = (Dx < 0) ? -1 : 1;
t += b + m*x;t += b + m*x; m *= (float)stepX;m *= (float)stepX; while (x != x2) {while (x != x2) { x += stepX;x += stepX; t += m;t += m; putpixel(x, (int)t, color);putpixel(x, (int)t, color); }} } else if (Dy != 0) {} else if (Dy != 0) { // swap x & y to do other slopes// swap x & y to do other slopes }}}}