Tải bản đầy đủ (.ppt) (74 trang)

Đồ họa máy tính đề tài tìm hiểu và cài đặt các thuật toán vẽ đường cho trường hợp tổng quát đường thẳng phân loại và các thuật toá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 (1.85 MB, 74 trang )

Thành Viên Trong Nhóm
1. Nguyễn Vĩnh Hảo  0985401816
2. Nguyễn Thị Hồng Linh  0987741704
3. Lê Thụy Hoài Phương  0955002770
4. Phạm Thị Thủy  0929043688
5. Nguyễn Lê Cẩm Ngọc  0985024152
ĐỒ HỌA MÁY TÍNH
Tìm hiểu và cài đặt các
thuật toán vẽ đường cho
trường hợp tổng quát
Input:
(x1,y1)(x2,y2)
Output :
{(x1,y1)(x2,y2)….(xn,yn)}
là những điểm sáng nằm trên đường thẳng.
(x1,y1)
(X2,y2)
(x1,y1)
(x2,y2)
y2-y1
x2-x1
y1-mx1
y mx b
y b
x
m m
y
m
x
b


= +
= −

= =

=
1.Tăng chậm
2.Tăng nhanh
3. Giảm chậm ngược 4. Giảm nhanh ngược
- Đối tượng mô tả trong hệ tọa độ thực là đối
tượng liên tục, còn đối tượng trong hệ tọa độ
thiết bị là đối tượng rời rạc. Nên cần thực
hiện việc rời rạc hóa và việc nguyên hóa một
cách tối uư nhất.
-
Từ đó hình thành các thuật toán khác nhau
với những uư thế riêng của nó để tối uư về
mặt tốc độ và sự chính xác.
Digital Differential Analyzer
Để hiển thị trên lưới nguyên được liền nét
các điểm có tọa độ (xi+1; yi+1) sẽ phải chọn 1
trong 8 điểm có tọa độ (xi + 1;yi + 1 )
3
5
8
2
76
4
1
Thuật toán DDA là một thuật toán tính toán các

điểm vẽ dọc theo đường thẳng dựa vào hệ số
góc của phương trình đường thẳng y = mx + b
Trường hợp 1
Đoạn thẳng tăng chậm với điểm đầu A(x1;y1) ở bên trái và
điểm cuối B(xk; yk) ở bên phải và trường hợp đối xứng qua ox
A
B
y = mx + b (0 < |m| <=1 )
m = (yk – y1)/(xk – x1)
Bước 1: Xác định điểm đầu tiên
x1 = x1 ;
y1 =y1;
Bước 2: Xác định những điểm tiếp theo
Lặp
x1 < xk ;
xi+1 = xi +1 ;
y = yi + m ; //đã cải tiến y
yi+1 = Round(y);
A
B
Lưu đồ thuật toán DDA vẽ đoạn thẳng qua 2 điểm (x1,y1) và (x2,y2)
trong trương hợp 1
begin
begin
x<x2
x<x2
end
end
x=x+1;
y=y+m;

Putpixel(x,Round(y),c);
m=Dy/Dx;
x=x1;
y=y1;
Putpixel(x,y,c);
NO
yes
Cài đặt thuật toán DDA trong trường hợp 1
#include <windows.h>
#include<math.h>
#include <gl/gl.h>
#define Round(a) int(a+0.5)
using namespace std;
Void DDA_line1(int x1,int y1,int x1,int y2, Color c)
{
int Dx = x2-x1; Dy= y2-y1;
float m = (float)Dy/Dx;
if (abs(m) < 1)
{
int x = x1;
float y = y1;
putpixel(x, Round(y),c);
while (x < x2)
{
x++;
y = y+m;
putpixel(x, Round(y), c);
}
}
}

Trường hợp 2
Đoạn thẳng tăng nhanh với điểm đầu A(x1;y1) ở bên trái và
điểm cuối B(xk; yk) ở bên phải và trường hợp đối xứng qua oy
A
B
y = mx + b (|m| > 1 )
m = (yk – y1)/(xk – x1)
Bước 1: Xác định điểm đầu tiên
x1 = x1 ;
y1 =y1;
Bước 2: Xác định những điểm tiếp theo
Lặp
y1 < yk ;
x = xi +1/m;
xi+1 = Round(x) ;
yi+1 = yi +1;
A
B
Lưu đồ thuật toán DDA vẽ đoạn thẳng qua 2 điểm (x1,y1) và (x2,y2)
trong trường hợp 2
begin
begin
y<y2
y<y2
end
end
x=x+1/m;
y=y+1;
Putpixel(Round(x),y,c);
m=Dy/Dx;

x=x1;
y=y1;
Putpixel(x,y,c);
NO
yes
Cài đặt thuật toán DDA trong trường hợp 2
#include <windows.h>
#include<math.h>
#include <gl/gl.h>
#define Round(a) int(a+0.5)
using namespace std;
Void DDA_line1(int x1,int y1,int x1,int y2, Color c)
{
int Dx = x2-x1; Dy= y2-y1;
float m = (float)Dy/Dx;
if (abs(m) > 1)
{
float x = x1;
int y = y1;
putpixel(Round(x),y,c);
while (y < y2)
{
x = x+1/m ;
y ++;
putpixel(Round(x), y, c);
}
}
}
Trường hợp 3
Đoạn thẳng giảm chậm với điểm đầu A(x1;y1) ở bên phải trên

