1. Câu 1 : KTĐH hay ĐHMT là một
lĩnh vực cntt nhằm thể hiện đối
tượng thực và ảo trong máy tính
Một số ứng dụng:
• Giải trí, nghệ thuật (Game)
• Kỹ xảo điện ảnh: những hình
ảnh ko có thực
• Hỗ trợ thiết kế
• Y tế: + Chẩn đoán hình ảnh
+ Cơ thể ảo
• Vũ trụ và KH-KT, công
nghiệp…
2. Câu 2: Trình bày thuật toán vẽ đoạn
thẳng Bresenham:
• Hệ số góc của đường thẳng
tương ứng với đoạn thẳng là:
0 < K = (Yb – Ya) / (Xb - Xa) <= 1
1. Nếu K > 1
Xét đoạn thẳng (Ya, Xa); (Yb,
Xb) và thay mỗi điểm (x, y) tìm
được thành (y,x)
2. Nếu K = 0 thì bài toán trở lên
tầm thường,đoạn thẳng cần vẽ
nằm song song với một trong
các trục tọa độ
Nếu K < 0 xét đoạn thẳng (Xb, Yb);
(2Xb – Xa, Ya) và thay mỗi điểm (x,y)
tìm được bởi (2Xb – X , Y)
• KHỞI ĐẦU
X = Xa, Y = Ya, ∆y=ybya, ∆x=xb-xa
P = 2∆y - ∆x
• Điều kiện dừng
X > Xb
Sơ đồ khối
3. CT:
Int BRLine(int Xa, int Ya, int
Xb, int Yb, Point*kq)
{
int X= Xa, int Y= Ya;
int ∆x = Xb – Xa;
int ∆y = Yb – Ya;
int P = 2∆y - ∆x; int i=0;
for(X=Xa; X<= Xb; X++)
{
Kq[i].X = X;
Kq[i].Y = Y;
I++;
if(P<=0)
P=P + 2*∆y;
else
{Y= Y +1; P= P + 2*∆y –
2*∆x;}
X= X +1;
Return i;
}
}
4. Câu 3: Trình bày thuật toán vẽ đoạn
thẳng MidPoint
Hệ số góc của đường thẳng tương
ứng với đoạn thẳng là:
0 < K = (Yb – Ya) / (Xb - Xa) <= 1
3. Nếu K > 1
Xét đoạn thẳng (Ya, Xa); (Yb,
Xb) và thay mỗi điểm (x, y) tìm
được thành (y,x)
4. Nếu K = 0 thì bài toán trở lên
tầm thường,đoạn thẳng cần vẽ
nằm song song với một trong
các trục tọa độ
Nếu K < 0 xét đoạn thẳng (Xb, Yb);
(2Xb – Xa, Ya) và thay mỗi điểm (x,y)
tìm được bởi (2Xb – X , Y)
•
KHỞI ĐẦU
X = Xa, Y = Ya, ∆y=yb-ya,
∆x=xb-xa
P = ∆y - ∆x/2
Int midpoint(int XA,int XB,int YA, Int
YB, point*kp)
{
Int X =XA; int Y = YA;
•
Điều kiện dừng
X > Xb
Sơ đồ khối:
Int ∆x = XB-XA;
Int ∆y = YB- YA;
Float P=∆y -1/2. ∆x;
While (X<=XB){Kq[i].X = X; Kq[i].Y
= Y; i++;
if(P<= 0){P = P + ∆y;}
Else {Y++;P= P +∆y - ∆x;} X++;}
return i; }
;
5. Câu 4: Trình bày thuật toán vẽ
Void Bresenham(int x, int y, int R,
point*kq)
{ int x, y, count = 0, temp= R/ sqrt(2), P ;
X=0, y=R, P= 5-4R;
While(x<= temp)
{
Kq[count].X= X+Xt, kq[count++].Y=
Y+Yt;
………………………………………………..
Kq[count].X= Y+Xt, kq[count++].Y=
X+Yt;
If(P<=0)
Else {P= P+8X +12;
P= P +8X-8Y +20
Y= Y-1;
}
X=X+1;} return count; }
đường tròn Bresenham
Khởi đầu:
X=0, y=R
P=5-4*R
ĐK dừng
X> R /
2
Sơ đồ khối:
Chương trình:
6. Câu 5: Trình bày thuật toán vẽ đường
tròn MidPoint
Khởi đầu:
X=0, y=R
P=5/4-R
ĐK dừng
X> R /
Sơ đồ khối:
2
Chương trình:
Void Midpoint(int x, int y, int
R, point*kq)
{ int x, y, count = 0, temp= R/
sqrt(2), P ;
X=0, y=R, P= 5/4-R;
While(x<= temp)
{
Kq[count].X= X+Xt,
kq[count++].Y= Y+Yt;
…………………………………
……………..
Kq[count].X= Y+Xt,
kq[count++].Y= X+Yt;
If(P<=0)
P= P+2X +3;
Else {
P= P +2X-2Y +5;
Y= Y-1;
}
X=X+1;} return count; }
7. Câu 6: Trình bày thuật toán tính
điểm cắt của 2 đường thẳng:
Chương trình:
BOOLEAN DiemCat(int Xa, int Xb, int
Xc, int Xd, int Ya, int Yb, int Yc, int
Yd, Point *kq){
Int a1=Ya-Yb; b1=xb-xa; a2=ycyd; b2=xd-xc;c1=b1*Ya+a1*Xa;
c2=b2*yc+a2*xc;
Int D=a1*b2-a2*b1;
If(D==0) return FALSE;
Else{
Kq.x=(c1*b2-c2*b1)/D;
Kq.y=(a1.c2-a2.c1)/D;
Return(kq.x>=max(min(xa,xb),min(xc,
xd))&&kq.x<=min(max(xa,xb),max(xc
,xd))&&kq.y>=max(min(ya,yb),min(yc
,yd))&&kq.y<=min(max(ya,yb),max(y
c,yd)))
min(int x, int y){return x<y?x:y;}
max(int x, int y){return x>y?x:y;}
return 0;
}
8. Câu 7: Trình bày thuật toán tô màu
vết dầu loang (Boundary Line):
Chương trình:
Void BLFill(int x, int y, int Bclolor, int
Fcolor)
{
Int color;
Putpixel(x,y,Fcolor)
Color= getpixel(x+1,y);
If(color!=Bcolor && color!=Fcolor)
BLFill(x+1,y,Bcolor,Fcolor);
Color= getpixel(x-1,y);
If(color!=Bcolor && color!=Fcolor)
BLFill(x-1,y,Bcolor,Fcolor);
Color=getpixel(x,y-1);
If(color!=Bcolor && color!= Fcolor)
BLFill(x,y-1,Bcolor,Fcolor);
Color=getpixel(x,y+1);
If(color!=Bcolor && color!=Fcolor)
BLFill(x,y+1,Bcolor,Fcolor);
}
9. Câu 8: Thuật toán tô màu nước nổi
(Scan Line)
Void SLFill(int Xmin, int Ymin, int
Xmax, int Ymax, int Bcolor,int Fcolor)
{
Int x, y;
Bool flag;
For(Y=Ymax; Y>Ymin;Y--)
{
Flag=False;
For(X=Xmin;X<Xmax;X++){
If(getpixel(x,y)==Bcolor)
{If(!Is Double(x,y,color)) Flag =!flag;}
Else
If(flag==TRUE)
Putpixel(x,y,Fcolor);
}
}
Bool IsDouble(int x, int y,int Bcolor)
{Return
(getpixel(x-1,y-1)!
=Bcolor&&getpixel(x,y-1)!=Bcolor&&
getpixel(x+1,y-1)!=Bcolor)||
(getpixel(x-1,y+1)!
=Bcolor&&getpixel(x,y+1)!
=Bcolor&&getpixel(x+1,y+1)!
=BColor)
}
10. Câu 9:Trình bày phép quay xung
quanh gốc tạo độ
X’=r.cos(α +β)= r.cos αcos β – r.sin α.sin
β = x.cos α -ysin β
Y’= r.sin(α +β)= r.sin αcos β + r.cos α.sin
β = x.sin α +ycos β
Gọi ma trận biến đổi của phép quay
quanh góc α quanh gốc tọa độ là
T[α] = a1
a2
Câu 10 Hệ tọa độ thuần nhất
Tọa độ thuần nhất của một điểm trên mặt
phẳng được biểu diễn bằng bộ ba số tỉ lệ
(xh , yh , h) không đồng thời bằng 0 và
liên hệ với các tọa độ (x, y) của điểm đó
bởi công thức :
b1 b2
ta có (x’ y’)=(x y)* T[α]
x’= a1.x + b1.y
y’= a1.x + b2.y
=> x. cos α - y.sin α = a1.x + b1.y
x. sin α + y.cos α = a2.x + b2.y
do đó ta có a1=cos α , b1 = -sin α
a2=sin α , b2= cos α
vậy ta có
T[α] = cos α
sin α
-sin α
cos α
Nếu một điểm có tọa độ thuần nhất là
(x,y,z) thì nó cũng có tọa độ thuần nhất
là (h.x, h.y, h.z) trong đó h là số thực
khác 0 bất kỳ.
Một điểm P(x,y) sẽ được biểu diễn dưới
dạng tọa độ thuần nhất là (x,y,1).
2: Tại sao người ta sử dụng toạ độ
thuần nhất?
Trong thực tế đối tượng khi
chuyển động thường tham gia nhiều
chuyển động thành phần trong đó có
chuyển động tịnh tiến từ đó nảy sinh nhu
cầu thống nhất các cách biểu diễn và để
thống nhất thì người ta phải sự dụng tọa
độ thuần nhất.
11. Câu 11:Hệ tọa độ tay trái là gì? Tại
sao người ta sử dụng hệ tọa độ tay
trái?
1:Hệ tọa độ tay trái là gì?
Hệ tọa độ tay trái là hệ có chiều
dương là chiều thuận chiều kim đồng hồ
2:Tại sao người ta sử dụng hệ tọa độ
tay trái?
Thông thường người ta sử dụng
hệ tọa độ tay phải chiều dương là chiều
ngược chiều kim đồng hồ nhưng hệ tọa
độ này không phù hợp cho đồ họa ba
chiều vì khi tọa độ X càng lớn thì vật
càng ra xa thì lại được thể hiện càng gần
người sử dụng vì vậy để khắc phục
người ta phải sử dụng hệ tọa độ tay trái
để biểu diễn đồ họa ba chiều.
12. Câu 12: Phép quay quanh trục tọa độ:
-Lập luân tương tự ta có
Phép quay quanh trục x:
- Xét phép quay góc φ quanh trục x:
T [ γ ]=
0
P(x,y,z,)->P’(x’,y’,z’)
1 0
0
sinγ 0 conγ 0
Ta có:
0
x’=x
Y’=ycosφ -zsinφ
Z’=ysinφ +zcosφ
1 0
0
0
0 cosφ sinφ
0 1
- Phép quay xung quanh trục z
Xét phép quay góc γ quanh trục x:
Ta có:
x’=xcosγ - y sinγ
0
Y’=x sinγ+ycosγ
0 -sinφ conφ 0
0 0
0
P(x,y,z,)->P’(x’,y’,z’)
-Lập luân tương tự ta có
T [φ ]=
cosγ 0 -sinγ 0
Z’=z
0 1
- Phép quay xung quanh trục y
Xét phép quay góc γ quanh trục x:
P(x,y,z,)->P’(x’,y’,z’)
-Lập luân tương tự ta có
T [ γ ]=
cosγ sinγ
0 0
-sinγ cosγ 0 0
0
Ta có:
x’=zsin γ + x cosγ
Y’=y
Z’=zscos γ -xsin γ
0
1 0
0
0
0 1