Câu 1: (4 điểm) Trình bày giải thuật vẽ đường thẳng theo thuật toán DDA. Cho ví dụ minh họa Là 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. Trong đó: m Δy , Δ Δx y2 y , Δ 1 x 2 x1 . Nhận thấy tọa độ của điểm x sẽ tăng 1 đơn vị trên mỗi điểm vẽ, còn việc quyết định chọn yi +1 là yi +1 hay yi sẽ phụ thuộc vào giá trị sau khi làm tròn của tung độ y. Tuy nhiên, nếu tính trực tiếp giá trị thực của y ở mỗi bước từ phương trình y = mx+b thì cần một phép toán nhân và một phép toán cộng số thực: yi +1 = mxi +1 + b = m(xi + 1) + b = mxi + b + m Câu 2: (6 điểm) Sử dụng ngôn ngữ thực tại ảo VRML vẽ cái bàn như sau (kích thước 1200600750mm)
Trang 1BÀI TẬP LỚN
MÔN KỸ THUẬT
ĐỒ HỌA VÀ THỰC TẠI ẢO(IT32)
Họ và tên sinh viên:
Lớp:
Mã sinh viên:
Trang 3BÀI TẬP LỚN SỐ 1
Câu 1: (4 điểm) Trình bày giải thuật vẽ đường thẳng theo thuật toán DDA Cho ví dụ minh họa
Là 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 Trong đó: m Δy , Δ
Δx
y2 y , Δ
1
x
2
x1
Nhận thấy tọa độ của điểm x sẽ tăng 1 đơn vị trên mỗi điểm vẽ, còn việc quyết định chọn
yi +1 là yi +1 hay yi sẽ phụ thuộc vào giá trị sau khi làm tròn của tung độ y Tuy nhiên, nếu tính trực tiếp giá trị thực của y ở mỗi bước từ phương trình y = mx+b thì cần một phép toán nhân và một phép toán cộng số thực: yi +1 = mxi +1 + b = m(xi + 1) + b = mxi + b + m
Để cải thiện tốc độ, người ta khử phép nhân trên số thực Ta có:
yi = mxi + b ⇒ yi +1 = yi + m →int(yi +1)
Có 2 khả năng:
0<m<=1:
xi +1 = xi + 1,
yi +1 = yi + m→int(yi +1)
m>1:
xi +1 = xi + 1/m → int(xi+1), yi +1 = yi + 1
y x
Trang 4Hai trường hợp này dùng để vẽ một điểm bắt đầu từ bên trái đến điểm cuối cùng bên phải của đường thẳng (xem hình) Nếu điểm bắt đầu từ bên phải đến điểm cuối cùng bên trái thì xét ngược lại :
0<m<=1: xi +1 = xi - 1, yi +1 = yi - m → int(yi +1)
m>1: xi +1 = xi - 1/m → int(xi+1), yi +1 = yi - 1
Hai dạng đường thẳng có 0<m<1 và và m>1
Tương tự, có thể tính toán các điểm vẽ cho trường hợp m<0: khi |m|<=1 hoặc |m|>1
Ví dụ: Áp dụng thuật toán DDA vẽ đoạn thẳng từ điểm (2,2) đến điểm (8,4) m=2/6=0.33
#define Round(a) int(a+0.5) int Color = GREEN;
void LineDDA (int x1, int y1, int x2, int y2) {
int x = x1; float y = y1;
float m = float(y2-y1)/(x2-x1); putpixel(x, Round(y), Color); for(int i=x1; i<x2; i++)
{ x++;
y +=m;
putpixel(x, Round(y), Color);
} }
Trang 5i xi yi y
Câu 2: (6 điểm) Sử dụng ngôn ngữ thực tại ảo VRML vẽ cái bàn như sau (kích thước 1200*600*750mm)
#VRML V2.0 utf8
#matban
Transform {
translation 0 0 0
rotation 0 0 1 0
children [
Trang 6Shape {
appearance Appearance {
material Material {diffuseColor 1 1 0} }
geometry Box {
size 120 5 60 }
} ]
}
#chan1
Transform {
translation -58.5 -37.5 -28.5
rotation 0 0 1 0
children [
Shape {
appearance Appearance { material Material {diffuseColor 1 1 1}
}
geometry Box {
size 3 70 3 }
} ]
}
#chan2
Transform {
translation 58.5 -37.5 -28.5
rotation 0 0 1 0
Trang 7children [
Shape {
appearance Appearance { material Material {diffuseColor 1 1 1} }
geometry Box {
size 3 70 3 }
} ]
}
#chan3
Transform {
translation 58.5 -37.5 28.5
rotation 0 0 1 0
children [
Shape {
appearance Appearance { material Material {diffuseColor 1 1 1} }
geometry Box {
size 3 70 3 }
} ]
}
#chan4
Transform {
translation -58.5 -37.5 28.5
Trang 8rotation 0 0 1 0
children [
Shape {
appearance Appearance { material Material {diffuseColor 1 1 1} }
geometry Box {
size 3 70 3 }
} ]
}
#thanh_ngang1
Transform {
translation -58.5 -72 0
rotation 0 0 1 0
children [
Shape {
appearance Appearance { material Material {diffuseColor 1 1 1} }
geometry Box {
size 3 3 60 }
} ]
}
#thanh_ngang2
Trang 9Transform {
translation 58.5 -72 0
rotation 0 0 1 0
children [
Shape {
appearance Appearance { material Material {diffuseColor 1 1 1} }
geometry Box {
size 3 3 60 }
} ]
}