1. Họ và tên: Đinh Thị Minh Thu
MSSV: 07K4114
Lớp: 07CK4
Bài Tập Số 1 - Đồ Họa Máy Tính
Bài 1: Trình bày thuật toán vẽ ellipse có tâm là gốc tọa độ, có phương
trình
2
2
x
a
+
2
2
y
b
=1
Bước 1: Vì ellipse
2
2
x
a
+
2
2
y
b
=1 đối xứng qua trục 0x và 0y nên ta chỉ cần dựng 1 trong
4 phần của ellipse. Giả sử ta chọn trong góc phần tư thứ nhất:
y=
b
a
2 2
a x với x 0,a
Bước 2:
Ellipse y=
b
a
2 2
a x với x 0,a có đạo hàm y’= -
b
a 2 2
x
a x
Bảng khảo sát:
x 0
a
b
y’
y 2
2 2
b
a b 0
0
-
-1
2
2 2
a
a b
2. Dựa vào BKS ta có:
Nếu x
2
2 2
0,
a
a b
thì
1
1 1
1
,
i i
i i i
x x
y y y
Nếu x
2
2 2
,
a
a
a b
thì
1
1
, 1
1
i i i
i i
x x x
y y
Bước 3:
Trường hợp giảm chậm
x
2
2 2
0,
a
a b
thì
1
1 1
1
,
i i
i i i
x x
y y y
Hàm kiểm tra bên trong, bên ngoài ellipse
F(x,y)=b2
x2
+ a2
y2
– a2
b2
Gọi điểm MidPoint là M
1
1,
2
i ix y
đặt fi=F(M) ta có:
fi=b2
(xi+1)2
+ a2
(yi-1/2)2
- a2
b2
= b2
xi
2
+a2
yi
2
+2b2
xi –a2
yi+
2
4
a
+b2
– a2
b2
Nếu F(Mi)<0 ta có điểm Mi nằm trong ellipse, căn cứ vào hình điểm nguyên được
chọn tiếp theo là điểm A(xi+1,yi) với yi+1=yi
Nếu F(Mi)>0 ta có điểm Mi nằm ngoài ellipse, căn cứ vào hình điểm nguyên được
chọn tiếp theo là điểm B(xi+1,yi-1) với yi+1=yi -1
i
B
A
iy
iy -1/2
iy -1
ix 1ix
M
=
=
3. Để tính F(M) nhanh hơn ta tìm sự chênh lệch giữa F(Mi+1) và F(Mi) ta có:
F(Mi+1) – F(Mi)=fi+1 - fi
Xét F(Mi)<0 ta có:
fi+1 – fi =b2
(xi+1)2
+a2
yi
2
+2b2
(xi+1)-a2
yi+
2
4
a
+b2
– a2
b2
–
[b2
xi
2
+a2
yi
2
+2b2
xi - a2
yi+
2
4
a
+b2
– a2
b2
] =b2
(2xi+3)
<=> fi+1=fi +b2
(2xi+3)
Xét F(Mi)>0 ta có:
fi+1 – fi =b2
(xi+1)2
+a2
( yi -1)2
+2b2
(xi+1)-a2
( yi -1)+
2
4
a
+b2
– a2
b2
–
[b2
xi
2
+a2
yi
2
+2b2
xi - a2
yi+
2
4
a
+b2
– a2
b2
] =b2
(2xi+3) +a2
(2-2yi)
<=> fi+1=fi +b2
(2xi+3)+a2
(2-2yi)
Đặt H=b2
(2xi+3)
K=b2
(2xi+3)+a2
(2-2yi)
Tổng quát ta có:
x1=0,y1=b
f1= [
2
4
a
]+b2
– a2
b
H=3b2
K=2a2
-2a2
b+3b2
Nếu fi<0 thì xi+1=xi+1, yi+1=yi
fi+1=fi +H
H=H+2b2
K=K+2b2
Nếu fi>0 thì xi+1=xi+1, yi+1=yi -1
fi+1=fi +K
H+=2b2
K+=2a2
+2b2
Trường hợp giảm nhanh
x
2
2 2
,
a
a
a b
thì
1
1
, 1
1
i i i
i i
x x x
y y
4. Hàm kiểm tra bên trong, bên ngoài ellipse
F(x,y)=b2
x2
+ a2
y2
– a2
b2
Gọi điểm MidPoint là M
1
, 1
2
i ix y
đặt fi=F(M) ta có:
fi=b2
(xi+1/2)2
+ a2
(yi-1)2
- a2
b2
= b2
xi
2
+a2
yi
2
-2a2
yi +b2
xi+
2
4
b
+a2
– a2
b2
Nếu F(Mi)<0 ta có điểm Mi nằm trong ellipse, căn cứ vào hình điểm nguyên được
chọn tiếp theo là điểm B(xi+1,yi-1) với xi+1 = xi+1, yi+1=yi -1
Nếu F(Mi)>0 ta có điểm Mi nằm ngoài ellipse, căn cứ vào hình điểm nguyên được
chọn tiếp theo là điểm A(xi ,yi-1) với xi+1 = xi, yi+1=yi -1
Để tính F(M) nhanh hơn ta tìm sự chênh lệch giữa F(Mi+1) và F(Mi) ta có:
F(Mi+1) – F(Mi)=fi+1 - fi
Xét F(Mi)<0 ta có:
fi+1 – fi =b2
(xi+1)2
+a2
(yi-1)2
-2a2
(yi-1)+b2
( xi+1)+
2
4
b
+a2
– a2
b2
–
[b2
xi
2
+a2
yi
2
-2a2
yi +b2
xi+
2
4
b
+a2
– a2
b2
] =b2
(2xi+2)+a2
(3-2yi)
<=> fi+1=fi +b2
(2xi+2)+a2
(3-2yi)
5. Xét F(Mi)>0 ta có:
fi+1 – fi =b2
xi
2
+a2
(yi-1)2
-2a2
(yi-1)+b2
xi+
2
4
b
+a2
– a2
b2
–
[b2
xi
2
+a2
yi
2
-2a2
yi +b2
xi+
2
4
b
+a2
– a2
b2
] =a2
(3-2yi)
<=> fi+1=fi +a2
(3-2yi)
Đặt H=a2
(-2yi+3)
K=b2
(2xi+2)+a2
(3-2yi)
Tổng quát ta có:
x1=
2
2 2
a
a b
,y1=
2
2 2
b
a b
f1= [
2
4
b
]–
2 2
2 2
a b
a b
+a2
H=3a2
-
2 2
2 2
2a b
a b
K=3a2
+2b2
Nếu fi<0 thì xi+1=xi+1, yi+1=yi - 1
fi+1=fi +K
H=H+2a2
K=K+2b2
+2a2
Nếu fi>0 thì xi+1=xi, yi+1=yi -1
fi+1=fi +H
H+=2a2
K+=2a2
Bước 4:
Thuật toán vẽ ellipse trong vùng giảm chậm:
x=0,y=b;
f= [
2
4
a
]+b2
– a2
b;
H=3b2
;
K=2a2
-2a2
b+3b2
;
putpixel(x,y);
while(x<
2
2 2
a
a b
) do
if(f<0)then
f=f +H;
H=H+2b2
;
K=K+2b2
;
6. else
f=f +K;
H+=2b2
;
K+=2a2
+2b2
;
y=y-1;
end if
x=x+1;
putpixel(x,y);
putpixel(-x,y);
putpixel(-x,-y);
putpixel(x,-y);
end while
Thuật toán vẽ ellipse trong vùng giảm nhanh
x=
2
2 2
a
a b
,y=
2
2 2
b
a b
f= [
2
4
b
]–
2 2
2 2
a b
a b
+a2
H=3a2
-
2 2
2 2
2a b
a b
K=3a2
+2b2
round(x);
round(y);
round(H);
round(f);
putpixel(x,y);
while(x<=a) do
if(f<0)then
f=f +K;
H=H+2a2
;
K=K+2b2
+2a2
;
x=x+1;
else
f=f+H;
H+=2a2
;
K+=2a2
;
end if
y=y-1;
putpixel(x,y);
putpixel(-x,y);
putpixel(-x,-y);
putpixel(x,-y);
end while
7. Bài 2: Trình bày thuật toán vẽ parabol y=
2
x
A
và y2
=Ax
Trường hợp 1: y=
2
x
A
Không mất tính tổng quát ta đặt
1
A
=a. Khi đó y=ax2
Bước 1:
Vì parabol y=ax2
đối xứng qua trục 0y nên ta chỉ cần dựng 1 trong 2 nửa của parabol, giả
sử là:
2
ax
0,
y
x
Bước 2:
Parabol y=ax2
với x 0, có đạo hàm y’=2ax
Bảng khảo sát:
Dựa vào bảng khảo sát ta có:
Nếu x
1
0,
2a
thì
1
1
1
, 1
i i
i i i
x x
y y y
Nếu x
1
,
2a
thì
1
1
, 1
1
i i i
i i
x x x
y y
x
y’
y
0
0
1/2a
0 1/4a
+
+
1
+
8. Bước 3
Trường hợp tăng chậm:
x
1
0,
2a
thì
1
1
1
, 1
i i
i i i
x x
y y y
Hàm kiểm tra bên trong, bên ngoài parabol
F(x,y)=ax2
- y
Gọi điểm MidPoint là M(xi+1,yi+
1
2
) đặt fi=F(Mi) ta có:
F(M)=F(xi+1,yi+
1
2
)=a(xi+1)2
– (yi+
1
2
) = axi
2
+ 2axi – yi +a -
1
2
Nếu F(Mi)<0 ta có điểm Mi nằm bên trong parabol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm A(xi+1,yi) với yi+1 =yi
Nếu F(Mi)>0 ta có điểm Mi nằm bên ngoài parabol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm B(xi+1,yi+1) với yi+1 =yi+1
Để tính F(M) nhanh hơn ta tìm sự chênh lệch giữa F(Mi) và F(Mi+1)
F(Mi+1) – F(Mi)=fi+1 - fi
Xét F(Mi)<0 ta có:
fi+1 - fi = a(xi+1)2
+ 2a(xi +1) – yi +a -
1
2
-[axi
2
+ 2axi – yi +a -
1
2
]
<=> fi+1 = fi + a(2xi+3)
9. Xét F(Mi)>0 ta có:
fi+1 - fi = a(xi+1)2
+ 2a(xi +1) –(yi +1)+a -
1
2
- [axi
2
+ 2axi – yi +a -
1
2
]
<=> fi+1 = fi + a(2xi+3) -1
Tổng quát ta có:
x1=0,y1=0
f1=a-
1
2
;
Nếu fi<0 thì xi+1=xi+1 , yi+1=yi
fi+1=fi+a(2xi+3)
Nếu fi>0 thì xi+1=xi+1 , yi+1=yi+1
fi+1=fi+a(2xi+3)-1
Trường hợp tăng nhanh:
x
1
,
2a
thì
1
1
, 1
1
i i i
i i
x x x
y y
Hàm kiểm tra bên trong, bên ngoài parabol
F(x,y)=ax2
- y
Gọi điểm MidPoint là M(xi+
1
2
,yi+1) đặt fi=F(Mi) ta có:
F(M)=F(xi+
1
2
,yi+1)=a(xi+
1
2
)2
– (yi+1) = axi
2
+ axi – yi +
4
a
-1
10. Nếu F(Mi)<0 ta có điểm Mi nằm bên trong parabol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm B(xi+1,yi+1) với xi+1 =xi+1
Nếu F(Mi)>0 ta có điểm Mi nằm bên ngoài parabol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm A(xi,yi+1) với xi+1 =xi
Để tính F(M) nhanh hơn ta tìm sự chênh lệch giữa F(Mi) và F(Mi+1)
F(Mi+1) – F(Mi)=fi+1 - fi
Xét F(Mi)<0 ta có:
fi+1 - fi = a(xi+1)2
+ a(xi+1) – (yi +1)+
4
a
-1- [axi
2
+ axi – yi +
4
a
-1]
<=> fi+1 = fi + 2a(xi+1) -1
Xét F(Mi)>0 ta có:
fi+1 - fi = axi
2
+axi – (yi +1)+
4
a
-1- [axi
2
+ axi – yi +
4
a
-1]
<=> fi+1 = fi -1
Tổng quát ta có:
x1=
1
2a
, y1=
1
4a
f1=
4
a
-
1
2
;
Nếu fi<0 thì xi+1=xi+1 , yi+1=yi+1
fi+1 = fi + 2a(xi+1) -1
Nếu fi>0 thì xi+1=xi , yi+1=yi+1
fi+1=fi-1
Bước 4:
Thuật toán vẽ parabol trong vùng tăng chậm
x=0,y=0
f=a-
1
2
;
putpixel(x,y);
while x<
1
2a
do
if( f<0) then
f=f+a(2x+3) ;
else
f=f+a(2x+3)-1 ;
y=y+1;
end if
x=x+1;
putpixel(x,y);
putpixel(-x,y);
end while
11. Thuật toán vẽ parabol trong vùng tăng nhanh
x=
1
2a
, y=
1
4a
f=
4
a
-
1
2
; n với (n>
1
2a
)điều kiện dừng
putpixel(x,y);
while x< n do
if( f<0) then
f=f+2a(xi+1) -1 ;
x=x+1 ;
else
f=f-1 ;
end if
y=y+1;
putpixel(x,y);
putpixel(-x,y);
end while
Trường hợp 2: y2
=ax <=> y= ax
Bước 1:
Ta thấy parabol này đối xứng qua trục hoành nên ta chỉ cần vẽ 1 trong 2 nửa của parabol.
Giả sử là:
ax
0,
y
x
Bước 2:
Parabol y= ax với x 0, có đạo hàm y’=
2 ax
a
Bảng khảo sát:
y
x
y’
1
0 +
-
0
a/4
a/2
0
+
12. Dựa vào bảng khảo sát ta có:
Nếu x 0,
4
a
thì
1
1
, 1
1
i i i
i i
x x x
y y
Nếu x ,
4
a
thì
1
1
, 1
1
i i i
i i
y y y
x x
Bước 3:
Trường hợp tăng nhanh:
x 0,
4
a
thì
1
1
, 1
1
i i i
i i
x x x
y y
Hàm kiểm tra bên trong, bên ngoài parabol
F(x,y)=y- ax
Gọi điểm MidPoint là M(xi+
1
2
,yi+1) đặt fi=F(Mi) ta có:
F(M)=F(xi+
1
2
,yi+1)= (yi+1) - i
1
a(x + )
2
= yi+1 - [ iax +
2
a
]
Nếu F(Mi)<0 ta có điểm Mi nằm bên trong parabol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm A(xi,yi+1) với xi+1 =xi
13. Nếu F(Mi)>0 ta có điểm Mi nằm bên ngoài parabol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm B(xi+1,yi+1) với xi+1 =xi+1
Để tính F(M) nhanh hơn ta tìm sự chênh lệch giữa F(Mi) và F(Mi+1)
F(Mi+1) – F(Mi)=fi+1 - fi
Xét F(Mi)<0 ta có:
fi+1 - fi = (yi+1)+1 - [ iax +
2
a
] – (yi+1 - iax +
2
a
) =1
<=> fi+1 = fi + 1
Xét F(Mi)>0 ta có:
fi+1 - fi = (yi+1)+1 - ia(x +1)+
2
a
– (yi+1 - iax +
2
a
) =1+ iax +
2
a
- i
3
ax +
2
a
<=> fi+1 = fi +1+[ iax +
2
a
- i
3
ax +
2
a
]
Tổng quát ta có:
x1=0 , y1=0;
f1= 1 –[
2
a
];
Nếu fi<0 thì xi+1=xi , yi+1=yi+1
fi+1 = fi +1;
Nếu fi>0 thì xi+1=xi +1, yi+1=yi+1
fi+1=fi +1+[ iax +
2
a
- i
3
ax +
2
a
]
Trường hợp tăng chậm:
x ,
4
a
thì
1
1
, 1
1
i i i
i i
y y y
x x
14. Hàm kiểm tra bên trong, bên ngoài parabol
F(x,y)=y- ax
Gọi điểm MidPoint là M(xi+1,yi+
1
2
) đặt fi=F(Mi) ta có:
F(M)=F(xi+1,yi+
1
2
)= (yi+
1
2
) - ia(x +1) = yi+[
1
2
- ia(x +1) ]
Nếu F(Mi)<0 ta có điểm Mi nằm bên trong parabol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm A(xi+1,yi+1) với yi+1 =yi+1
Nếu F(Mi)>0 ta có điểm Mi nằm bên ngoài parabol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm B(xi+1,yi) với yi+1 =yi
Để tính F(M) nhanh hơn ta tìm sự chênh lệch giữa F(Mi) và F(Mi+1)
F(Mi+1) – F(Mi)=fi+1 - fi
Xét F(Mi)<0 ta có:
fi+1 - fi = (yi+1)+
1
2
- ia((x +1)+1) - [yi+
1
2
- ia(x +1) ] = 1+ ia(x +1) - ia(x +2)
<=> fi+1 = fi +1+[ ia(x +1) - ia(x +2) ]
Xét F(Mi)>0 ta có:
fi+1 - fi = yi+
1
2
- ia((x +1)+1) - [yi+
1
2
- ia(x +1) ] = ia(x +1) - ia(x +2)
<=> fi+1 = fi +[ ia(x +1) - ia(x +2) ]
15. Tổng quát ta có:
x1=
4
a
, y1=
2
a
;
f1= [
2
a
+ 21 1
4
2 2
a a ];
Nếu fi<0 thì xi+1=xi+1 , yi+1=yi+1
fi+1 = fi +1+[ ia(x +1) - ia(x +2) ];
Nếu fi>0 thì xi+1=xi +1, yi+1=yi
fi+1=fi +[ ia(x +1) - ia(x +2) ]
Bước 4:
Thuật toán vẽ parabol trong vùng tăng nhanh
x=0 , y=0;
f=1 –[
2
a
];
putpixel(x,y);
while x<
4
a
do
if( f<0) then
f=f+1;
else
f=f+1+[ iax +
2
a
- i
3
ax +
2
a
] ;
x=x +1;
end if
y=y+1;
putpixel(x,y);
putpixel(x,-y);
end while
16. Thuật toán vẽ parabol trong vùng tăng chậm
x=
4
a
, y=
2
a
;round(x);round(y);
f=[
2
a
+ 21 1
4
2 2
a a ]; round(f);
n (với n>
4
a
)điều kiện dừng ;
putpixel(x,y);
while x< n do
if( f<0) then
f=f+1+[ ia(x +1) - ia(x +2) ];
y=y+1;
else
f=f+[ iax +
2
a
- i
3
ax +
2
a
] ;
end if
x=x +1;
round(f);
putpixel(x,y);
putpixel(x,-y);
end while
Bài 3: Trình bày thuật toán vẽ hyperbol
2 2
2 2
1
x y
a b
và
2 2
2 2
1
x y
a b
Trường hợp 1:
2 2
2 2
1
x y
a b
Bước 1:
Ta có
2 2
2 2
1
x y
a b
<=> y= 2 2b
x a
a
, suy ra hyperbol này đối xứng qua trục hoành.
Mặt khác với x , ,a a thì 2 nửa phía trên trục hoành của hyperbol cũng đối
xứng với nhau qua trục tung. Vì vậy ta chỉ cần vẽ một nhánh của hyperbol rồi lấy đối
xứng.
17. Giả sử ta chọn:
2 2
,
b
y x a
a
x a
Bước 2:
y= 2 2b
x a
a
có đạo hàm y’=
2 2
bx
a x a
Bảng biến thiên:
Phân chia đồ thị thành các vùng hệ số góc tăng nhanh và tăng chậm ta được:
Nếu 2
2 2
1 '( )f x
a
a x
a b
thì
1
1
1
, 1
i i
i i i
y y
x x x
Nếu 2
2 2
0 '( ) 1f x
a
x
a b
thì
1
1
1
, 1
i i
i i i
x x
y y y
Bước 3:
x
y
y’
a
0
+
+
1
0
+
2
2 2
b
a b
2
2 2
a
a b
18. Trường hợp tăng nhanh
2
2 2
1 '( )f x
a
a x
a b
thì
1
1
1
, 1
i i
i i i
y y
x x x
Hàm kiểm tra bên trên, bên dưới hyperbol
F(x,y)=b2
x2
- a2
y2
– a2
b2
Gọi điểm MidPoint là M(xi+
1
2
,yi+1) đặt fi=F(Mi) ta có:
F(M)=F(xi+
1
2
,yi+1)= b2
(xi+
1
2
)2
– a2
(yi+1)2
- a2
b2
=
b2
xi
2
+b2
xi – a2
yi
2
– 2a2
yi+[
2
4
b
]- a2
– a2
b2
Nếu F(Mi)<0 ta có điểm Mi nằm bên trên hyperbol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm B(xi+1,yi+1) với xi+1 =xi+1
Nếu F(Mi)>0 ta có điểm Mi nằm bên dưới hyperbol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm A(xi,yi+1) với xi+1 =xi
Để tính F(M) nhanh hơn ta tìm sự chênh lệch giữa F(Mi) và F(Mi+1)
F(Mi+1) – F(Mi)=fi+1 - fi
19. Xét F(Mi)<0 ta có:
fi+1 - fi = b2
(xi +1)2
+b2
(xi +1) – a2
(yi +1)2
– 2a2
(yi +1)+
2
4
b
- a2
– a2
b2
–
[b2
xi
2
+b2
xi – a2
yi
2
– 2a2
yi+
2
4
b
- a2
– a2
b2
] = 2b2
(xi+1) – a2
(2yi +3)
<=> fi+1 = fi + 2b2
(xi+1) – a2
(2yi +3)
Xét F(Mi)>0 ta có:
fi+1 - fi = b2
xi
2
+b2
xi – a2
(yi +1)2
– 2a2
(yi +1)+
2
4
b
- a2
– a2
b2
–
[b2
xi
2
+b2
xi – a2
yi
2
– 2a2
yi+
2
4
b
- a2
– a2
b2
] = - a2
(2yi+3)
<=> fi+1 = fi - a2
(2yi+3)
Đặt H = 2b2
(xi+1) – a2
(2yi +3)
K=- a2
(2yi+3)
Tổng quát ta có:
x1=a , y1=0;
H=2b2
a – 3a2
+2b2
K= - 3a2
f1= b2
a +[
2
4
b
] - a2
;
Nếu fi<0 thì xi+1=xi+1 , yi+1=yi+1
H=H +2b2
– 2a2
;
K=K – 2a2
fi+1 = fi +H;
Nếu fi>0 thì xi+1=xi , yi+1=yi+1
H=H – 2a2
;
K=K – 2a2
;
fi+1=fi +K;
Trường hợp tăng chậm:
2
2 2
0 '( ) 1f x
a
x
a b
thì
1
1
1
, 1
i i
i i i
x x
y y y
20. Hàm kiểm tra bên trên, bên dưới hyperbol
F(x,y)=b2
x2
- a2
y2
– a2
b2
Gọi điểm MidPoint là M(xi+1,yi+
1
2
) đặt fi=F(Mi) ta có:
F(M)=F(xi+1,yi+
1
2
)= b2
(xi+1)2
– a2
(yi+
1
2
)2
- a2
b2
=
b2
xi
2
+b2
xi – a2
yi
2
– a2
yi - [
2
4
a
]+b2
– a2
b2
Nếu F(Mi)<0 ta có điểm Mi nằm bên trên hyperbol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm B(xi+1,yi) với yi+1 =yi
Nếu F(Mi)>0 ta có điểm Mi nằm bên dưới hyperbol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm A(xi+1,yi+1) với yi+1 =yi+1
Để tính F(M) nhanh hơn ta tìm sự chênh lệch giữa F(Mi) và F(Mi+1)
F(Mi+1) – F(Mi)=fi+1 - fi
Xét F(Mi)<0 ta có:
fi+1 - fi = b2
(xi +1)2
+b2
(xi +1) – a2
yi
2
– a2
yi - [
2
4
a
]+b2
– a2
b2
–
[b2
xi
2
+b2
xi – a2
yi
2
– a2
yi - [
2
4
a
]+b2
– a2
b2
] = 2b2
(xi+1)
<=> fi+1 = fi + 2b2
(xi+1)
Xét F(Mi)>0 ta có:
fi+1 - fi = b2
(xi +1)2
+b2
(xi +1) – a2
(yi +1)2
– a2
(yi +1) - [
2
4
a
]+b2
– a2
b2
–
[b2
xi
2
+b2
xi – a2
yi
2
– a2
yi - [
2
4
a
]+b2
– a2
b2
] = 2b2
(xi+1) – 2a2
(yi +1)
<=> fi+1 = fi +2b2
(xi+1) – 2a2
(yi +1)
21. Đặt H = 2b2
(xi+1)
K=2b2
(xi+1) – 2a2
(yi +1)
Tổng quát ta có:
x1=
2
2 2
a
a b
, y1=
2
2 2
b
a b
;
f1= b2
(
2
2 2
a
a b
)2
+b2
2
2 2
a
a b
– a2
(
2
2 2
b
a b
)2
–
a2
(
2
2 2
b
a b
) - [
2
4
a
]+b2
– a2
b2
= b2
–[
2
4
a
]
H=2b2
+
2 2
2 2
2a b
a b
, K=2b2
-2a2
Nếu fi<0 thì xi+1=xi+1 , yi+1=yi
H=H+2b2
;
K=K+2b2
;
fi+1 = fi + H;
Nếu fi>0 thì xi+1=xi +1, yi+1=yi+1
H=H+2b2
;
K=K+2b2
– 2a2
;
fi+1=fi +K;
Bước 4:
Thuật toán vẽ hyperbol trong vùng tăng nhanh
x=a , y=0;
H=2b2
a – 3a2
+2b2
K= - 3a2
f= b2
a +[
2
4
b
] - a2
;
putpixel(x,y);
while x<
2
2 2
a
a b
do
if( f<0) then
H=H +2b2
– 2a2
;
K=K – 2a2
f = f +H;
x=x+1;
22. else
H=H – 2a2
;
K=K – 2a2
;
fi+1=fi +K;
end if
y=y+1;
putpixel(x,y);
putpixel(x,-y);
putpixel(-x,y);
putpixel(-x,-y);
end while
Thuật toán vẽ hyperbol trong vùng tăng chậm
x=
2
2 2
a
a b
, y=
2
2 2
b
a b
;
f= b2
–
2
4
a
; H=2b2
+
2 2
2 2
2a b
a b
, K=2b2
-2a2
round(x);
round(y);
round(H);
round(f);
n( với n>
2
2 2
a
a b
) điều kiện dừng
putpixel(x,y);
while x< n do
if( f<0) then
H=H+2b2
;
K=K+2b2
;
f = f + H;
else
H=H+2b2
;
K=K+2b2
– 2a2
;
f=f +K;
y=y+1;
end if
x=x+1;
putpixel(x,y);
putpixel(x,-y);
putpixel(-x,y);
putpixel(-x,-y);
end while
23. Trường hợp 2:
2 2
2 2
1
x y
a b
Bước 1:
Ta có
2 2
2 2
1
x y
a b
<=> y= 2 2b
x a
a
, suy ra hyperbol này đối xứng qua trục hoành.
Mặt khác với x 0, ,0 của hyperbol cũng đối xứng với nhau qua trục tung. Vì
vậy ta chỉ cần vẽ một nhánh của hyperbol rồi lấy đối xứng.
Giả sử ta chọn:
2 2
0,
b
y x a
a
x
Bước 2:
y= 2 2b
x a
a
có đạo hàm y’=
2 2
bx
a x a
Phân chia đồ thị thành các vùng hệ số góc tăng nhanh và tăng chậm ta được:
Nếu 2
2 2
0 '( ) 1
0
f x
a
x
b a
thì
1
1
1
, 1
i i
i i i
x x
y y y
Nếu 2
2 2
1 '( )f x
a
x
b a
thì
1
1
1
, 1
i i
i i i
y y
x x x
Bước 3:
Trường hợp tăng chậm:
2
2 2
0 '( ) 1
0
f x
a
x
b a
thì
1
1
1
, 1
i i
i i i
x x
y y y
24. Hàm kiểm tra bên trên, bên dưới hyperbol
F(x,y)=b2
x2
- a2
y2
+ a2
b2
Gọi điểm MidPoint là M(xi+1,yi+
1
2
) đặt fi=F(Mi) ta có:
F(M)=F(xi+1,yi+
1
2
)= b2
(xi+1)2
– a2
(yi+
1
2
)2
+ a2
b2
=
b2
xi
2
+b2
xi – a2
yi
2
– a2
yi - [
2
4
a
]+b2
+a2
b2
Nếu F(Mi)<0 ta có điểm Mi nằm bên trên hyperbol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm A(xi+1,yi) với yi+1 =yi
Nếu F(Mi)>0 ta có điểm Mi nằm bên dưới hyperbol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm B(xi+1,yi+1) với yi+1 =yi+1
Để tính F(M) nhanh hơn ta tìm sự chênh lệch giữa F(Mi) và F(Mi+1)
F(Mi+1) – F(Mi)=fi+1 - fi
Xét F(Mi)<0 ta có:
fi+1 - fi = b2
(xi +1)2
+b2
(xi +1) – a2
yi
2
– a2
yi - [
2
4
a
]+b2
+ a2
b2
–
[b2
xi
2
+b2
xi – a2
yi
2
– a2
yi - [
2
4
a
]+b2
+ a2
b2
] = 2b2
(xi+1)
<=> fi+1 = fi + 2b2
(xi+1)
25. Xét F(Mi)>0 ta có:
fi+1 - fi = b2
(xi +1)2
+b2
(xi +1) – a2
(yi +1)2
– a2
(yi +1) - [
2
4
a
]+b2
+ a2
b2
–
[b2
xi
2
+b2
xi – a2
yi
2
– a2
yi - [
2
4
a
]+b2
+ a2
b2
] = 2b2
(xi+1) – 2a2
(yi +1)
<=> fi+1 = fi +2b2
(xi+1) – 2a2
(yi +1)
Đặt H = 2b2
(xi+1)
K=2b2
(xi+1) – 2a2
(yi +1)
Tổng quát ta có:
x1=0, y1=b; H= 2b2
,K= 2b2
– 2a2
(b+1);
f1=b2
-
2
4
a
-a2
b ;
Nếu fi<0 thì xi+1=xi+1 , yi+1=yi
H=H+2b2
;
K=K+2b2
;
fi+1 = fi + H;
Nếu fi>0 thì xi+1=xi +1, yi+1=yi+1
H=H+2b2
;
K=K+2b2
– 2a2
;
fi+1=fi +K;
Trường hợp tăng nhanh
2
2 2
1 '( )f x
a
x
b a
thì
1
1
1
, 1
i i
i i i
y y
x x x
26. Hàm kiểm tra bên trên, bên dưới hyperbol
F(x,y)=b2
x2
- a2
y2
+ a2
b2
Gọi điểm MidPoint là M(xi+
1
2
,yi+1) đặt fi=F(Mi) ta có:
F(M)=F(xi+
1
2
,yi+1)= b2
(xi+
1
2
)2
– a2
(yi+1)2
+ a2
b2
=
b2
xi
2
+b2
xi – a2
yi
2
– 2a2
yi+[
2
4
b
]- a2
+ a2
b2
Nếu F(Mi)<0 ta có điểm Mi nằm bên trên hyperbol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm B(xi+1,yi+1) với xi+1 =xi+1
Nếu F(Mi)>0 ta có điểm Mi nằm bên dưới hyperbol, căn cứ vào Hình, điểm
nguyên tiếp theo ta chọn là điểm A(xi,yi+1) với xi+1 =xi
Để tính F(M) nhanh hơn ta tìm sự chênh lệch giữa F(Mi) và F(Mi+1)
F(Mi+1) – F(Mi)=fi+1 - fi
Xét F(Mi)<0 ta có:
fi+1 - fi = b2
(xi +1)2
+b2
(xi +1) – a2
(yi +1)2
– 2a2
(yi +1)+
2
4
b
- a2
+ a2
b2
–
[b2
xi
2
+b2
xi – a2
yi
2
– 2a2
yi+
2
4
b
- a2
+ a2
b2
] = 2b2
(xi+1) – a2
(2yi +3)
<=> fi+1 = fi + 2b2
(xi+1) – a2
(2yi +3)
27. Xét F(Mi)>0 ta có:
fi+1 - fi = b2
xi
2
+b2
xi – a2
(yi +1)2
– 2a2
(yi +1)+
2
4
b
- a2
+ a2
b2
–
[b2
xi
2
+b2
xi – a2
yi
2
– 2a2
yi+
2
4
b
- a2
+ a2
b2
] = - a2
(2yi+3)
<=> fi+1 = fi - a2
(2yi+3)
Đặt H = 2b2
(xi+1) – a2
(2yi +3)
K=- a2
(2yi+3)
Tổng quát ta có:
x1=
2
2 2
a
b a
, y1=
2
2 2
b
b a
;
H= – 3a2
+2b2
K= - 3a2
-
2 2
2 2
2a b
b a
f1= -[
2 2
2 2
a b
b a
] +[
2
4
b
] - a2
;
Nếu fi<0 thì xi+1=xi+1 , yi+1=yi+1
H=H +2b2
– 2a2
;
K=K – 2a2
fi+1 = fi +H;
Nếu fi>0 thì xi+1=xi , yi+1=yi+1
H=H – 2a2
;
K=K – 2a2
;
fi+1=fi +K;
Bước 4:
Thuật toán vẽ hyperbol trong vùng tăng chậm
x=0, y=b; H= 2b2
,K= 2b2
– 2a2
(b+1);
f=b2
–[
2
4
a
]-a2
b;
putpixel(x,y);
while x<
2
2 2
a
b a
do
if( f<0) then
H=H+2b2
;
K=K+2b2
;
f = f + H;
28. else
H=H+2b2
;
K=K+2b2
– 2a2
;
f=f +K;
y=y+1;
end if
x=x+1;
putpixel(x,y);
putpixel(x,-y);
putpixel(-x,y);
putpixel(-x,-y);
end while
Thuật toán vẽ hyperbol trong vùng tăng nhanh
x=
2
2 2
a
b a
, y=
2
2 2
b
b a
;
H= – 3a2
+2b2
K= - 3a2
-
2 2
2 2
2a b
b a
f1= -[
2 2
2 2
a b
b a
] +[
2
4
b
] - a2
;
round(x);
round(y);
round(K);
n( với n>
2
2 2
a
b a
) điều kiện dừng
putpixel(x,y);
while x<n do
if( f<0) then
H=H +2b2
– 2a2
;
K=K – 2a2
f= f +H;
x=x+1;
else
H=H – 2a2
;
K=K – 2a2
;
f=f+K;
end if
y=y+1;
29. putpixel(x,y);
putpixel(x,-y);
putpixel(-x,y);
putpixel(-x,-y);
end while
Bài 4: Các điểm nguyên vẽ phát sinh khi sử dụng thuật toán DDA, Bresenham cho
các đoạn thẳng sau:
A1(5,10), B1(15,17)
Ta có m =
y
x
=
7
10
<1 nên đây là đoạn thẳng tăng chậm
=> Các điểm nguyên vẽ phát sinh khi sử dụng thuật toán DDA:
i xi y=y+m yi=round(y)
1 5 10 10
2 6 107
10
11
3 7 114
10
11
4 8 121
10
12
5 9 128
10
13
6 10 135
10
14
7 11 142
10
14
8 12 149
10
15
9 13 156
10
16
10 14 163
10
16
11 15 17 17
30. Các điểm nguyên vẽ phát sinh khi sử dụng thuật toán Bresenham:
i pi xi yi
1 4 5 10
2 -2 6 11
3 12 7 11
4 6 8 12
5 0 9 13
6 -6 10 14
7 8 11 14
8 2 12 15
9 -4 13 16
10 10 14 16
11 15 17
A2(-2,3) B2(-12,7)
Ta có m =
y
x
=
4
10
<1 nên đây là đoạn thẳng giảm chậm
=> Các điểm nguyên vẽ phát sinh khi sử dụng thuật toán DDA:
i xi y=y+m yi=round(y)
1 -12 7 7
2 -11 66
10
7
3 -10 62
10
6
4 -9 58
10
6
5 -8 54
10
5
6 -7 50
10
5
7 -6 46
10
5
8 -5 42
10
4
9 -4 38
10
4
10 -3 34
10
3
11 -2 3 3
31. A3(0,10), B3(15,10)
Ta có m=0, đây là đường thẳng nằm ngang nhưng ta có thể áp dụng trường hợp của
đường thẳng tăng chậm.
Các điểm phát sinh khi sử dụng thuật toán DDA:
i xi y=y+m yi=round(y)
1 0 10 10
2 1 10 10
3 2 10 10
4 3 10 10
5 4 10 10
6 5 10 10
7 6 10 10
8 7 10 10
9 8 10 10
10 9 10 10
11 10 10 10
12 11 10 10
13 12 10 10
14 13 10 10
15 14 10 10
16 15 10 10
A4(5,-1), B4(5,-11)
Các điểm phát sinh khi sử dụng thuật toán DDA:
i xi yi
1 5 -1
2 5 -2
3 5 -3
4 5 -4
5 5 -5
6 5 -6
7 5 -7
8 5 -8
9 5 -9
10 5 -10
11 5 -11