Để tiện cho việc khảo sát các hình người ta cần phải thực hiện một số phép biến đổi, dưới đây ta xem xét một số phép biến đổi cơ bản: tịnh tiến, quay, co giãn trong không gian hai chiều
Trang 1Chương 2
Các phép biến đổi hình
trên hệ toạ độ
$4 Các phép biến đổi trong không gian 2 chiều
Chúng ta biết rằng trong không gian hai chiều để biểu diễn các hình người ta thường chọn hệ toạ độ Decác hoặc hệ toạ độ cực Để tiện cho việc khảo sát các hình người
ta cần phải thực hiện một số phép biến đổi, dưới đây ta xem xét một số phép biến
đổi cơ bản: tịnh tiến, quay, co giãn trong không gian hai chiều
1 Phép tịnh tiến:
Giả sử trong hệ toạ độ Decac XOY cho điểm P(x,y) để dịch chuyển điểm P(x,y) đến
điểm P'(x',y') theo vectơ T=[Tx,Ty] khi đó x',y' được xác định như sau:
′ = +
′ = +
⎫
⎬
⎭
x x Tx
y y Ty ( )11
T
P Tx
x
Ty P'
O y Y
Một cách hình thức để tiện cho việc ký hiệu ta có thể biểu diễn công thức 1.1 dưới dạng vectơ sau:
( ,′ ′ =, ) ( , , )ì ( )
⎡
⎣
⎢
⎢
⎢
⎤
⎦
⎥
⎥
⎥
Tx Ty
1
211
ma trận
1
Tx Ty
⎡
⎣
⎢
⎢
⎢
⎤
⎦
⎥
⎥
⎥ gọi là ma trận tịnh tiến ký hiệu là T(Tx,Ty)
Trang 22 Phép quay quanh gốc toạ độ
Phép quay quanh gốc toạ độ O một góc θ
ϕ
r
x '
P
O y Y
Giả sử điểm P(x,y) làm với trục ox một góc ϕ, |OP| = r sau khi quay OP đi một góc
θ ta đ−ợc vectơ OP' Điểm P' có toạ độ (x',y') đ−ợc xác định nh− sau:
x'=rcos(ϕ+θ)=r cosϕ cosθ - r sinϕ sinθ y'=rsin(ϕ+θ)=r cosϕ sinθ + rsinϕ cosθ
do x=rcos(ϕ), y=rsin(ϕ)
ta có:
⎫
⎬
⎭
cos sin sin cos ( )
Công thức (2.1.2) có thể viết lại một cách hình thức sau:
( , , ) ( , , )
cos sin sin cos
⎡
⎣
⎢
⎢
⎢
⎤
⎦
⎥
⎥
⎥
x y 1 x y1
0 0
Có thể ký hiệu ma trận trên là ma trận quay
cos sin
0 0
−
⎡
⎣
⎢
⎢
⎢
⎤
⎦
⎥
⎥
⎥
= R O
R(θ,O) ký hiệu cho ma trận quay quanh gốc toạ độ O một góc θ
3 Phép co gi∙n hệ toạ độ
Giả sử có hệ toạ độ OXY ta cần phải giãn trục OX với hệ số Lx, trục OY với hệ số
Ly khi đó điểm P(x,y) sẽ trở thành điểm P'(x',y') biểu diễn trong hệ XOY có dạng:
′=
′=
⎫
⎬
⎭
x L x
y L y
x y
( )213 Một cách hình thức ta có thể viết công thức (2.1.3) ở dạng:
Trang 3( ,′ ′ =, ) ( , , )ì
⎡
⎣
⎢
⎢
⎢
⎤
⎦
⎥
⎥
⎥
L L
x y
0 0
kí hiệu ma trận co giãn L L L
L L
x y ( , )=
⎡
⎣
⎢
⎢
⎢
⎤
⎦
⎥
⎥
⎥
0 0
4 Biến đổi từ hệ toạ độ thực sang toạ độ màn hình :
Trước tiên ta khai báo kiểu cấu trúc của điểm trong không gian 2 chiều như sau : Type
Point_2D = Record
x, y : Real;
End;
(Tuy rằmg toạ độ trên màn hình là kiểu số nguyên nhưng ta khai báo là kiểu số thực, vì nếu khai báo là kiểu số nguyên các phép tính giữa số thực và số nguyên hay bị tràn số)
a Chuyển từ toạ độ thực sang cửa sổ nhìn :
Giả sử hình vẽ của chúng ta ở hệ toạ độ thực là nằm trong hình chữ nhật có đỉnh trên bên trái là (Xmin,Ymin) và đỉnh dưới bên phải là (Xmax, Ymax) như vậy kích thước của hình vẽ là (Xmax-Xmin) x (Ymax-Ymin), nhưng ta lại muốn nhìn hình vẽ trong một cửa sổ có kích thước là MaxX x MaxY nên nếu hình vẽ nhỏ hơn của sổ nhìn thì ta phải phóng to lên, còn ngược lại nếu lớn hơn thì ta phải thu nhỏ lại, như vậy ta
sẽ thực hiện một phép co dãn theo hệ số co dãn là :
CGx:=MaxX/(Xmax-Xmin);
CGy:=MaxY/(Ymax-Ymin);
Lúc này các toạ độ của các điểm sẽ được nhân với CGx và CGy :
Xmin:=CGx*Xmin;
Xmax:=CGx*Xmax;
Ymin:=CGy*Ymin;
Ymax:=CGy*Ymax;
Trang 4Và ta có thủ tục chuyển một điểm từ toạ độ thực sang cửa sổ nhìn như sau :
Procedure WTV(p : Point_2D; Var q : Point_2D);
Begin
q.x:=p.x*CGx;
q.y:=p.y*CGy;
End;
b Chuyển từ cửa sổ nhìn sang màn hình
Như ta đã biết toạ độ của màn hình có gốc là đỉnh trên bên trái và theo chiều dương như trên hình vẽ, mà ta lại phải mô tả hình vẽ như là ở thế giới thực, do đó ta phải biến đổi hình vẽ từ cửa sổ nhìn sang màn hình
Như ở hình trên gốc toạ độ O của hình vẽ thực sẽ có toạ độ ở trên màn hình là : Xgoc:=0;
If Xgoc>Xmin Then Xgoc:=Round(ABS(Xmin));
Ygoc:=0;
If Ygoc<Ymax Then Ygoc:=Round(ABS(Ymax));
Và ta có thể vẽ hệ trục toạ độ bằng thủ tục sau:
Procedure He_Truc;
Begin
Line(Round(Xgoc),0,Round(Xgoc),GetMaxY);
Line(0,Round(Ygoc),GetMaxX,Round(Ygoc));
End;
Và một điểm (u,v) của hình vẽ thực khi chuyển sang toạ độ màn hình sẽ có toạ độ (x,y) như sau :
x=Xgoc+u ; y=Ygoc-v
Và ta có thủ tục chuyển một điểm từ của sổ nhìn sang toạ độ màn hình như sau : Procedure VTS(p : Point_2D; Var q : Point_2D);
Begin
q.x:=Xgoc+p.x;
q.y:=Ygoc-p.y;
End;
Ta có ví dụ minh hoạ sau :
Program Hinh_sin;
Trang 5Uses Crt, Graph;
Type
Point_2D = Record
x, y : Real;
End;
Const
Xmin: Real=0;
Ymin: Real=0;
Xmax: Real=639;
Ymax: Real=479;
MaxX: Integer=600;
MaxY: Integer=440;
Var
m,n : Integer;
ch: char;
CGx,CGy,x,b,Xgoc,Ygoc : Real;
p1,p2 : Point_2D;
(*********************)
Procedure WTV(p : Point_2D; Var q : Point_2D);
Begin
q.x:=p.x*CGx;
q.y:=p.y*CGy;
End;
(*********************)
Procedure VTS(p : Point_2D; Var q : Point_2D);
Begin
q.x:=Xgoc+p.x;
q.y:=Ygoc-p.y;
End;
(********************)
Procedure He_Truc;
Begin
Line(Round(Xgoc),0,Round(Xgoc),GetMaxY);
Line(0,Round(Ygoc),GetMaxX,Round(Ygoc));
End;
(*********************)
Function bp(x: Real) : Real;
Begin
bp:=Sin(x);
{ bp:=Cos(x);
bp:=Sqr(x); }
end;
(*********************)
Begin
clrscr;
Trang 6m:=0;
InitGraph(m,n,'');
DirectVideo:=False;
MaxX:=GetMaxX;
MaxY:=GetMaxY;
b:=2*pi/360;
Xmin:=0; Xmax:=2*pi;
Ymin:=-1; Ymax:=1;
{ Xmin:=-PI+b; Xmax:=pi-b;
Ymin:=-1; Ymax:=1;
Xmin:=-50; Xmax:=50;
Ymin:=0; Ymax:=2500;}
If Xmin>0 Then Xmin:=0;
If Ymin>0 Then Ymin:=0;
If Xmax<0 Then Xmax:=0;
If Ymax<0 Then Ymax:=0;
CGx:=MaxX/(Xmax-Xmin);
CGy:=MaxY/(Ymax-Ymin);
Xmin:=CGx*Xmin;
Xmax:=CGx*Xmax;
Ymin:=CGy*Ymin;
Ymax:=CGy*Ymax;
Xgoc:=0;
If Xgoc>Xmin Then Xgoc:=Round(ABS(Xmin));
Ygoc:=0;
If Ygoc<Ymax Then Ygoc:=Round(ABS(Ymax));
He_Truc;
x:=Xmin;
p1.x:=x; p1.y:=bp(x);
WTV(p1, p2);
p1:=p2;
VTS(p2, p2);
MoveTo(Round(p2.x),Round(p2.y));
Repeat
p1.x:=x; p1.y:=bp(x);
WTV(p1, p2);
p1:=p2;
VTS(p2, p2);
LineTo(Round(p2.x),Round(p2.y));
x:=x+b;
Until x>2*pi-Xmin+b;
Readln;
CloseGraph;
End
Trang 7ở ví dụ trên ta có thể vẽ đồ thị của nhiều hàm số khác nhau mà không cần lập lại chương trình, mà chỉ cần thay hàm mới gán lại các giá trị của Xmin, Xmax và
Ymin, Ymax tức là đưa bài toán về tìm giá trị lớn nhất và nhỏ nhất của hàm số ở trên đoạn [Xmin, Xmax]
Tương tự như vậy ta cũng có thể áp dụng cho chương trình mô tả các phép biến hình
để hình vẽ có thể được phóng to lên đầy màn hình
Bμi tập :
1 Lập chương trình vẽ đồ thị của các hàm đã biết
2 Lập chương trình mô tả phép biến một đoạn thẳng thành một đoạn thẳng qua các phép biến hình đã nói ở trên
3 Lập chương trình mô tả phép biến một đa giác thành một đa giác qua các phép biến hình đã nói ở trên
4 Lập chương trình mô tả phép biến một đường tròn thành một đường tròn qua các phép biến hình đã nói ở trên
5 Lập chương trình mô tả phép biến một đường Elip thành một đường Elip qua các phép biến hình đã nói ở trên
6 Lập chương trình mô tả phép biến một đường Hypebol thành một đường Hypebol qua các phép biến hình đã nói ở trên
$5 Các phép biến đổi trong không gian 3 chiều
1 Phép tịnh tiến trong không gian 3 chiều
Giả sử trong hệ toạ độ OXYZ có điểm P(x,y,z) cần phải tịnh tiến điểm p theo vectơ T(tx,ty,tz) khi đó ta được điểm P'(x',y',z') được suy tương tự như trong không gian 2 chiều ta có:
( ,′ ′ ′ =, , ) ( , , , )ì
⎡
⎣
⎢
⎢
⎢
⎢
⎤
⎦
⎥
⎥
⎥
⎥
x y z x y z
tx ty tz
1
→
=op T tx ty tz ( , , )
2 Phép quay trong không gian ba chiều
Trực tiếp suy từ trường hợp 2 chiều Giả sử có vectơ → op=(x,y,z) cần phải quay → op
quanh trục Ox một góc ϕ, ta được vectơ → ′ op =(x',y',z') xác định theo công thức: