Chương III. Các phép biến hình
Các phép biến đổi hình học cơ sở bao gồm:
- tịnh tiến /dời hình (translation)
- quay (rotation)
- tỷ lệ /vị tự / (scaling)
Ví dụ:
- một báo cáo viên muốn thu nhỏ các biểu đồ trong báo cáo
- một kiến trúc sư muốn nhìn tòa nhà ở những góc nhìn khác nhau
- nhà thiết kế muốn quan sát, tách rời và chỉnh sửa từng chi tiết của mẫu thiết kế
- ...
Có hai quan điểm về phép biến đổi hình học, có liên quan với nhau và đều có những lợi thế
riêng:
- Biến đổi đối tượng (object transformation): tọa độ của từng điểm trên đối tượng được
biến đổi theo công thức của phép biến hình, tạo ra ảnh của đổi tượng qua phép biến
hình đó.
- Biến đổi hệ tọa độ (coordinate transformation): tạo ra một hệ tọa độ mới, sau đó tất cả
các điểm của đối tượng sẽ được chuyển về hệ tọa độ đó.
Phép biến hình affin
Ánh xạ
T: R
2
R
2
P(x,y) Q(x*,y*)
trong đó:
=
=
),(*
Làm thay đổi kích thước của đối tượng.
=
=
ytyy
xtxx
.*
.*
trong đó ty, tx là hệ số co dãn theo trục tung và trục hoành. Khi tx,ty nhỏ hơn 1, phép biến đổi
sẽ thu nhỏ đối tượng. Khi tx,ty lớn hơn 1, phép biến đổi sẽ phóng to đối tượng. Khi tx=ty: ta
gọi đó là phép đồng dạng (uniform scaling), nó bảo toàn tỷ lệ về kích thước của vật thể.
Phép tịnh tiến trong mặt phẳng
2
Phép quay
Phép quay làm thay đổi hướng của đối tượng. Để xác định phép quay, ta cần biết tâm quay và
góc quay. Phép quay điểm P(x,y) quanh gốc tọa độ một góc α tạo thành điểm ảnh Q(x*,y*)
có công thức như sau:
+=
−=
αα
αα
cos.sin.*
sin.cos.*
yxy
yxx
=
ty
tx
yxyx
0
0
,**,
Q = P×S trong đó
=
ty
tx
S
0
0
là ma trận của phép đồng dạng
Phép quay quanh gốc tọa độ:
( ) ( )
nhau vì biểu diễn của phép tịnh tiến (cộng ma trận) khác với hai phép biến hình còn lại (nhân
ma trận). Chẳng hạn, khi thiết kế một động cơ, ta muốn tháo riêng một chi tiết ra ngoài (tịnh
tiến), xoay 1 góc (quay) rồi lắp vào chỗ cũ (tịnh tiến). Khi đó ta phải thực hiện 3 phép tính
trên ma trận (+ × + ). Người ta đã tìm ra cách biểu diễn trong hệ tọa độ thuần nhất, nhờ đó rút
gọn chuỗi biến đổi trên về chỉ một phép tính.
4.1.3 Hệ tọa độ thuần nhất (homogeneous coordinates)
Tọa độ thuần nhất (đôi khi còn gọi là “đồng nhất”) của điểm (x,y) trên mặt phẳng được biểu
diễn bằng bộ ba (x
h
,y
h
,h) liên hệ với tọa độ (x,y) bởi công thức
h
y
y
h
x
x
hh
==
,
Nếu một điểm có tọa độ thuần nhất là (x,y,z) trong không gian Decac thì nó cũng có tọa độ
thuần nhất là (x.h,y.h,z.h) trong đó h là số thực khác không bất kỳ. Ngược lại điểm (x,y,z)
trong hệ tọa độ thuần nhất sẽ có tương ứng với điểm (x/z,y/z) trong hệ tọa độ Decac. Tọa độ
thuần nhất của một điểm trong không gian 3 chiều hay nhiều chiều cũng được xác định theo
cách tương tự. Để đơn giản hóa, người ta thường chọn h=1, lúc này đ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)
4.1.4 Ma trận của các phép biến hình trong hệ tọa độ thuần nhất
Phép tịnh tiến:
( ) ( )
010
001
ba
T
Phép tỷ lệ:
( ) ( )
×=
100
00
00
1,,1*,*, ty
tx
yxyx
Hay Q = P × S trong đó S là ma trận của phép tỷ lệ
yxyx
Hay Q = P × R trong đó R là ma trận của phép quay
−=
100
0cossin
0sincos
αα
αα
R
5
4.1.5 Kết hợp các phép biến hình
Bất kỳ phép biến hình nào cũng được kết hợp từ phép tịnh tiến, tỷ lệ và quay.
Khi áp dụng liên tiếp các phép biến hình trên đối tượng, ta phải thực hiện nhiều phép nhân
với các ma trận tương ứng. Thay vào đó, ta sẽ chuẩn bị sẵn ma trận tích và sử dụng như ma
trận của phép biến hình tổng thể.
Kết hợp các phép tịnh tiến
Ta thực hiện phép tịnh tiến T
1
với vector tịnh tiến (a,b) lên điểm P(x,y) và thu được ảnh Q’,
sau đó thực hiện tiếp phép tịnh tiến T
×
++=
1
010
001
1
010
001
1
010
001
),(),().,(
21
dbcadcba
dbcaTdcTbaT
Kết hợp các phép tỷ lệ
Tương tự như phép tịnh tiến, kết hợp của nhiều phép tỷ lệ là một phép tỷ lệ. Giả sử ta kết hợp
hai phép tỷ lệ sau: S = S
100
00
00
100
00
00
100
00
00
21
21
1
2
1
1
tyty
txtx
ty
tx
ty
tx
Kết hợp các phép quay
Tương tự như phép tịnh tiến, kết hợp của nhiều phép quay quanh gốc tọa độ cũng là một phép
quay quanh gốc tọa độ. Giả sử phép quay R
−×
−
100
0cossin
0sincos
100
0cossin
0sincos
100
0cossin
0sincos
2121
−=
=
×
−×
−
=
−=
100
010
001
,
100
010
001
OyOx
01
,
100
01
001 t
MtM
OyOx
Phép biến đổi ngược
Một ví dụ cho phép biến đổi ngược chính là thao tác Undo mà các phần mềm vẽ thiết kế luôn
có. Giả sử phép biến hình M có ma trận như sau:
=
1
0
0
fe
dc
ba
M
giả thiết ad-bc ≠ 0. Khi đó phép biến đổi ngược của M, ký hiệu là M
-1
bd
bcad
M
Gọi S (tx,ty) là phép đồng dạng, S
-1
được biểu diễn như sau:
( )
=
−
100
0
1
0
00
RR
4.2. Các phép biến hình trong không gian 3 chiều
Hoàn toàn tương tự như trong mặt phẳng, ta cũng sử dụng các ma trận trong hệ tọa độ thuần
nhất để biểu diễn các phép biến hình: tịnh tiến, quay và đồng dạng.
Phép tịnh tiến
Ma trận của phép tịnh tiến T(a,b,c) là
=
1
0100
0010
0001
),,(
cba
cbaT
Phép tỷ lệ
Ma trận của phép tỷ lệ S(a,b,c) là
−
=
00cossin
00sincos
),(
αα
αα
α
αα
αα
α
αα
αα
α
xRyR
zR
Phép tỷ lệ Phép tịnh tiến
z
x
y y
x
z
9
Chú ý: vẫn như trước, góc quay α có giá trị đại số. Chiều quay dương được xác định theo quy
tắc như sau:
- Quay quanh trục Ox: chiều quay dương là chiều quay từ trục y đến trục z
- Quay quanh trục Oy: chiều quay dương là chiều quay từ trục z đến trục x
- Quay quanh trục Oz: chiều quay dương là chiều quay từ trục x đến trục y
Nói cách khác, nếu đặt mắt nhìn thẳng vào trục tọa độ đi tới thì chiều quay dương là ngược
chiều kim đồng hồ. Hoặc có thể dùng quy tắc bàn tay phải: ngón cái chỉ chiều đi tới (vector
pháp tuyến), bốn ngón khum lại chỉ chiều quay dương.
z
- cắt những phần nằm ngoài phạm vi cửa sổ
Procedure CUASO( ) thiết lập nên “cửa sổ”
Procedure TAMNHIN( ) thiết lập nên “tầm nhìn”
2. Sau khi đã có bộ công cụ chuyển tọa độ trên, các lệnh vẽ về sau đều coi như đang vẽ trên
hệ tọa độ Toán học quen thuộc. Việc biến đổi về hệ tọa độ màn hình và hiển thị được thực
hiện tự động bởi các công cụ đã có.
3. Đoạn thẳng được chọn làm nguyên thể đồ họa. Mọi đối tượng hình học khác đều được xây
dựng từ đoạn thẳng, chẳng hạn một điểm được vẽ như một đoạn thẳng với 2 đầu mút trùng
nhau, các đường cong được vẽ bằng một loạt đoạn thẳng ngắn liên tiếp nhau, đường tròn
được xấp xỉ hóa bởi một đa giác đều nhiều cạnh ...
2. Khái niệm cửa sổ, tầm nhìn
Về lý thuyết, không gian 2D thực tế là vô hạn nhưng con người không thể bao quát hết
mà thường chỉ quan tâm tới một vùng nào đó. Cửa sổ được định nghĩa là hình chữ nhật chứa
những đối tượng đang được khảo sát. Chẳng hạn nhìn lên một bức tranh tường, ta chú ý vào
một họa tiết nào đó, khi đó cửa sổ là hình chữ nhật nhỏ nhất có thể chứa nó. Khi chuyển sự
chú ý sang những phần khác, cửa sổ sẽ được di chuyển theo.
Thủ tục tiết lập cửa sổ như sau: CuaSo (F1,F2,F3,F4: Real)
Trong đó F1, F2, F3, F4 là tọa độ các đỉnh cửa sổ (hình vẽ) và phải thỏa mãn:
F1 < F2, F3 < F4
PROCEDURE Cuaso (F1,F2,F3,F4 : Real);
BEGIN
XgFen := F1; {Hoanh do trai}
XdFen := F2; {Hoanh do phai}
YbFen := F3; {Tung do duoi}
YhFen := F4 {Tung do tren}
END;
Ví dụ ta gọi thủ tục sau để thiết lập cửa sổ vuông: CuaSo (13.5, 22, 18.5, 27);
12
Hình ảnh mà ta đang khảo sát trên cửa sổ phải được thể hiện lên màn hình máy tính.
YhClot := C4; {Tung độ trên}
Xtl := (XdClot - XgClot) / (XdFen - XgFen); {tỷ lệ chiều ngang}
Ytl := (YhClot - YbClot) / (YhFen - YbFen); {tỷ lệ chiều dọc}
SetviewPort (XgClot, MaxY-YhClot, XdClot, MaxY-YbClot, ClipOn) {không vẽ ra ngoài}
END;
Ví dụ: để thiết lập chế độ làm việc toàn màn hình ta gọi thủ tục
PROCEDURE TamNhinDay; {tầm nhìn đầy}
BEGIN
TamNhin (0,MaxX,0,MaxY) {Tầm nhìn là toàn bộ màn hình}
END;
3. Đoạn thẳng, điểm
Đoạn thẳng là nguyên thể đồ họa nhỏ nhất. Ta vẽ đoạn thẳng bằng cách trước hết đặt con trỏ
đồ họa vào điểm đầu mút thứ nhất, sau đó vẽ đoạn nối tới đầu mút thứ hai. Ta dùng cặp biến
(XP1, YP1) để thao dõi và định vị con trỏ đồ họa.
PROCEDURE VeDen (X,Y : Real);{ Vẽ đoạn nối (XP1,YP1) đến (X,Y) và clipping nó}
BEGIN
XP2 := X;
YP2 := Y;
Cat (XP1,YP1,XP2,YP2); {clipping}
XP1 := XP2; {chuyển con trỏ tới đầu mút thứ hai vừa xác định }
YP1 := YP2
END;
PROCEDURE Diem (X,Y : Real);
BEGIN
XP1 := X;
YP1 := Y;
VeDen (X,Y)
END;
4. Chiếu cửa sổ lên tầm nhìn
Sau khi đã xác định được cửa sổ (vùng cần khảo sát) và tầm nhìn (vùng dành cho việc hiển
C3
C4
(Xe,Ye)
B
H
H’
B’
Méo hình: B/H ≠ B’/H’
15
• Trong khi giữ nguyên kích thước cửa sổ, ta di chuyển nó tới những vị trí khác nhau
trong không gian thực, khi đó trên tầm nhìn hiện ra những phần khác nhau của ảnh.
Hình của ảnh được chiếu lên màn hình có kích thước không đổi
• Khi kích thước cửa sổ bị thu nhỏ lại, phần diện tích được khảo sát của đối tượng cũng
thu nhỏ lại theo nhưng ảnh của nó trên màn hình lại được phóng to ra
• Ngược lại, nếu cửa sổ được phóng to ra thì phần diện tích được khảo sát của đối tượng
cũng tăng lên nhưng ảnh của nó trên màn hình lại thu nhỏ lại
Vấn đề Clipping (cắt bỏ những phần không nằm trong cửa sổ)
Vấn đề đặt ra là cần phải cắt bỏ những phần của đối tượng không nằm trong cửa sổ. Vì
ta đã coi đoạn thẳng là nguyên thể đồ họa nên vấn đề quy về việc làm sao để clipping một
đoạn thẳng. Sau đây ta áp dụng thuật toán Cohen – Sutherland để giải quyết vấn đề này.
Trước hết xét một điểm (X,Y). Nếu tọa độ của nó vi phạm một trong các điều kiện sau
thì điểm đó nằm ngoài cửa sổ và sẽ bị loại bỏ
F1≤ X ≤ F2 và F3≤ Y ≤ F4
Dấu bằng cho thấy các điểm nằm trên biên được coi như nằm trong cửa sổ.
Với đoạn thẳng, ta kéo dài các đường biên cửa sổ thành các đường thẳng. Chúng chia
mặt phẳng làm 9 vùng. Mỗi điểm trong mặt phẳng sẽ tương ứng với mã 4 bit được xác định
theo quy tắc sau:
• bit thứ 1 là 1 nếu điểm đó nằm bên trái cửa sổ
• bit thứ 2 là 1 nếu điểm đó nằm bên phải cửa sổ
Cửa sổ
0001
0101
0000
0100
0010
0110
a b
m
n
j
f
g e
c
d
h i
17
PROCEDURE Cat (X1,Y1,X2,Y2 : Real);
TYPE Region = (Left,Right,Low,High);
Code = SET OF Region;
VAR C,C1,C2 : Code;
X,Y : Real;
XX1,YY1 : Integer;
XX2,YY2 : Integer;
PROCEDURE MaNhiPhan (X,Y : Real; VAR C : Code); {Tạo mã thuộc tính cho 2 đầu, xây
dựng tập C của điểm (X,Y)}
BEGIN
C := [];
IF X < XgFen THEN C := [Left]{nằm bên trái đường thẳng X=XgFen}
ELSE IF X > XdFen THEN C := [Right];
IF Y < YbFen THEN C := C+[Low]
ELSE IF High IN C THEN
BEGIN
18