Vẽ đường thẳng

9
1 Vẽ đường thẳng Vẽ đường thẳng

description

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) - PowerPoint PPT Presentation

Transcript of Vẽ đường thẳng

Page 1: Vẽ đường thẳng

11

Vẽ đường thẳngVẽ đường thẳng

Page 2: Vẽ đườ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

Page 3: Vẽ đường thẳng

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

Page 4: Vẽ đường thẳng

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

Page 5: Vẽ đường thẳng

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); }} }}}}

Page 6: Vẽ đường thẳng

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

Page 7: Vẽ đường thẳng

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); }} }}}}

Page 8: Vẽ đường thẳng

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);}}

Page 9: Vẽ đường thẳng

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 }}}}