8. Cấu trúc luận văn
2.2. Một số khía cạnh liên quan đến đồ họa
Liên quan đến những chức năng xử lí đồ họa của MATLAB, ngƣời ta thấy có những khía cạnh sau :
1. Đồ họa 2 chiều; 2. Đồ họa 3 chiều;
3. Phƣơng pháp tọa độ phẳng; 4. Phƣơng pháp tọa độ không gian; 5. Một số phép dựng hình.
Trong khuôn khổ của luận văn, để nội dung này không làm loãng ý chính của các chƣơng sau, học viên xin nêu chi tiết các khía cạnh liên quan đến chức năng đồ họa trong phần phụ lục của luận văn.
2.3. Chuẩn hóa tham số cho các đối tượng cơ sở
Mục đích của việc chuẩn hóa tham số là để thống nhất tham số xử lí cho đối tƣợng cơ sở. Ví dụ nhƣ trong hình học phẳng một đƣờng thẳng thƣờng đƣợc xác định theo 3 cách sau :
1. TH1: Đƣờng thẳng đi qua 2 điểm phân biệt M0(x0;y0), M1(x1;y1).
2. TH2: Đƣờng thẳng đi qua điểm M0(x0; y0), và có vecto pháp tuyến ( ; )n A B .
3. TH3: Đƣờng thẳng đi qua điểm M0(x0; y0), và có vecto chỉ phƣơng ( ; )u a b . Để chuẩn hóa tham số cho đƣờng thẳng ta tính toán quy về TH3, đƣờng thẳng qua điểm M0(x0;y0) và có vecto chỉ phƣơng ( ; )u dx dy
. Biểu diễn đƣờng thẳng đƣợc chuẩn hóa trong MATLAB sẽ có dạng line2d = [x0 y0 dx dy]. Việc tính toán chuẩn hóa là đơn giản dựa trên nền tảng kiến thức hình học phổ thông, vì vậy ta có thể xây dựng các thủ tục chuẩn hóa để thống nhất xử lí cho đối tƣợng cơ sở và mở rộng việc biểu diễn cho đối tƣợng khi dữ kiện tham số đầu vào của đối tƣợng đƣợc cho dƣới các dạng khác nhau.
2.4. Xử lí các đối tượng đồ họa cơ sở thuộc hình học phẳng
2.4.1. Điểm trong mặt phẳng
Để vẽ điểm trong mặt phẳng ta dùng hàm plot, hàm plot cho phép vẽ đơn điểm hoặc đa điểm phụ thuộc ma trận tọa độ đầu vào. Ngoài ra ta có thể định màu sắc, kiểu, độ rộng của điểm thông qua bảng thuộc tính (bảng 4 phần phụ lục).
% Vẽ đơn điểm M(x, y) :
plot(x, y, PropertyName1, PropertyValue1, …); % Vẽ đa điểm M1(x1, y1), … , Mn(xn, yn) :
plot(x1, y1, x2, y2, … , xn, yn, PropertyName1, PropertyValue1, …);
2.4.2. Tạo nhãn điểm, chú thích
Để thuận tiện cho việc xác định vị trí và thứ tự của điểm, chúng ta thƣờng gán cho mỗi điểm một kí tự in hoa duy nhất gọi là nhãn điểm. Nhãn điểm có vai trò quan trọng trong việc xây dựng, phát triển lý thuyết và chứng minh các bài toán hình học. Trong MATLAB ta có thể tạo nhãn cho một điểm hoặc danh sách các điểm bằng cách sử dụng hàm text.
Gán nhãn cho điểm M(x, y). % vẽ điểm M
plot(x, y);
% gán nhãn điểm M
Gán nhãn cho dãy n điểm M1(x1, y1), M2(x2, y2), … , Mn(xn, yn). % vẽ dãy điểm
plot(x1, y1, x2, y2, … , xn, yn);
% tạo ma trận tọa độ điểm và nhãn điểm x = [x1; x2; … xn];
y = [y1; y2; … yn];
labels = [„M1‟;‟M2‟; … ;‟Mn‟]; % gán nhãn cho danh sách điểm
text(X, Y, labels, PropertyName1, PropertyValue1, …);
2.4.3. Đoạn thẳng trong mặt phẳng
Để vẽ đoạn thẳng 2D trong MATLAB ta sử dụng hàm plot. Hàm plot cho phép vẽ một đoạn thẳng hay nhiều đoạn thẳng liên tiếp tạo thành một đƣờng gấp khúc tùy thuộc ma trận tọa độ đầu vào.
% Vẽ đoạn thẳng AB: A(xa, ya), B(xb, yb)
plot([xa xb], [ya yb], PropertyName1, PropertyValue1, …);
% Vẽ đƣờng gấp khúc A1A2, A2A3, …, An-1An : A1(x1, y1), .., An(xn, yn) plot([x1 x2 …xn], [y1 y2 …yn], PropertyName1, PropertyName1, …);
2.4.4. Vecto trong mặt phẳng
Theo định nghĩa một vecto đƣợc xác định nếu ta biết hai điểm đầu mút (điểm đầu và điểm cuối) của vecto. Giả sử trong hệ trục tọa độ (Oxy) cho vecto AB
có tọa độ điểm đầu A(xa; ya), điểm cuối B(xb; yb). Để vẽ vecto AB
ta phải vẽ đoạn thẳng AB và đầu mũi vecto tại điểm B. Việc vẽ đoạn thẳng AB áp dụng phần vẽ đoạn thẳng đã đƣợc nêu ở trên, còn phần đầu mũi vecto đƣợc biểu diễn bằng một tam giác cân, muốn làm đƣợc điều này ta chọn hai điểm U, V sao cho UBV tạo thành một tam giác cân tại đỉnh B và các cạnh của tam giác có tỉ lệ phù hợp với độ dài của vecto AB
, sau đó ta thực hiện vẽ đƣờng gấp khúc UBV.
Hình 9. Xử lí vecto 2D
Gọi I là trung điểm của U, V. Giả sử U, V, I có tọa độ tƣơng ứng là U(xu, yu), V(xv, yv) , I(xI, yI). Gọi , là các tham số dƣơng xác định tỷ lệ của đầu vecto UBV theo hệ thức : IB = AB ; UI = IB = AB ;
Ta có:
AB
= (xb - xa; yb - ya) = (xp; yp) ;
IB = AB b I p b I p x x x y y y I b p I b p x x x y y y UI .AB = 0 (xb xp x xu) p (yb yp y yu) p 0 (1) UI = AB 2 2 2 2 (xb xp xu) (yb yp yu) xp yp (2) (1) (2) ( ) ( ) ( ) ( ) u b p p u b p p v b p p v b p p x x x y y y y x x x x y y y y x Tọa độ 2 điểm U, V là: ( b [( b a) ( b a)]; b [( b a) ( b a)]) U x x x y y y y y x x ; ( b [( b a) ( b a)]; b [( b a) ( b a)]) V x x x y y y y y x x .
Giải pháp trong MATLAB
function varargout = Vecto2d(vecto, varargin) % Chú giải
% Vecto2d là hàm vẽ vecto trong mặt phẳng
% vecto = [xa ya xb yb] vecto AB với A(xa;ya), B(xb;yb) % Vecto2d([xa ya xb yb]);
% Vecto2d([xa ya xb yb], PropertyName1, PropertyValue1, …); % rút trích tọa độ vecto
xa = vecto(1); ya = vecto(2); xb = vecto(3); yb = vecto(4); % tham sô định tỷ lệ đầu vecto alpha = 0.1; beta = 0.1;
% ma trận tọa độ điểm tƣơng ứng đầu vecto UBV
hu = [xb-alpha*((xb-xa)-beta*(yb-ya)); xb; xb-alpha*((xb-xa)+beta*(yb-ya))]; hv = [yb-alpha*((yb-ya)+beta*(xb-xa)); yb;yb-alpha*((yb-ya)-beta*(xb-xa))]; % vẽ nhiều đối tƣợng trên một hình
% vẽ độ dài vecto AB h = plot([xa;xb], [ya;yb]); % vẽ đầu mút vecto UBV k = plot(hu(:), hv(:)); % set thuộc tính vecto if (~isempty(varargin)) set(h, varargin{:}) end % xử lí đầu ra if nargout == 2 varargout{1} = h; varargout{2} = k; end 2.4.5. Đường thẳng trong mặt phẳng
Trong mặt phẳng (Oxy) xét đƣờng thẳng (d) qua điểm M(x0, y0) và có vecto chỉ phƣơng ( ; )u a b
.
Thực tế đƣờng thẳng (d) có độ dài không giới hạn, nhƣng trên thiết bị hiển thị thì đƣờng thẳng (d) đƣợc biểu diễn có giới hạn bởi một phần của đƣờng thẳng. Nhƣ vậy để vẽ đƣờng thẳng (d) ta sẽ vẽ phần đoạn thẳng thuộc nó và nằm trong giới hạn của hệ trục tọa độ hiện thời hay vùng xén, vùng hiển thị hiện thời.
Bƣớc 1: lấy giới hạn của vùng xén min ax min ax m m x x x y y y
Bƣớc 2: thực hiện kỹ thuật xén đƣờng thẳng nhƣ trong mục 5.2.2 phần phụ lục
(giả sử tồn tại đoạn thẳng xén đƣợc xác định bởi hai điểm I, J) Bƣớc 3: dùng hàm plot vẽ đoạn thẳng IJ
Giải pháp trong Matlab
function varargout = Line2d(line, varargin) % Chú giải
% Line2d hàm vẽ đƣờng thẳng trong mặt phẳng. % line = [x0 y0 dx dy] đƣờng thẳng qua M0(x0;y0) % có vecto chỉ phƣơng u = (dx;dy).
% Line2d([x0 y0 dx dy]);
% mặc định kiểu màu cho đƣờng thẳng varargin = [{'color', 'b'}, varargin]; % rút trích giới hạn vùng xén hiện thời xlim = get(gca, 'xlim');
ylim = get(gca, 'ylim');
% xén đƣờng thẳng theo vùng xén hiện thời clip = clipingLine2d(line, [xlim ylim]); ok = isfinite(clip(:,1));
% tạo mảng lƣu kết quả h = -1*ones(size(line, 1), 1); % vẽ đoạn thẳng hợp lệ
h(ok) = plot(clip(ok, [1 3])', clip(ok, [2 4])', varargin{:}); % trả về kết quả cho đầu ra
if nargout > 0 varargout{1} = h; end
2.4.6. Đa giác trong mặt phẳng
Đa giác là một đƣờng gấp khúc kín có đỉnh đầu và đỉnh cuối trùng nhau. Trong toán học phổ thông các đa giác thƣờng gặp là tam giác, tứ giác, ngũ giác…
Hình 10. Đa giác phẳng
Đa giác đƣợc xác định khi ta biết các đỉnh của nó. Trong hệ trục tọa độ (Oxy) để vẽ đa giác A1A2…An, có tọa độ các đỉnh tƣơng ứng A1(x1, y1), A2(x2, y2), … , An(xn, yn) ta tạo ma trận tọa độ các đỉnh, sau đó sử dụng chức năng vẽ đƣờng gấp khúc kín trong lệnh plot để vẽ đa giác hoặc dùng hàm fill để vẽ và tô màu cho miền đa giác.
% Nhập ma trận tọa độ đỉnh của đa giác. X = [x1; x2; x3; … ; xn; x1];
Y = [y1; y2; y3; … ; yn; y1];
% Gọi hàm plot để vẽ các cạnh của đa giác
2.4.7. Đường tròn trong mặt phẳng
Trong hệ trục tọa độ Descartes (Oxy) cho đƣờng tròn (C) tâm I(xc, yc), bán kính r. Trong hệ tọa độ cực phƣơng trình đƣờng tròn (C) đƣợc biểu diễn dƣới dạng tham số nhƣ sau : cos sin c c x x r y y r (0 2 ) .
Để vẽ đƣờng tròn (C) ta xây dựng dãy điểm mô phỏng cho (C) bằng cách thực hiện phân hoạch đoạn [0;2 ] . Các bƣớc thực hiện nhƣ sau :
Hình 11. Phân hoạch đường tròn
Phân hoạch đoạn [0;2 ] thành n phần bằng nhau theo tham số
0 0 ; 1 2 n ; 2 4 n ; …, n 1 2(n 1) n , n 2
Xác định tọa độ tại các điểm chia {Ai(xi, yi)} qua phƣơng trình tham số xi = xc + rcos(i) , yi = yc + rsin(i) (i0..n)
Vẽ đa giác mô phỏng đƣờng tròn A0A1..An
Giải pháp trong Matlab
function varargout = Circle2d(circle, varargin) % Chú thích
% Circle2d hàm vẽ đƣờng tròn.
% circle = [xc yc r] đƣờng tròn tâm (xc;yc), bán kính r > 0 % Circle2d([xc yc r]) ;
% xử lí tham số
xc = circle(1); yc = circle(2) ; r = circle(3) ; % tham số phân hoạch đƣờng tròn
N = 60;
% phân hoạch đƣờng tròn bằng lệnh linspace t = linspace(0, 2*pi, N+1);
% xác định tọa độ dãy điểm mô phỏng theo vecto t xt = xc + r*cos(t);
yt = yc + r*sin(t);
% vẽ đa giác mô phỏng đƣờng tròn từ hai ma trận tọa độ xt, yt h = plot(xt, yt);
% set thuộc tính cho đƣờng tròn if (~isempty(varargin)) set(h, varargin{:}); end % xử lí đầu ra if nargout > 0 varargout = {h}; end 2.4.8. Cung tròn trong mặt phẳng
Trong mặt phẳng (Oxy) cho cung tròn tâm I(xc, yc) bán kính r có độ lớn, điểm đầu của cung đƣợc xác định qua góc xuất phát (, tính theo đơn vị độ). Quy ƣớc chiều ngƣợc kim đồng hồ là chiều dƣơng, thuận kim đồng hồ là chiều âm.
Hình 12. Cung tròn AB
Tƣơng tự nhƣ đƣờng tròn để vẽ cung tròn ta phân hoạch đoạn [α, α+β] xây dựng tập điểm mô phỏng cung tròn. Các bƣớc vẽ cung tròn nhƣ sau :
Đổi góc , từ độ sang radian
0 = 180 , 1 = 0 + 180
t0 = 0, t1 = 0+ 180 (1 n) , … , tn-1 = 0+ 180 (n 1 n ), tn = 0+ 180
Xác định tọa độ tại các điểm chia {Ai(xi, yi)} qua phƣơng trình tham số xi = xc + rcos(ti), yi = yc + rsin(ti) (i0..n)
Vẽ đƣờng gấp khúc mô phỏng cung tròn A0A1…An
Giải pháp trong MATLAB
function varargout = Arc2d(arc, varargin) % Chú giải
% Arc2d hàm vẽ cung tròn.
% arc = [xc yc r start extent] cung tròn tâm (xc;yc) bán kính r > 0 % góc xuất phát start, và độ lớn extent (đo bằng độ).
% Arc2d([xc yc r start extent]);
% Arc2d([xc yc r start extent], PropertyName1, PropertyValue1, …); % xử lí tham số
xc = arc(1) ; yc = arc(2); r = arc(3); start = arc(4); extent = arc(5); % đổi góc sang đơn vị radian t0 = start*pi/180;
t1 = t0 + extent*pi/180;
% định tham số phân hoạch cung tròn N N = 60;
% phân hoạch cung tròn bằng lệnh linspace t = linspace(t0, t1, N+1);
% xác định tọa độ mô phỏng cung tròn theo vecto t xt = xc + r*cos(t);
yt = yc + r*sin(t);
% vẽ đƣờng gấp khúc nội tiếp cung tròn theo vecto xt, yt h = plot(xt, yt);
% set thuộc tính cho cung tròn if (~isempty(varargin)) set(h, varargin{:}); end % xử lí đầu ra if nargout > 0 varargout = {h}; end
2.5. Xử lí các đối tượng đồ họa cơ sở thuộc hình học không gian
2.5.1. Điểm trong không gian
Tƣơng tự nhƣ trong mặt phẳng để vẽ điểm trong không gian ta dùng hàm plot3, hàm plot3 cho phép vẽ đơn điểm hoặc đa điểm. Ngoài ra ta cũng có các lựa chọn định thuộc tính cho điểm nhƣ màu sắc, độ rộng, kiểu điểm trong bảng thuộc tính (bảng 4 phần phụ lục).
% Vẽ đơn điểm M(x; y; z)
plot3(x, y, z, PropertyName1, PropertyValue1, ....); % Vẽ đa điểm M1(x1; y1; z1), … , Mn(xn; yn; zn)
plot3(x1, y1, z1 , …, xn, yn, zn, PropertyName1, PropertyValue1, ....);
2.5.2. Tạo nhãn điểm, chú thích
Tƣơng tự trong mặt phẳng 2D để tạo nhãn điểm, chú thích trong không gian 3D ta dùng hàm text, hàm text cho phép tạo nhãn cho từng điểm hoặc nhiều điểm đồng thời phụ thuộc ma trận tọa độ đầu vào.
Tạo nhãn cho một điểm M(x; y; z) % gọi hàm plot3 vẽ điểm
plot3(x, y, z);
% tạo nhãn cho điểm M bằng hàm text
text(x, y, z, „M‟, PropertyName1, PropertyValue1,…); Tạo nhãn cho n điểm M1(x1; y1; z1), …, Mn(xn; yn; zn) % nhập ma trận tọa độ điểm và nhãn điểm tƣơng ứng px = [x1; x2; … ; xn];
py = [y1; y2; … ; yn]; pz = [z1; z2; …. ; zn];
labels = [„M1‟; „M2‟; … „Mn‟]; % gọi hàm plot3 để vẽ các điểm plot3(x1, y1, z1, … , xn, yn, zn);
% gọi hàm text để tạo nhãn cho danh sách điểm
text(px, py, pz, labels, PropertyName1, PropertyValue1,…);
2.5.3. Đoạn thẳng trong không gian
Để vẽ đoạn thẳng 3D trong môi trƣờng MATLAB ta sử dụng hàm plot3. Hàm plot3 cho phép vẽ một đoạn thẳng hay nhiều đoạn thẳng tạo thành một đƣờng gấp khúc.
% Vẽ đoạn thẳng AB : A(xa; ya; za), B(xb; yb; zb)
plot3([xa; xb], [ya; yb], [za; zb], PropertyName1, PropertyValue1, …);
plot3([x1; x2; …, xn], [y1; y2; …, yn], [z1; z2; …, zn], PropertyName1, PropertyValue1, …);
2.5.4. Vecto trong không gian
Tƣơng tự trong mặt phẳng, trong không gian để vẽ vecto AB
ta cần phải thực hiện theo 2 bƣớc. Thứ nhất là vẽ độ dài vecto (vẽ đoạn thẳng AB), thứ hai là vẽ đầu vecto. Không giống nhƣ trong mặt phẳng, trong không gian không thể sử dụng đƣờng gấp khúc để biểu diễn đầu vecto, lí do là khi thay đổi góc quan sát có thể đầu mũi vecto bị che khuất. Để khắc phục nhƣợc điểm này trong không gian đầu vecto sẽ đƣợc biểu diễn bằng một mặt nón tròn xoay, điều này đảm bảo cho mọi góc nhìn khi thay đổi mà hình ảnh đầu vecto không bị thay đổi.
Hình 13. Xử lí vecto 3D
Gọi , là hai tham số dƣơng xác định nhƣ sau:
IB = AB ; UI = IB . Khi đó ta có: AB = (xb-xa; yb-ya; zb-za) = (xp; yp; zp); IB = AB => I có tọa độ là: I b p I b p I b p x x x y y y z z z UI = IB = AB = xp2 yp2zp2 . Mặt nón xác định có đỉnh B, đƣờng tròn đáy tâm I(x1x yp; 1y zp; 1zp) bán kính r = UI = xp2 yp2 zp2 .
Giải pháp trong MATLAB
function varargout = Vecto3d(vecto, varargin) % Chú thích
% Vecto3d hàm vẽ vecto trong không gian.
% Vecto3d([xa ya za xb yb zb]);
% Vecto3d([xa ya za xb yb zb], PropertyName1, PropertyValue1, …); % xử lí tham số
xa = vecto(1); ya = vecto(2); za = vecto(3); xb = vecto(4); yb = vecto(5); zb = vecto(6); xp = xb - xa; yp = yb - ya; zp = zb - za;
% định tham số tỷ lệ chiều cao, bán kính mặt nón và độ dài vecto alpha = 0.1; beta = 0.1;
% tham số xác định mặt đáy của nón
I = [(xb - alpha*(xb - xa)) (yb - alpha*(yb - ya)) (zb - alpha*(zb - za))]; R = alpha*beta*sqrt(xp.^2 + yp.^2 + zp.^2);
% cho phép vẽ nhiều đối tƣợng hold on;
% vẽ chiều dài vecto
h = plot3([xa ; xb], [ya; yb], [za; zb]); % vẽ đầu mút vecto
k = Cone3d([xb yb zb I R]); % set thuộc tính cho vecto if (~isempty(varargin)) set(h, varargin); end % xử lí đầu ra if nargout == 2 varargout{1} = h; varargout{2} = k; end
2.5.5. Đường thẳng trong không gian
Tƣơng tự nhƣ trong mặt phẳng, trong không gian một đƣờng thẳng (d) bị giới hạn bởi vùng xén là một hình hộp chữ nhật (gọi là hộp tọa độ). Để vẽ đƣờng thẳng trong không gian ta đi tìm đoạn thẳng thuộc vùng xén đƣợc tạo thành từ hai giao điểm thuộc vùng xén là hai trong các giao điểm của đƣờng thẳng với các mặt bên của hình hộp. Các bƣớc vẽ đƣờng thẳng (d) đƣợc thực hiện nhƣ sau :
Xác định giới hạn của vùng xén, gồm các điểm thỏa mãn hệ min ax min ax min ax m m m x x x y y y z z z
Dùng kỹ thuật xén đƣờng thẳng tìm cặp điểm thuộc vùng xén (mục 5.2.2 phần phụ lục)
Vẽ đoạn thẳng nếu tồn tại cặp điểm thuộc vùng xén
Giải pháp trong MATLAB
function varargout = Line3d(line,varargin) % Chú thích
% Line3d hàm vẽ đƣờng thẳng trong không gian
% Đƣờng thẳng line qua M0(x0; y0; z0) có vecto chỉ phƣơng u = (dx; dy; dz) % Line3d([x0 y0 z0 dx dy dz])
% Line3d([x0 y0 z0 dx dy dz], PropertyName1, PropertyValue1, ...) % rút trích giới hạn hệ trục hiện thời
lim = get(gca, 'xlim');
xmin = lim(1); xmax = lim(2); lim = get(gca, 'ylim');
ymin = lim(1); ymax = lim(2); lim = get(gca, 'zlim');
zmin = lim(1); zmax = lim(2);
% xén đƣờng thẳng bằng hàm clipingLine3d
edge = clipingLine3d(line, [xmin xmax ymin ymax zmin zmax]); % vẽ phần đoạn thẳng thuộc vùng xén if sum(isnan(edge)) == 0 h = plot3([edge(1);edge(4)],[edge(2);edge(5)],[edge(3);edge(6)]); if (~isempty(varargin)) set(h, varargin{:}); end else h = -1; end % xử lí đầu ra if nargout > 0 varargout{1} = h; end 2.5.6. Mặt phẳng Áp dụng kỹ thuật xén mặt phẳng mục 5.2.3 phần phục lục. Để vẽ mặt phẳng trong không gian thực hiện các bƣớc :
Chọn giới hạn của vùng xén là tập các điểm thỏa mãn hệ trục hiện thời :