Các kiểu dữ liệu MATLAB

Một phần của tài liệu (LUẬN văn THẠC sĩ) xử lý đồ họa trong matlab phục vụ cho công cụ toán học ở trường phổ thông luận văn ths toán học 60 46 35 (Trang 30)

2.1.4. Cách tạo M-file

Trong MATLAB, M-file là các file chƣơng trình đƣợc soạn thảo và lƣu ở dạng văn bản. Có hai loại M-file là Script file và Function file. Script M-file không phải là một hàm, nó khơng có các tham số đầu vào cũng nhƣ đầu ra, và đơn giản nó chỉ thực hiện một chuỗi các câu lệnh của MATLAB, với các biến đƣợc định nghĩa trong không gian làm việc. Hàm M-file khác với script M-file ở chỗ nó có một dịng định nghĩa hàm, qua đó liên hệ giữa các tham số đầu vào và đầu ra. Cả hai đều có phần tên mở rộng là ".m". Để tạo m-file ta thực hiện một trong ba cách sau :

 Trong cửa sổ command gõ lệnh edit

 Vào menu File > New > Script (hoặc Function)  Nhắp chuột vào biểu tƣợng tạo file (New Script)

Sau khi tạo file xong chúng ta chọn biểu tƣợng Save, hoặc bấm tổ hợp phím Ctrl + S rồi lƣu file vào thƣ mục đã chọn.

Ví dụ tạo Script file

% khai báo độ dài các cạnh của tam giác a = 3; b = 5; c = 7;

% tính chu vi và diện tích tam giác theo cơng thức hê rơng p = (a + b + c)/2;

Ví dụ tạo Function file

function [s] = dientich(a, b, c)

% a, b, c, p, s lần lƣợt là 3 cạnh, nửa chu vi, và diện tích tam giác p = (a + b + c)/2;

s = sqrt(p*(p-a)*(p-b)*(p-c));

2.1.5. Mảng, ma trận, vecto

Mảng là một tập hợp các số gọi là các „phần tử‟, đƣợc biết đến với một hoặc

nhiều chỉ số chạy suốt các tập hợp chỉ số. Trong MATLAB, các tập hợp chỉ số luôn là chuỗi số nguyên bắt đầu bằng 1.

Số chiều của một mảng là số các chỉ số cần thiết để định nghĩa một phần tử

trong mảng. Chẳng hạn mảng 2 chiều sẽ cần 2 chỉ số i và j để đặc trƣng cho một phẩn tử của mảng.

Kích thước của mảng là một danh sách các kích thƣớc của các tập hợp chỉ

số.

Ma trận là một mảng hai chiều kích thƣớc mxn với các quy luật đặc biệt cho

phép cộng, nhân và các tính tốn khác. Nó đặc trƣng cho một sự biến đổi tuyến tính về tốn học. Hai chiều của ma trận là hàng và cột (m hàng và n cột).

Vecto là một ma trận mà một chiều chỉ có chỉ số bằng 1. Cụ thể, một vecto

hàng là một ma trận chỉ có một hàng (kích thƣớc 1xn), cịn một vecto cột là một ma trận chỉ có một cột (kích thƣớc mx1).

2.1.6. Các phép toán trên ma trận, vecto