và điểm cuối B(xk; yk) ở bên trái dưới và đối xứng của nó qua
ox
y = mx + b (0 < |m| <=1 )
m = (yk – y1)/(xk – x1)
Bước 1: Xác định điểm đầu tiên
x1 = x1 ;
y1 =y1;
Bước 2: Xác định những điểm tiếp theo
Lặp
x1 > xk ;
xi+1 = xi -1 ;
y = yi - m ;
yi+1 = Round(y);
B
A
B
A
Lưu đồ thuật toán DDA vẽ đoạn thẳng qua 2 điểm (x1,y1) và (x2,y2)
trong trường hợp 3
begin
begin
x >x2
x >x2
end
end
x=x-1;
y=y-m;
Putpixel(x,Round(y),c);
m=Dy/Dx;
x=x1;

y=y1;
Putpixel(x,y,c);
NO
yes
Cài đặt thuật toán DDA trong trường hợp 3
#include <windows.h>
#include<math.h>
#include <gl/gl.h>
#define Round(a) int(a+0.5)
using namespace std;
Void DDA_line1(int x1,int y1,int x1,int y2, Color c)
{
int Dx = x2-x1; Dy= y2-y1;
float m = (float)Dy/Dx;
if (abs(m) < 1)
{
int x = x1;
float y = y1;
putpixel(x, Round(y),c);
while (x > x2)
{
x ;
y = y - m;
putpixel(x, Round(y), c);
}
}
}
Trường hợp 4
Đoạn thẳng giảm nhanh với điểm đầu A(x1;y1) ở bên phải và
điểm cuối B(xk; yk) ở bên trái và đối xứng của nó qua oy

A
B
y = mx + b (m > 1 )
m = (yk – y1)/(xk – x1)
Bước 1: Xác định điểm đầu tiên
x1 = x1 ;
y1 =y1;
Bước 2: Xác định những điểm tiếp theo
Lặp
y1 > yk ;
x = xi -1/m;
xi+1 = Round(x) ;
yi+1 = yi -1;
A
B
Lưu đồ thuật toán DDA vẽ đoạn thẳng qua 2 điểm (x1,y1) và (x2,y2)
trong trường hợp 4
begin
begin
y > y2
y > y2
end
end
x=x-1/m;
y=y-1;
Putpixel(Round(x),y,c);
m=Dy/Dx;
x=x1;
y=y1;
Putpixel(x,y,c);

NO
yes
Cài đặt thuật toán DDA trong trường hợp 4
#include <windows.h>
#include<math.h>
#include <gl/gl.h>
#define Round(a) int(a+0.5)
using namespace std;
Void DDA_line1(int x1,int y1,int x1,int y2, Color c)
{
int Dx = x2-x1; Dy= y2-y1;
float m = (float)Dy/Dx;
if (abs(m) > 1)
{
float x = x1;
int y = y1;
putpixel(Round(x),y,c);
while (y > y2)
{
x = x-1/m ;
y ;
putpixel(Round(x), y, c);
}
}
}
Luư đồ thuật toán DDA trong tất cả các trường hợp vẽ đường thẳng
begin
begin
Dx = x2 – x1
Dy = y2 – y1

Dx = x2 – x1
Dy = y2 – y1
abs(Dx) > abs(Dy)
abs(Dx) > abs(Dy)
xinc = Dx / step
yinc = Dy / step
x = x1; y = y1
putpixel (x, y,c )
xinc = Dx / step
yinc = Dy / step
x = x1; y = y1
putpixel (x, y,c )
end
end
NOYES
step = abs(Dx)
step = abs(Dx)
step = abs(Dy)
step = abs(Dy)
k<= step
k<= step
YES NO
YES
x = x + xinc
y = y + yinc
Putpixel(Round(x),Round(y),c)
x = x + xinc
y = y + yinc
Putpixel(Round(x),Round(y),c)
NO

Cài đặt thuật toán DDA trong trường hợp Tổng quát
#include <windows.h>
#include<math.h>
#include <gl/gl.h>
#define Round(a) int(a+0.5)
using namespace std;
Void DDA_line1(int x1,int y1,int x1,int y2, Color color){
double x,y; int step;
if(abs(x2-x1)>abs(y2-y1))
step=abs(x2-x1);
else
step=abs(y2-y1);
x=(double)x1;
y=(double)y1;
putpixel(Round(x),Round(y),color);
double m=(double)(x2-x1)/step;
double n=(double)(y2-y1)/step;
for(double i=1;i<=step;i++)
{
x+=m;
y+=n;
putpixel(Round(x),Round(y),color);
}
}
Ví dụ Demo vẽ đường thẳng từ điểm A(2, 10) đến điểm B(21, 16) (0 < m < 1)
điểm A(9, 1) đến điểm B(17,12) (m > 1) bằng thuật toán DDA.
A (2, 10) đến B (21, 1) m= 6/19 = 0,316 < 1
i xi yi y
0 2 10 10
1 3 10 10,316

2 4 11 10,632
3 5 11 10,948
4 6 11 11,264
5 7 12 11,580
6 8 12 11,896
7 9 12 12,212
8 10 13 12,528
9 11 13 12,844
10 12 13 13,160
11 13 13 13,476
12 14 14 13,792
13 15 14 14,108
14 16 14 14,424
15 17 15 14,740
16 18 15 15,056
17 19 15 15,372
18 20 16 15,688
19 21 16 16,004
A ( 9,1 ) đến B (17 , 12 ) m= 11/8 = 1.375> 1
1/m = 0,73
i xi yi x
0 9 1 9
1 10 2 9,73
2 10 3 10,46
3 11 4 11,19
4 12 5 11,92
5 13 6 12,65
6 13 7 13,38
7 14 8 14,11
8 15 9 14,84

9 16 10 15,57
10 16 11 16,30
11 17 12 17,03
Tất cả các trường hợp
của đoạn thẳng còn lại
được vẽ dựa trên thuật
toán DDA bằng việc
hoán đổi vị trí của điểm
đầu và điểm cuối hoặc
lấy đối xứng qua các
trục tọa độ của 4 trường
hợp trên.

×