Ôn Ngũ Minh<br />
<br />
Tạp chí KHOA HỌC & CÔNG NGHỆ<br />
<br />
78(02): 8 - 11<br />
<br />
SỬ DỤNG LÝ THUYẾT ĐẠI SỐ GIẢI MỘT SỐ BÀI TOÁN TRONG HÌNH HỌC<br />
Ôn Ngũ Minh*<br />
Trường Đại học Kỹ thuật Công nghiệp – ĐHTN<br />
<br />
TÓM TẮT<br />
Lý thuyết về không gian véc tơ trong đại số tuyến tính có vai trò rất quan trọng. Bài báo này trình<br />
bày một số phép biến đổi affine dựa trên phép đổi cơ sở trong không gian véc tơ. Trong phần cuối<br />
có đƣa ra một số ví dụ minh hoạ và mã nguồn đƣợc viết bằng ngôn ngữ C++.<br />
Từ khoá: Phép tịnh tiến song song, phép xoay quanh gốc toạ độ, toạ độ homogen<br />
<br />
MỘT SỐ PHÉP BIẾN ĐỔI CƠ BẢN*<br />
1. Phép tịnh tiến song song<br />
Giả sử M(x, y) là điểm bất kỳ. Xác định toạ độ<br />
của M trong hệ O'x'y' với O' có toạ độ (x0, y0)<br />
và các trục toạ độ của hai hệ đồng phƣơng<br />
chiều.<br />
Gọi (x', y') là toạ độ của M trong hệ trục O'x'y'.<br />
Khi đó<br />
x x ' x 0 <br />
y y' y <br />
0<br />
x ' x x 0 <br />
(1)<br />
y' y y <br />
0<br />
Nhƣng để thực hiện đƣợc bởi phép nhân ma<br />
trận, ta sử dụng toạ độ homogen, khi đó (1)<br />
đƣợc viết lại dƣới dạng:<br />
x ' 1 0 x 0 x <br />
y ' 0 1 y y <br />
0 <br />
<br />
1 0 0 1 1 <br />
<br />
hay<br />
<br />
x ' 1 0 x 0 x <br />
x <br />
<br />
<br />
<br />
<br />
<br />
<br />
ta có y ' 0 1 y0 y H1 y <br />
1 0 0 1 1 <br />
1 <br />
2. Phép xoay hệ Oxy quanh gốc toạ độ<br />
Giả sử M(x, y) là điểm bất kỳ. Xác định toạ độ<br />
của M trong hệ Ox'y' nhận đƣợc từ hệ Oxy<br />
sau khi xoay theo chiều dƣơng một góc .<br />
Trong R2, xét hai cơ sở:<br />
S = {e1 = (1, 0), e2 = (0, 1)} và<br />
S' = {e1' = (cos, sin), e2' = (–sin, cos)}<br />
<br />
*<br />
<br />
Tel: 0913351286<br />
<br />
8<br />
<br />
Rõ ràng e1 và e2 tƣơng ứng là các véc tơ đơn<br />
vị của các trục Ox và Oy, còn e1' và e2' tƣơng<br />
ứng là các véc tơ đơn vị của các trục Ox' và<br />
Oy'. Dễ thấy, ma trận của phép biến đổi từ cơ<br />
sở S sang cơ sở S' chính là<br />
cos sin <br />
P =<br />
<br />
sin cos <br />
Vì là phép biến đổi trực giao nên P–1 = Pt, do<br />
đó sử dụng toạ độ homogen ta có:<br />
<br />
x ' cos sin 0 x <br />
x <br />
y' sin cos 0 y H y <br />
2 <br />
<br />
<br />
1 0<br />
1 <br />
0<br />
1 1 <br />
<br />
3. Phép lấy đối xứng qua trục Ox<br />
Gọi M'(x', y') là điểm đối xứng của điểm M(x,<br />
y) qua trục Ox, dễ thấy x' = x, y' = –y. Trong<br />
R2, xét hai cơ sở:<br />
S = {e1 = (1, 0), e2 = (0, 1)}<br />
và<br />
S' = {e1' = (1,0), e2' = (0, –1)}<br />
Dễ thấy, ma trận của phép biến đổi từ cơ sở S'<br />
sang cơ sở S chính là:<br />
1 0 <br />
P =<br />
<br />
0 1<br />
Viết theo toạ độ homogen ta có<br />
<br />
x ' 1 0 0 x <br />
x <br />
y ' 0 1 0 y H y .<br />
3 <br />
<br />
<br />
1 0 0 1 1 <br />
1 <br />
<br />
MỘT SỐ ỨNG DỤNG<br />
1. Xác định toạ độ của điểm N(xN, yN) là đối<br />
xứng của điểm M(x, y) qua đƣờng thẳng có<br />
phƣơng trình y = ax + b<br />
Ta thực hiện 5 bƣớc sau:<br />
<br />
Ôn Ngũ Minh<br />
<br />
Tạp chí KHOA HỌC & CÔNG NGHỆ<br />
<br />
a) Tịnh tiến song song Oxy thành O'x'y' với<br />
O' có toạ độ (0, b)<br />
Toạ độ mới của M(x', y') đƣợc tính theo công<br />
thức<br />
x '<br />
x <br />
y ' A y , với A =<br />
<br />
<br />
1 <br />
1 <br />
<br />
1 0 0 <br />
0 1 b <br />
<br />
<br />
0 0 1 <br />
<br />
b) Xoay hệ O'x'y' quanh gốc O' theo chiều<br />
dƣơng một góc = atan(a) thành hệ O'x"y"<br />
Toạ độ mới của M(x", y") đƣợc tính theo<br />
công thức<br />
x"<br />
x '<br />
x <br />
y" H y ' = H A y <br />
2 <br />
2<br />
<br />
<br />
1 <br />
1 <br />
1 <br />
<br />
c) Lấy đối xứng qua trục O'x"<br />
Gọi (xN", yN") là toạ độ của N trong hệ trục<br />
O'x"y", khi đó<br />
<br />
x <br />
x N "<br />
x"<br />
y " H y" = H H A y <br />
3<br />
3 2<br />
N <br />
<br />
<br />
1 <br />
1 <br />
1 <br />
d) Xoay hệ O'x"y" quanh gốc O' theo chiều<br />
âm một góc thành hệ O'x'"y'"<br />
Toạ độ của N trong hệ O'x'"y'" đƣợc tính theo<br />
công thức<br />
x N '"<br />
x N "<br />
x <br />
y '" H t y " = H t H H A y <br />
2 N <br />
2<br />
3 2<br />
N <br />
<br />
1 <br />
1 <br />
1 <br />
<br />
e) Tịnh tiến O' về O, nhận đƣợc hệ trục ban<br />
đầu Oxy<br />
Toạ độ của N trong hệ Oxy đƣợc tính theo<br />
công thức<br />
x N 1 0 0 x N "'<br />
x <br />
y 0 1 b y "' = H H t H H A y ,<br />
4 2<br />
3 2<br />
N <br />
N <br />
<br />
1 0 0 1 1 <br />
1 <br />
Dễ kiểm tra lại rằng H = H4H2tH3H2A =<br />
<br />
b sin 2 <br />
cos 2 sin 2<br />
<br />
<br />
= sin 2 cos 2 b(1 cos 2) .<br />
<br />
<br />
0<br />
<br />
0<br />
1<br />
<br />
78(02): 8 - 11<br />
<br />
Vậy toạ độ của điểm N đối xứng với M(x, y)<br />
qua đƣờng thẳng y = ax + b là<br />
<br />
x N xcos2 ysin2 bsin 2<br />
<br />
y N x sin 2 ycos2 b 1 cos2 <br />
<br />
x N x cos 2 y b sin 2<br />
<br />
y N x sin 2 y b cos 2 b<br />
<br />
hay <br />
<br />
Đó chính là công thức chúng ta cần tìm.<br />
2. Xác định toạ độ điểm N(xN, yN) nhận đƣợc<br />
bằng cách xoay điểm M(x, y) quanh điểm (x0,<br />
y0) một góc <br />
Ta thực hiện 3 bƣớc sau:<br />
a) Tịnh tiến song song Oxy thành O'x'y' với<br />
O' có toạ độ (x0, y0)<br />
Toạ độ mới của M(x', y') đƣợc tính theo công<br />
thức<br />
x '<br />
x <br />
y ' H y ,<br />
1 <br />
<br />
1 <br />
1 <br />
<br />
b) Xoay hệ O'x'y' quanh gốc O' theo chiều<br />
dƣơng một góc – thành hệ O'x"y"<br />
Toạ độ mới của M(x", y") đƣợc tính theo<br />
công thức<br />
x"<br />
x '<br />
x <br />
y" H t y ' = H t H y <br />
2 <br />
2<br />
1 <br />
<br />
1 <br />
1 <br />
1 <br />
<br />
c) Tịnh tiến O' về O, nhận đƣợc hệ trục ban<br />
đầu Oxy<br />
Toạ độ của N trong hệ Oxy đƣợc tính theo<br />
công thức<br />
x N 1 0 x 0 x N "<br />
x <br />
y 0 1 y y " = H H t H y =<br />
0 N <br />
5 2<br />
1 <br />
N <br />
1 0 0 1 1 <br />
1 <br />
<br />
cos sin x 0 cos y0 sin x 0 <br />
<br />
<br />
= sin cos x 0 sin y0 cos y0 <br />
0<br />
<br />
0<br />
1<br />
<br />
x <br />
y<br />
<br />
1 <br />
<br />
Từ đó ta có<br />
9<br />
<br />
Ôn Ngũ Minh<br />
<br />
Tạp chí KHOA HỌC & CÔNG NGHỆ<br />
<br />
x N x x 0 cos y y0 sin x 0<br />
<br />
y N x x 0 sin y y0 cos y0<br />
MỘT SỐ VÍ DỤ<br />
1. Xác định toạ độ điểm đối xứng qua đƣờng<br />
thẳng y = ax + b.<br />
Xét điểm M(1,2).<br />
a) Đƣờng thẳng d có phƣơng trình y = x: Khi<br />
đó = 45o nên cos2 = 0, sin2 = 1.<br />
x N 0 1 0 1 2 <br />
y 1 0 0 2 1 ,<br />
N <br />
<br />
1 0 0 1 1 1 <br />
<br />
tức là N(2,1).<br />
b) Đƣờng thẳng d có phƣơng trình y = x + 1:<br />
= 45o nên cos2 = 0, sin2 = 1.<br />
x N 0 1 1 1 1 <br />
y 1 0 1 2 2 ,<br />
N <br />
<br />
1 0 0 1 1 1 <br />
<br />
tức là N M. Đúng vì M thuộc d.<br />
c) Đƣờng thẳng d có phƣơng trình y = x – 1:<br />
= 45o nên cos2 = 0, sin2 = 1.<br />
x N 0 1 1 1 3<br />
y 1 0 1 2 0 ,<br />
N <br />
<br />
1 0 0 1 1 1 <br />
<br />
tức là N(3, 0).<br />
2. Xác định toạ độ của điểm M sau khi quay<br />
đi một góc quanh điểm P.<br />
Xét điểm M(2,1) và P(1, 1).<br />
<br />
a) Với = : cos = 0, sin = 1<br />
2<br />
xN = 1, yN = 2.<br />
<br />
2<br />
b) Với = : cos = sin =<br />
4<br />
2<br />
2<br />
xN = yN =<br />
+1<br />
2<br />
MÃ LỆNH TRONG NGÔN NGỮ C++<br />
1. Xác định toạ độ điểm đối xứng qua đƣờng<br />
thẳng y = ax + b<br />
Hàm point mirror(const point &p, double a,<br />
double b) trả lại điểm đối xứng của điểm p.<br />
10<br />
<br />
78(02): 8 - 11<br />
<br />
#include <br />
#include <br />
struct point<br />
{<br />
double x, y;<br />
point (double _x = 0, double _y = 0)<br />
{x = _x; y = _y;}<br />
};<br />
point mirror(const point &p,<br />
double a, double b)<br />
{<br />
double anpha = atan(a);<br />
double _cos = cos(2*anpha),<br />
_sin = sin(2*anpha);<br />
return point(p.x*_cos + (p.y-b)*_sin,<br />
p.x*_sin - (p.y-b)*_cos + b);<br />
}<br />
void main()<br />
{<br />
point p(1,2), q;<br />
q = mirror(p, 1, 0);<br />
printf("\nq(%lf, %lf)\n",q.x,q.y);<br />
q = mirror(p, 1, 1);<br />
printf("\nq(%lf, %lf)\n",q.x,q.y);<br />
q = mirror(p, 1, -1);<br />
printf("\nq(%lf, %lf)\n",q.x,q.y);<br />
}<br />
2. Xác định toạ độ của điểm M sau khi quay<br />
đi một góc quanh điểm P<br />
Hàm point rotate(const point &p, double x0,<br />
double y0, double anpha) trả lại điểm là sự<br />
quay của điểm p quanh điểm có toạ độ (x0,<br />
y0) một góc anpha.<br />
#include <br />
#include <br />
struct point<br />
{<br />
double x, y;<br />
point (double _x = 0, double _y = 0)<br />
{x = _x; y = _y;}<br />
};<br />
<br />
Ôn Ngũ Minh<br />
<br />
Tạp chí KHOA HỌC & CÔNG NGHỆ<br />
<br />
point rotate(const point &p, double x0,<br />
double y0, double anpha)<br />
{<br />
double _cos = cos(anpha);<br />
double _sin = sin(anpha);<br />
return<br />
point((p.x-x0)*_cos - (p.y-y0)*_sin +<br />
x0,<br />
(p.x-x0)*_sin + (p.y-y0)*_cos + y0);<br />
}<br />
void main()<br />
{<br />
<br />
78(02): 8 - 11<br />
<br />
point p(2,1), q;<br />
double quarterPI = atan(1);<br />
q = rotate(p, 1,1, 2*quarterPI);<br />
printf("\nq(%lf, %lf)\n",q.x,q.y);<br />
q = rotate(p, 1,1, quarterPI);<br />
printf("\nq(%lf, %lf)\n",q.x,q.y);<br />
}<br />
TÀI LIỆU THAM KHẢO<br />
[1]. Brown, William A. (1991), Matrices and<br />
vector spaces, New York: M. Dekker,<br />
[2].Weisstein, Eric W., Homogeneous Coordinates<br />
<br />
SUMMARY<br />
On Ngu Minh*<br />
Thai Nguyen University of Technology – TNU<br />
<br />
The theory of vector spaces in linear algebra plays a very important role. This paper presents some<br />
affine transformation based on the exchange of basis of vector space. In the last section give some<br />
examples and source code written in C++ language.<br />
<br />
*<br />
<br />
Tel: 0913351286<br />
<br />
11<br />
<br />