Tạo ma trận bằng các hàm có sẵn trong MATLAB

 Zeros(m, n): tạo ma trận cấp mxn với tất cả các phần tử bằng 0  Ones(m, n): tạo ma trận cấp mxn với tất cả các phần tử bằng 1  Eye(n): tạo ma trận đơn vị cấp n

 rand(n, m): tạo ma trận cấp mxn với các phần tử ngẫu nhiên thuộc (0, 1)

 linspace(a, b, n): tạo một vecto hàng có n phần tử cách đều nhau phần tử đầu là a, phần tử cuối là b.

 repmat(A, m, n): tạo ma trận mới cấp (size(A, 1)*m)x(size(A, 2)*n) bằng cách copy ma trận A theo một chiều hoặc hai chiều đã định. Các phép toán thƣờng gặp

 A': ma trận chuyển vị của ma trận A  size(A, 1): trả về số hàng của ma trận A  size(A, 2): trả về số cột của ma trận A  length(A): kích thƣớc lớn nhất của A

 unique(A): lấy danh sách các phần tử không trùng nhau từ tập A  convhull(x, y): trả về chỉ số các điểm bao lồi từ hai vecto x, y  sum(A): tính tổng các phần tử trên từng cột của ma trận A  diag(A): lấy các phần tử đƣờng chéo của ma trận A

 det(A): tính định thức của ma trận A  rank(A): tính hạng của ma trận A

 inv(A): tìm ma trận nghịch đảo của ma trận A

 A(n, m) ± B(n, m) = C(n, m): cộng và trừ hai ma trận tƣơng ứng  A(n, m) * B(m, k) = C(n, k): nhân hai ma trận

 A(i, j): truy xuất phần tử mảng aij của ma trận A

 A(i:j, k): truy xuất các phần tử từ i đến j theo cột thứ k của ma trận A  A(k, i:j): truy xuất các phần tử từ i đến j theo hàng k của ma trận A

2.1.7. Các toán tử quan hệ

Các toán tử quan hệ thực hiện sự so sánh từng phần tử với phần tử giữa hai mảng. Nó cho kết quả là một mảng logic có cùng kích cỡ, với các phần tử của mảng là đúng (1) nếu quan hệ đó là đúng, và phần tử của mảng là sai (0) nếu không đúng.

Bảng 2. Bảng các toán tử quan hệ trong MATLAB

Toán tử Cú pháp Mô tả < A < B Nhỏ hơn <= A <= B Nhỏ hơn hoặc bằng > A > B Lớn hơn >= A >= B Lớn hơn hoặc bằng == A == B Bằng   AB Không bằng

2.1.8. Các toán tử logic

MATLAB biểu diễn giá trị đúng và sai qua hai số 1 và 0 : true = 1, false = 0

Bảng 3. Bảng các toán tử logic

& Và (and)

|| Hoặc (or)

 Khơng (not)

2.1.9. Vịng lặp rẽ nhánh

Lệnh if có thể liên quan tới các tốn tử quan hệ đã đề cập ở trên, cũng có thể

liên quan tới các hàm cho ta giá trị logic.

if (biểu thức logic)

câu lệnh

elseif (biểu thức logic)

câu lệnh

else

câu lệnh

end

Lệnh switch thƣờng dùng để thay thế if/elseif chỉ trong trƣờng hợp có một

số lƣợng lớn các lựa chọn khả dĩ. switch (biểu thức xét) case trƣờng hợp 1 câu lệnh case trƣờng hợp i câu lệnh case trƣờng hợp n câu lệnh otherwise câu lệnh end 2.1.10. Vòng lặp điều khiển 2.1.10.1. Vòng lặp for

Vòng For đƣợc sử dụng khi ta muốn lặp một đoạn mã lệnh cho một số lần tùy ý. for k = biểu thức xét câu lệnh ... câu lệnh end

2.1.10.2. Vòng lặp while

Vòng While đƣợc sử dụng khi bạn muốn thực hiện lặp đi lặp lại một đoạn mã lệnh của MATLAB cho tới khi một điều kiện (logic) nào đó đƣợc thỏa mãn, nhƣng ta khơng thể nói trƣớc nó sẽ cần lặp bao nhiêu lần. Khi đó ta có thể sử dụng vịng lặp này.

while biểu thức logic

câu lệnh

end

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 khn khổ của luận văn, để nội dung này khơng làm lỗ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 tố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 tố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. Ngồ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 tố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  = ABb 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 xpx xu) p (yb ypy yu) p 0 (1) UI =  AB 2 2 2 2 (xbxp xu) (ybyp 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  xx  yy y  yy  xx ; ( b [( b a) ( b a)]; b [( b a) ( b a)]) V x  xx  yy y  yy  xx .

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).

% 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 tố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) (i0..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) (i0..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)

Một phần của tài liệu (LUẬN văn THẠC sĩ) xử lý đồ họa trong matlab phục vụ cho công cụ toán học ở trường phổ thông luận văn ths toán học 60 46 35 (Trang 30)

Tải bản đầy đủ (PDF)

(108 trang)