annimation in matlab

70
Đ ha đºng trong Matlab Sinh viên: Tl Nguy„n Thái Sơn MSSV: 1111279 Lp CNTN K2011 GVHD: Trnh Anh Ngc Ngày 3 tháng 1 năm 2013 Tóm t›t nºi dung Tài li»u s‡ trình bày 2 cách - phương pháp v‡ hình đºng cơ b£n trong MATLAB, cùng các l»nh cơ b£n đ” thüc hi»n, lưu £nh .gif và movie .avi. Bên c/nh đó đưa ra mºt sL ví d, đc bi»t là các phương trình sóng và dao đºng. Các ví d đã test ho/t đºng tLt trên phiên b£n MATLAB R2010a (7.10.0) 1

Upload: vipts

Post on 26-Dec-2015

123 views

Category:

Documents


14 download

TRANSCRIPT

Page 1: Annimation in Matlab

Đồ họa động trong Matlab

Sinh viên: Từ Nguyễn Thái SơnMSSV: 1111279

Lớp CNTN K2011

GVHD: Trịnh Anh Ngọc

Ngày 3 tháng 1 năm 2013

Tóm tắt nội dung

Tài liệu sẽ trình bày 2 cách - phương pháp vẽ hình động cơ bảntrong MATLAB, cùng các lệnh cơ bản để thực hiện, lưu ảnh .gif vàmovie .avi. Bên cạnh đó đưa ra một số ví dụ, đặc biệt là các phươngtrình sóng và dao động. Các ví dụ đã test hoạt động tốt trên phiênbản MATLAB R2010a (7.10.0)

1

Page 2: Annimation in Matlab

Mục lục

Mục lục 2

1 Các kiến thức cơ bản để tạo hình động 41.1 Handle graphics Objects . . . . . . . . . . . . . . . . . . . . 41.2 Hàm drawnow . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3 Hàm delete . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.4 Hàm getframe . . . . . . . . . . . . . . . . . . . . . . . . . 71.5 Hàm movie . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.6 Hàm moviein . . . . . . . . . . . . . . . . . . . . . . . . . . 111.7 Hàm pause . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.8 Hàm figure . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.9 Hàm view . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.10 Hàm set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2 Vẽ hình động trong MATLAB 182.1 Phương pháp thứ nhất . . . . . . . . . . . . . . . . . . . . . 18

2.1.1 Nguyên lý của phương pháp . . . . . . . . . . . . . . 182.1.2 Erase Mode . . . . . . . . . . . . . . . . . . . . . . . 192.1.3 Ví dụ minh họa . . . . . . . . . . . . . . . . . . . . . 20

2.2 Phương pháp thứ hai . . . . . . . . . . . . . . . . . . . . . . 252.2.1 Nguyên lý của phương pháp . . . . . . . . . . . . . . 252.2.2 Ví dụ minh họa . . . . . . . . . . . . . . . . . . . . . 26

3 Các ví dụ dùng vẽ hình động 293.1 Đường tròn với kim đồng hồ . . . . . . . . . . . . . . . . . . 293.2 Một chuyển động đơn giản . . . . . . . . . . . . . . . . . . . 323.3 Mặt astroid quay trong không gian 3 chiều . . . . . . . . . . 353.4 Các phương trình sóng . . . . . . . . . . . . . . . . . . . . . 40

3.4.1 Vẽ với hàm sin . . . . . . . . . . . . . . . . . . . . . 413.4.2 Vẽ với hàm gauss . . . . . . . . . . . . . . . . . . . . 453.4.3 Mở rộng sóng gauss . . . . . . . . . . . . . . . . . . . 46

2

Page 3: Annimation in Matlab

MỤC LỤC 3

3.4.4 Một ví dụ khác về phương trình sóng . . . . . . . . . 483.5 Dao động lò xo . . . . . . . . . . . . . . . . . . . . . . . . . 513.6 Mặt sóng 3D . . . . . . . . . . . . . . . . . . . . . . . . . . 533.7 Mặt besselj . . . . . . . . . . . . . . . . . . . . . . . . . . . 553.8 Hình âm dương quay . . . . . . . . . . . . . . . . . . . . . . 563.9 Astroid quay trong mặt phẳng 2 chiều . . . . . . . . . . . . 593.10 Mô phỏng con lắc đơn . . . . . . . . . . . . . . . . . . . . . 61

4 Ảnh và movie trong matlab 654.1 Lưu chuyển động thành file ảnh .gif . . . . . . . . . . . . . . 654.2 Lưu chuyển động thành file movie .avi . . . . . . . . . . . . 67

Tài liệu tham khảo 70

Page 4: Annimation in Matlab

Chương 1

Các kiến thức cơ bản để tạohình động

Phần này chỉ trình bày các kiến thức, cú pháp cần thiết, đầy đủ hơn xemhelp. 1

1.1 Handle graphics Objects

Một đối tượng thuộc loại handle graphics là một cấu trúc hướng đối tượngtạo, thao tác và hiển thị đồ họa. Tóm lại, biến loại này dùng xác định mộtđối tượng.

Đối tượng đồ họa là những yếu tố vẽ cơ bản được sử dụng trong MAT-LAB. Mỗi đối tượng đồ họa có:

• Một định danh duy nhất, được gọi là một handle

• Một tập hợp các đặc điểm, được gọi là properties

Ví dụ, khi vẽ đồ thị hàm y = cos(x) ta có thể định danh cho đồ thị(thuộc loại Handle graphics Objects)

x = 0:pi/100:2*pi;

h = plot(cos(x), ’LineWidth’, 2)

Khi đó ta có thể tác động lên đồ thị này thông qua biến điều khiển địnhdanh h, như thay đổi màu sắc, nét vẽ, . . . cho đồ thị.

1Các cú pháp của hàm có lược bỏ những nội dung không nằm trong khuôn khổ báocáo

4

Page 5: Annimation in Matlab

CHƯƠNG 1. CÁC KIẾN THỨC CƠ BẢN ĐỂ TẠO HÌNH ĐỘNG 5

syms x

h = ezplot(cos(x))

set(h,’Color’, ’black’)

set(h,’LineWidth’,10)

Các hàm chức năng hữu dụng trong cài đặt thuộc tính

1. 0 - Object loại handle cơ bản nhất, là gốc điều khiển màn hình

2. gcf - trả về biến handle điều khiển cửa sổ đồ họa hiện tại

3. gca - trả về biến handle điều khiển trục tọa độ trong cửa sổ đồ họahiện tại

4. findobj(handles,’PropertyName’,PropertyValue) tìm trong cửasổ đồ họa và trả về đối tượng có các tính chất như mong muốn. Đâylà một cách tìm kiếm các đối tượng (như một đồ thị) khi ta vẽ nó màkhông đi kèm định danh, nhưng về sau cần tác động một số thuộctính lên nó.

Chi tiết hơn về các thuộc tính ’PropertyName’ và ’PropertyValue’ xemtrong Help của Matlab

1.2 Hàm drawnow

Công dụng Vẽ một đối tượng tại ngay thời điểm trình biên dịch (com-piler) biên dịch đến dòng đó.

Cú pháp và mô tả chi tiết drawnow

drawnow xóa hàng đợi (queue) các đối tượng đang chờ được xử lý vàcập nhật đối tượng đang được thực thi lên cửa sổ hình ảnh. Hàng đợi ở đâygiống như khái niệm ’queue’ trong tin học, là một vật chứa (container) hoạtđộng theo co chế LIFO (Last In First Out). Nguyên tắc thực hiện củamáy tính hay MATLAB là tiếp nhận các sự kiện theo thứ tự tuyến tính,xếp vào queue và sử lý tuần tự những cái đến trước nhất.

Nôm na có thể hiểu là qua mỗi lượt lặp, ta phải gọi drawnow để MAT-LAB thực sự hiển thị từng hình vẽ. Còn nếu không, nó sẽ đợi đến tận khivẽ xong hết các hình rồi mới cập nhật quá trình hiển thị.

Page 6: Annimation in Matlab

CHƯƠNG 1. CÁC KIẾN THỨC CƠ BẢN ĐỂ TẠO HÌNH ĐỘNG 6

Ví dụ Xem đoạn chương trình sau

axis([-5 5 -1 1])

x = -pi:pi/200:pi;

hold on

for i=1:length(x)

plot(x(i),cos(x(i)),’-o’,’LineWidth’,5)

drawnow

end

title(’y = cos(x)’)

hold off

Khi không có lệnh drawnow trong vòng lặp thì đoạn code trên tương tựnhư kết quả thu được khi chạy đoạn code

x = -pi:pi/200:pi;

plot(x,cos(x),’-o’,’LineWidth’,5)

title(’y = cos(x)’)

Khi có drawnow, matlab không vẽ một lần mà ta sẽ có một đường đi hiểnthị dần dần lên màn hình từ điểm đầu đến điểm cuối của hàm y = cos(x)

1.3 Hàm delete

Đây là hàm thường dùng trong phương pháp vẽ và xóa 2.1.

Công dụng Xóa một file hoặc một đối tượng đồ họa thông qua biếnhandle

Cú pháp

• delete filenamexóa tập tin có tên filename lưu trên đĩa. Các tên này có thể kèm cùngvới đường dẫn

• delete(h)xóa các đối tượng đồ họa với biến định danh handle h. Xóa đối tượngmà không yêu cầu xác minh ngay cả khi đối tượng là một cửa sổ.

• delete(’filename’)Một dạng của hàm delete, xóa tập tin khi khi tên được lưu ở dạngmột chuỗi

Page 7: Annimation in Matlab

CHƯƠNG 1. CÁC KIẾN THỨC CƠ BẢN ĐỂ TẠO HÌNH ĐỘNG 7

Ví dụ

x = -pi:pi/200:pi;

h = plot(x,cos(x))

title(’y = cos(x)’)

delete(h)

1.4 Hàm getframe

Công dụng getframe Lấy khung hình cho vào movie

Cú pháp và mô tả

• getframe trả về một khung hình. Một khung hình là một snapshot– ảnh chụp nhanh (pixmap) của hệ tọa độ hoặc ảnh hiện tại.

• F = getframe lấy một khung hình từ trục tọa độ hiện tại.

• F = getframe(h) lấy 1 khung hình từ ảnh hoặc trục tọa độ hiện tạixác định bởi biến điều khiển h – một giá trị tạo ra để làm định danhcho một đối tượng. Ví dụ khi ta vẽ bằng lệnh plot, ta có thể địnhdanh cho đối tượng theo kiểu h = plot(x,cos(x))

• F = getframe(h,rect) chỉ định một khu vực hình chữ nhật để copyảnh pixmap vào. rect liên quan đến góc dưới bên trái của các con sốhoặc trục h, trong các đơn vị điểm ảnh. rect là một vector bốn yếutố [left bottom width height], chiều rộng và chiều cao xác địnhkích thước của hình chữ nhật

• F = getframe(...) trả về một khung hình, có cấu trúc gồm 2 trường:

– cdata – Hình ảnh được lưu trữ dạng ma trận uint8. Số chiềucủa F.cdata là height-by-width-by-3

– colormap – colormap lưu trữ hình ảnh dạng ma trận n-by-3.F.colormap là rỗng trên hệ màu chuẩn.

Để tạo ra một bức hình, sử dụng phương pháp sau:

F = getframe(gcf);

image(F.cdata)

colormap(F.colormap)

Page 8: Annimation in Matlab

CHƯƠNG 1. CÁC KIẾN THỨC CƠ BẢN ĐỂ TẠO HÌNH ĐỘNG 8

Nhận xét Thông thường, getframe được dùng trong vòng lặp for đểthu thập một mảng các khung hình của movie để trình chiếu lại khi dùnghàm movie.

Ví dụ

for j = 1:n

plotting commands

F(j) = getframe;

end

movie(F)

Khu vực thu hình Lưu ý rằng

• F = getframe trả về nội dung của các trục hiện ảnh, không bao gồmcác nhãn của các trục, tiêu đề, nhãn đánh dấu.

• F = getframe (GCF) thu lại toàn bộ những gì có trong cửa sổ hìnhảnh hiện tại.

• F = getframe (h, rect) thu lại hình ảnh có cả menu cửa sổ vớimột hình chữ nhật có kích thước bao gồm thanh menu.

Ví dụ Tạo sự di động của hàm peaks2

Z = peaks; surf(Z)

axis tight

set(gca,’nextplot’,’replacechildren’);

for j = 1:20

surf(sin(2*pi*j/20)*Z,Z)

F(j) = getframe;

end

movie(F,20)

Và kết quả xem hình 1.1

2Hàm peaks là một ví dụ cài sẵn về hàm 2 biến của Matlab. Thu được từ phân bốGauss. Chi tiết xem help peaks trong Matlab.

Page 9: Annimation in Matlab

CHƯƠNG 1. CÁC KIẾN THỨC CƠ BẢN ĐỂ TẠO HÌNH ĐỘNG 9

Hình 1.1: Đồ thị hàm peaks

1.5 Hàm movie

Công dụng movieTrình chiếu một đoạn video được thu lại từ những khung hình

Cú pháp và mô tả movie trình chiếu một đoạn phim bởi một ma trậnmà các cột của nó là các khung hình (thường được lấy từ lệnh getframe),chi tiết về getframe xem 1.4

• movie(M) trình chiếu đoạn movie trong ma trận M một lần duynhất.

• movie(M,n) trình chiếu một đoạn movie n lần. Nếu n âm, mỗi chukỳ được chiếu tới và ngược trở lại. Nếu n là một vector, phần tử đầutiên là số lần trình chiếu đoạn video, và những phần tử còn lại tạo tamột danh sách các khung hình được trình chiếu trong đoạn movie.

Page 10: Annimation in Matlab

CHƯƠNG 1. CÁC KIẾN THỨC CƠ BẢN ĐỂ TẠO HÌNH ĐỘNG 10

Ví dụ nếu M có 4 khung hình thì n = [10 4 4 2 1] sẽ chơi movie 10lần, và đoạn phim sẽ bao gồm 4 khung hình, đầu tiên là khung hìnhthứ 4, rồi khung hình thứ 4 lần nữa, rồi đến khung hình thứ 2 và cuốicùng là khung hình thứ 1.

• movie(M,n,fps) trình chiếu movie với "fps" khung hình trên 1 giây.Giá trị mặc định là 12 khung hình trên 1 giây. Máy tính không thểđạt được khả năng "tốc độ chơi càng nhanh càng tốt".

• movie(h,...) trình chiếu các movie ở giữa bức hình hay trục tọa độđược nhận dạng bởi điều khiển bởi biến h

• movie(h,M,n,fps,loc) Chỉ rõ một vector vị trí gồm 4 thành phần[x y 0 0] nơi mà góc dưới bên trái của khung phim được neo giữ (chỉcó hai yếu tố đầu tiên trong vector được sử dụng). Với vị trí là tươngđối so với góc dưới bên trái của các con số hoặc trục quy định bằngcách xử lý qua biến h và trong các đơn vị của các điểm ảnh, bất kểthuộc tính của đối tượng.

Nhận xét Hàm movie hiển thị mỗi khung hình và ’load’ nó vào bộ nhớ,và sau đó trình chiếu đoạn movie. Điều này giúp loại bỏ sự chậm trễ lâudài với một màn hình trống khi bạn tải một bộ phim nhiều bộ nhớ. Chukỳ nạp của bộ phim không được coi là một trong những lần lặp lại.

Ví dụ Tạo ra hình động với hàm "đỉnh chóp" với các giá trị của hàm

Z = peaks; surf(Z);

axis tight

set(gca,’nextplot’,’replacechildren’);

% Thu hình vào movie

for j = 1:20

surf(sin(2*pi*j/20)*Z,Z)

F(j) = getframe;

end

% Chơi movie 20 lần

movie(F,20)

Ghi chú Hàm set trong ví dụ trên xem ở 1.10.

Page 11: Annimation in Matlab

CHƯƠNG 1. CÁC KIẾN THỨC CƠ BẢN ĐỂ TẠO HÌNH ĐỘNG 11

1.6 Hàm moviein

Công dụng movienin Chỉ định giá trị bộ nhớ cho các khung hình movie

Cú pháp - Ý nghĩa

• moviein(n) Dành bộ nhớ để lưu n khung hình

Chú ý Các phiên bản về sau (từ Matlab 5.3 trở đi), hàm này không còncần thiết và bộ nhớ được cấp phát một cách tự động.

Ví dụ Để tạo một movie, ta có thể làm như sau

for j=1:n

%%%% Vẽ nội dung

M(j) = getframe;

end

movie(M)

Để code có thể chạy được trên mọi phiên bản Matlab, ta phải dùng

M = moviein(n);

for j=1:n

%%%% Vẽ nội dung

M(:,j) = getframe;

end

movie(M)

1.7 Hàm pause

Công dụng Tạm dừng sự thực thi tạm thời.

Cú pháp và mô tả

• pauseBản thân nó làm cho M-files tạm dừng và chờ cho đến khi người dùngnhấn bất kì phím nào trước khi tiếp tục.

Page 12: Annimation in Matlab

CHƯƠNG 1. CÁC KIẾN THỨC CƠ BẢN ĐỂ TẠO HÌNH ĐỘNG 12

• pause(n)Tạm dừng sự thực thi n giây trước khi tiếp tục. Với n có thể là sốthực không âm bất kỳ.

• pause onCho phép dãy các lệnh tạm dừng tiếp theo ở phía sau có hiệu lực.

• pause offĐảm bảo rằng bất kỳ lệnh pause hoặc pause(n) ở phía sau khôngthực hiện tạm dừng. Điều này cho phép các kịch bản tương tác bìnhthường để chạy không cần giám sát.

Ví dụ

axis([-5 5 -1 1])

x = -pi:pi/200:pi;

hold on

for i=1:length(x)

plot(x(i),cos(x(i)),’-o’,’LineWidth’,5)

pause(0.01)

drawnow

end

title(’y = cos(x)’)

hold off

1.8 Hàm figure

Công dụng Tạo ra một cửa sổ đồ họa, ví dụ

Cú pháp và mô tả

• figureTạo ra một cửa sổ đồ họa mới

• figure(’PropertyName’,PropertyValue,...)Tạo ra một cửa sổ đồ họa mới với các thuộc tính ’PropertyName’

mang các giá trị ’PropertyValue’

• figure(n) với n là số nguyên dương.Tạo ra cửa sổ đồ họa thứ n

Page 13: Annimation in Matlab

CHƯƠNG 1. CÁC KIẾN THỨC CƠ BẢN ĐỂ TẠO HÌNH ĐỘNG 13

• h = figure(...)Đưa biến h thành biến điều khiển cửa sổ đồ họa.

Ví dụ Để tạo một cửa sổ đồ họa với kích thước bằng 1/4 màn hình, vịtrí nằm ở phía trên bên trái, ta sử dụng Object ScreenSize 3 để xác định kíchthước. ScreenSize là một vector 4 phần tử [left, bottom, width, height]

scrsz = get(0,’ScreenSize’);

figure(’Position’,[1 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2])

Khi này cửa sổ đồ họatạo ra giống như bên cạnh.Vẫn là một cửa sổ đồ họa rỗngdo ta chưa vẽ gì lên nó.

Để tạo cửa sổ đồ họa full màn hình, dùng

scrsz = get(0,’ScreenSize’);

figure(’Position’,[1 scrsz(2) scrsz(3) scrsz(4)])

1.9 Hàm view

Công dụng Điều khiển điểm nhìn (góc nhìn)

Cú pháp và mô tả Một góc nhìn trong MATLAB được xác định bởi 2thông số, minh họa bởi hình sau. Các mũi tên chỉ hướng quét của góc

• Azimuth

• Elevation

MATLAB tự động lựa chọn góc nhìn theo trường hợp 2-D hay 3-D:

• Trong chế độ 2D, mặc định Azimuth= 0◦ và Elevation= 90◦

• Trong chế độ 3D, mặc định Azimuth= −37.5◦ và Elevation= 30◦

3Chi tiết về ScreenSize xem help

Page 14: Annimation in Matlab

CHƯƠNG 1. CÁC KIẾN THỨC CƠ BẢN ĐỂ TẠO HÌNH ĐỘNG 14

Hình 1.2: Các thông số xác định một điểm nhìn

Cú pháp view([x y]) trong đó

• x tính bằng độ, đại diện cho số đo góc Azimuth

• y tính bằng độ, đại diện cho số đo góc Elevation

Ví dụ Cùng một đường astroid: y23 + z

23 = 2

23 trong không gian 3 chiều

với 2 góc nhìn view([30 60]) và view([90 0])

Có thể dùng nhanh view(3) thiết lập chế độ 3D với góc nhìn mặc định,view(2) thiết lập chế độ 2D với góc nhìn mặc định

Page 15: Annimation in Matlab

CHƯƠNG 1. CÁC KIẾN THỨC CƠ BẢN ĐỂ TẠO HÌNH ĐỘNG 15

1.10 Hàm set

Công dụng set cài đặt thuộc tính cho đối tượng

Cú pháp và mô tả chi tiết Ta chỉ đề cập các lệnh set dùng trongkhuôn khổ báo cáo

• set(H,’PropertyName’,PropertyValue,...)Cài đặt thuộc tính ’PropertyName’ mang giá trị ’PropertyValue’, córất nhiều ’PropertyName’ trong Matblab và thật sự không cần thiếtliệt kê ra hết ở đây, vì chúng đã có trong Help, và một số thuộc tínhnằm ngoài khuôn khổ báo cáo này.

Ví dụ set(H,’PropertyName’,PropertyValue,...)

• Thay vì chỉnh trực tiếp các thông số về thuộc tính đường thẳng, nétvẽ,. . . khi dùngplot(x,y,’—rs’,’LineWidth’,2,’MarkerEdgecolor’,’k’,...)

ta có thể gán đồ thị vào một biến handle h rồi thay đổi các thuộc tínhnhư sau

x = 0:pi/50:2*pi;

h = plot(cos(x))

set(h,’LineWidth’,2,{’LineStyle’},{’--’})

set(h,{’Color’},{’r’})

• Đánh dấu các độ chia trên trục Oy theo ý muốn

x = 0:1:100;

h = plot(x.^2 + 2*x)

set(gca,’ytick’,[2 1000 2000 3000 4000 5000])

Page 16: Annimation in Matlab

CHƯƠNG 1. CÁC KIẾN THỨC CƠ BẢN ĐỂ TẠO HÌNH ĐỘNG 16

• Chỉnh tỉ lệ của hình 3D, vector [2.5 2.5 1] chính là tỉ lệ tương ứngtrục Ox,Oy,Oz, trong trường hợp 2D không quan tâm thành phầnthứ ba nhưng cú pháp bắt buộc phải có, chỉ cần dùng thêm view(2)

set(gca,’PlotBoxAspectRatio’,[2.5 2.5 1])

• Sau mỗi lần cập nhật hình ảnh và vẽ lại lên cửa sổ đồ họa, nếu hìnhmới có tỉ lệ lớn hơn hay nhỏ hơn,. . . thì MATLAB tự động điều chỉnhhệ trục tọa độ của hình cho phù hợp. Dẫn đến khi làm hình động, docác trục thay đổi ngoài ý muốn sẽ gây ra hiện tượng giật. Để ngănngừa tình trạng đó, ta dùng

set(gca,’NextPlot’,’replacechildren’)

lệnh này, sẽ ngăn ngừa hàm plot trả về axis normal sau mỗi lần vẽ4

• Để làm cho sự chuyển động mượt mà hơn, dùng lệnh set với các thuộctính về ’Renderer’ 5

set(gcf,’Renderer’,’OpenGL’);

• Khi dùng phương pháp vẽ và xóa (Xem 2.1), ta có thể chọn một sốthuộc tính về cách xóa để tạo ra sự mượt mà hơn cho chuyển động,chúng được dùng với set, chi tiết xem 2.1.2.

4Chi tiết xem thuộc tính ’NextPlot’ và ’replacechildren’ trong help5Xem help để có chi tiết về ’Renderer’, có các giá trị ’PropertyValue’ là [ painters

| zbuffer | OpenGL | None ]

Page 17: Annimation in Matlab

CHƯƠNG 1. CÁC KIẾN THỨC CƠ BẢN ĐỂ TẠO HÌNH ĐỘNG 17

set(h,’EraseMode’,’normal’);

• Chỉnh màu nền cho cửa sổ đồ họa

h = figure(1)

set(gca,’color’,’b’)

set(h,’color’,’r’)

% = set(gcf,’color’,’r’)

• Xóa (không hiển thị các trục tọa độ), dùng lại ’ytick’ và ’xtick’ ở trên

x = 0:1:100;

h = plot(x.^2 + 2*x)

set(gca,’xtick’,[])

set(gca,’ytick’,[])

Page 18: Annimation in Matlab

Chương 2

Vẽ hình động trong MATLAB

Trong phần này, ta sẽ nói tới 2 cách tạo ra hình động bằng MATLAB

1. "On the fly" - Liên tục xóa và sau đó vẽ lại các đối tượng trên mànhình, mỗi lần vẽ lại có sự thay đổi nhỏ, quá trình này sẽ làm nên sửchuyển động cho đối tượng, với mức thay đổi đủ nhỏ làm ra sự mượtmà cho chuyển động.

2. "Frame by Frame" (Chụp khung hình và phát lại) - Tại mỗi điểmhiển thị một hình vẽ, ta lưu lại nó như một khung hình (frame). Tấtcả các hình ảnh (frame) khác nhau đó được lưu lại và sau đó chơichúng trở lại như một bộ phim.

2.1 Phương pháp thứ nhất

Đây là kĩ thuật vẽ, tẩy xoá, và sau đó vẽ lại, có một số chế độ (mode) vẽvà xóa khác nhau được hỗ trợ bởi MATLAB.

2.1.1 Nguyên lý của phương pháp

Ta tạo hình động bằng cách vẽ và xóa liên tục một đối tượng trên mànhình, mỗi lần vẽ lại có sự thay đổi để tạo ra chuyển động.Cơ bản nhất của ý tưởng chính là trường hợp một chiều, giống như mộtchiếc xe di chuyển trên đường thẳng từ A đến B, ta có thể phân hoạch ABra n đoạn [ai, ai+i] với A = a0 < a1 < . . . < an = B và giả sử rằng xe đitừ A đến B trong khoảng thời gian t biến thiên [c, d] (giả sử chuyển độnglà liên tục). Khi đó ta vẽ hình ảnh của chiếc xe tại mỗi thời điểm ti tươngứng vị trí ai của chiếc xe. Dùng một vòng lặp làm lần lượt các công việc

18

Page 19: Annimation in Matlab

CHƯƠNG 2. VẼ HÌNH ĐỘNG TRONG MATLAB 19

1. Vẽ hình ảnh chiếc xe tại tời điểm hiện tại

2. Xóa hình vẽ chiếc xe

3. Tăng biến đếm i = i+ 1

t1 t2 t3 t4 t5 t6 t7

t1

t2

t1

Vẽ

Xóa

Vẽ

A Ba1 a2 a3 a4 a5 a6 a7

Ta có thể nhận thấy là khi độ chia càng nhỏ, thì một cách hiển nhiênta thường nghĩ là sự chuyển động sẽ mượt mà hơn. Tuy nhiên, có thể thêmcác lệnh về ’Renderer’ 1 để tạo sự chuyển động mượt mà hơn, nhiều lúc tỏra rất hiệu quả.

2.1.2 Erase Mode

Việc xóa không có nghĩa là xóa hoàn toàn mà có thể là ta tô màu đối tượngcho hòa hợp với màu nền, và tại mỗi bước ta có cách tô màu khác nhau đểtạo ra sự chuyển động.

Tổng quát hơn, một hành động làm cho MATLAB vẽ lại một đối tượngkhông chỉ có vẽ và xóa, mà còn có thể thay đổi thuộc tính của đối tượng,để nó trông giống như đang được vẽ lại. Từ đó ta có thể tận dụng đặc điểmnày để tạo ra một chuỗi động.

1Xem 1.10

Page 20: Annimation in Matlab

CHƯƠNG 2. VẼ HÌNH ĐỘNG TRONG MATLAB 20

Một hình thức đặc trưng cho cách này chính là thay vì vẽ, xóa và vẽ lạiđối tượng mới, ta thay đổi tọa độ theo x, y, z một lượng đủ nhỏ nhờ cácvòng lặp, hoặc thay đổi góc nhìn,. . .

Ta có thể tạo ra các hiệu ứng khác nhau nhờ các cách xoá hình khácnhau. Chúng gồm:

• none MATLAB không xoá đối tượng khi nó di chuyển

• background MATLAB xoá đối tượng bằng cách vẽ nó có màu nền

• xor MATLAB chỉ xoá đối tượng

Tất cả ba chế độ là nhanh hơn (mặc dù ít chính xác hơn) hơn so với chếđộ bình thường mặc định của MATLAB.

2.1.3 Ví dụ minh họa

Dựa trên tư tưởng chiếc xe di chuyển trong 2.1.1, ta sẽ thực hiện nó nhưsau

Code 1 (Vẽ và xóa).

% Tạo dữ liệu

t = 0:0.001:1; % Dữ liệu về tời gian

x = 2*t; % Dữ liệu về vị trí

% Vẽ hình

figure(1); % Chỉ định cửa sổ đồ họa để vẽ

set(gca,’NextPlot’,’replacechildren’) %%(1)

set(gcf,’Renderer’,’OpenGL’); %%(2)

hold on

plot(0,0,’o’,’Markersize’,5,’MarkerFacecolor’,’black’)% Điểm A

plot(2,0,’o’,’Markersize’,5,’MarkerFacecolor’,’black’)% Điểm B

axis([-0.5 2.5 -1 1]) % Giới hạn trục tọa độ

line([0 2] ,[0 0],’color’,’black’) % Vẽ đoạn thẳng AB

% Bắt đầu vẽ bằng vòng lặp

for i = 1:length(t)

h = plot(x(i),0,’o’,’MarkerSize’,20,’MarkerFaceColor’,’b’);

drawnow

delete(h) % Xóa

end

hold off

Trong đó

Page 21: Annimation in Matlab

CHƯƠNG 2. VẼ HÌNH ĐỘNG TRONG MATLAB 21

(1) Là lệnh ngăn không cho MATLAB đưa trục toa độ về normal axissau mỗi lần dùng plot, tránh hình ảnh chuyển động bị giật (không cóđoạn code trên vẫn chạy được)

(2) Tạo ra sự mượt mà cho chuyển động (không có đoạn code trên vẫnchạy được) 2

Hình 2.1: Vẽ và xóa

Nhìn vào đoạn code trên, ta thấy ý tưởng phương pháp mình họa rất rõràng, tại mỗi lần lặp, ta vẽ xong và xóa nó ngay sau khi đưa lên màn hình.Nếu không có lệnh xóa này, kết quả sẽ thu được như sau

Hình 2.2: Hình ảnh thu được khi không có delete

2Xem thêm 1.10

Page 22: Annimation in Matlab

CHƯƠNG 2. VẼ HÌNH ĐỘNG TRONG MATLAB 22

Vì khi bật hold on, tất cả các hình vẽ hiển thị lên màn hình đều đượcgiự lại, nên khi bỏ delete thì ta sẽ có vệt dài như trên. Chú ý là khi dùngplot, nếu không có hold on, thì sau mỗi lần ta dùng plot thì cửa sổ đồhọa chỉ hiện (cập nhật) hình ảnh mới nhất và tự động xóa các hình ảnhcũ có dùng plot. Đôi khi có thể tận dụng điều này thay vì phải mất côngthêm vào dòng delete. Nhưng khi đó ta sẽ mất đi hình ảnh đoạn thẳng, 2điểm đầu mút.

Hình 2.3: Hình ảnh thu được khi không có delete và hold on

Tất nhiên ta vẫn có thể khắc phục được bằng cách vẽ lại đường thẳngngay tại mỗi lần dùng plot trong vòng lặp, chỉ cần

for i = 1:length(t)

h = plot(x(i),0,’o’,’MarkerSize’,20,’MarkerFaceColor’,’b’);

line([0 2] ,[0 0],’color’,’black’)

drawnow

delete(h)

end

Nhưng như thế tất nhiên sẽ làm cho máy chạy nặng hơn, đôi khi hình vẽhiển thị chậm hơn.

Ta tính đến phương pháp khác, cũng dùng ý tưởng vẽ và xóa, nhưngthay vì delete, ta có thể

Tô màu nó bằng màu nền – coi như đã xóa Ta sẽ tô màu đốitượng bằng màu nền (ở đây ta do nền mặc định là màu trằng) sau mỗi lầndrawnow

Page 23: Annimation in Matlab

CHƯƠNG 2. VẼ HÌNH ĐỘNG TRONG MATLAB 23

for i = 1:length(t)

h = plot(x(i),0,’o’,’MarkerSize’,20,’MarkerFaceColor’,’b’)

drawnow

set(h,’color’,’white’,’MarkerFaceColor’,’white’)

line([0 2] ,[0 0],’color’,’black’)

end

Thay đổi tọa độ của đối tượng ta vẽ nó lần thứ nhất, rồi dùngvòng lặp thay đổi tọa độ của nó, tạo ra sự di chuyển. Với cách này ta khôngcần dùng delete hay tô màu nền gì cả, ta chỉ thay đổi tọa độ của nó (ởđây là tịnh tiến).

Code 2.

% Tạo dữ liệu

t = 0:0.001:1; % Dữ liệu về tời gian

x = 2*t; % Dữ liệu về vị trí

% Vẽ hình

figure(1); % Chỉ định cửa sổ đồ họa để vẽ

set(gca,’NextPlot’,’replacechildren’) %%(1)

set(gcf,’Renderer’,’OpenGL’); %%(2)

hold on

plot(0,0,’o’,’Markersize’,5,’MarkerFacecolor’,’black’) % Điểm A

plot(2,0,’o’,’Markersize’,5,’MarkerFacecolor’,’black’) % Điểm B

%%% Vẽ lần thứ nhất

h = plot(x(1),0,’o’,’MarkerSize’,20,’MarkerFaceColor’,’b’);

set(h,’EraseMode’,’normal’); % Chọn Erase Mode (*)

axis([-0.5 2.5 -1 1]) % Giới hạn trục tọa độ

line([0 2] ,[0 0],’color’,’black’) % Vẽ đoạn thẳng AB

% Bắt đầu vẽ bằng vòng lặp

for i = 1:length(t)

set(h,’XData’,x(i)) % Thay đổi tọa độ

drawnow

delete(h) % Xóa

end

hold off

Trong (*), Erase Mode ở đây có tác dụng như tạo ra sự mượt mà hơn,

tùy thuộc vào mỗi kểu xóa. Ở ví dụ này đơn giản nên bỏ qua cũng khôngảnh hưởng gì nhiều, nếu ta thay bằng ’background’ hoặc ’xor’, sẽ thấy sựkhác biệt do nó xóa luôn đường thẳng AB, với ’none’ thì nó sẽ cho ra kết

Page 24: Annimation in Matlab

CHƯƠNG 2. VẼ HÌNH ĐỘNG TRONG MATLAB 24

quả y như hình 2.2, được một vệt dài vì giống như khi bật hold on, ’none’chỉ định MATLAB không xóa đối tượng khi nó duy chuyển.

Còn chung quy, đoạn code trên cho ta rất quả rất mượt, khá gần vớinhững gì thu được từ code 1. (Hình 2.1)

Các ví dụ tiếp theo dựa trên nguyên lý này được trình bày trong chương3, ta sẽ thường xuyên sử dụng 2 lệnh sau (có thể với giá trị ’PropertyValue’khác) để tăng sự mượt mà cho chuyển động

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’OpenGL’);

Page 25: Annimation in Matlab

CHƯƠNG 2. VẼ HÌNH ĐỘNG TRONG MATLAB 25

2.2 Phương pháp thứ hai

Trong phần này, ta nói đến cách vẽ thứ nhất để tạo ra các hình động.Phương pháp này dựa trên nguyên tắc tạo và lưu nhiều hình (frame) củamột movie, sau đó lần lượt hiển thị chúng trên cửa sổ hình ảnh với một sựkiểm soát thời gian và fps sao cho hình ảnh được mượt mà, hay gãy tùythuộc vào mục đích yêu cầu.

Nhận xét Phương pháp này sẽ tỏ ra hiệu quả và tốt hơn phương phápthứ nhất khi ta gặp tình huống mỗi khung hình là khá phức tạp và khôngthể vẽ lại được một cách nhanh chóng. Tại mỗi bước, ta tạo ra các khunghình (frame) trước, do đó thời gian vẽ một khung hình không ảnh hưởnggì đến đoạn movie của ta. Movie tạo ra không được trình chiếu theo gianthực, nó chỉ đơn giản là một phát lại các khung hình đã lưu trước đó theothứ tự.

2.2.1 Nguyên lý của phương pháp

Trên lý thuyết ta thực hiện hình chuyển động qua 3 bước:

1) Tạo trước một không gian (có sự ước lượng về độ dài đoạn movie) đểchỉ định computer dành một bộ nhớ nhất định cho đoạn movie đượcsinh ra. Với movie được tạo từ các khung hình (frame), ta dùng hàmmoviein để dành bộ nhớ lưu một ma trận đủ lớn nhằm lưu các khunghình. Nhưng thực tế ta chỉ cần tạo một ma trận là đủ. 3

2) Tạo các khung hình. Ta sẽ dùng hàm getframe để tạo các khung hình.Chi tiết về getframe xem 1.4

3) Dùng hàm movie để hiển thị các khung hình.

Nhận xét Về cơ bản, khi sử dụng phương pháp thứ nhất, ta cũng có thểcho vào movie như phương pháp thứ hai nếu tại mỗi lần redraw trong vònglặp, ta dùng getframe. Nhưng điểm khác biệt lớn nhất của giữa hai phươngpháp chính là nếu làm theo kiểu thứ nhất thì

• drawnow không còn cần thiết với cách thứ 2 vì getframe đã lấy đượckhung hình mà không cần vẽ lên màn hình

3Chi tiết về moviein xem 1.6. Có thể bỏ luôn moviein

Page 26: Annimation in Matlab

CHƯƠNG 2. VẼ HÌNH ĐỘNG TRONG MATLAB 26

• Khi các hình vẽ khá phức tạp và việc vẽ lại ngay tức thời gặp nhiềukhó khăn, phương pháp thứ nhất sẽ bộc lộ yếu điểm khi việc cập nhậtlên màn hình (drawnow) rất chậm, gây giật.

• Trên lý thuyết của phương pháp thì các lệnh

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’PropertyValue’)

để làm mượt mà có thể không cần trong một số trường hợp4. Tuy nhiênvẫn còn rất cần thiết khi giữ lại set(gca,’NextPlot’,’replacechildren’)trong một số trường hợp để tránh thay đổi trục tọa độ liên tục. Hơnnữa từ thực hành cho thấy khi dùng set(gcf,’Renderer’,’zbuffer’)cho đoạn movie có chất lượng khá tốt.

Trong cách thứ hai ta có thể điều khiển số khung hình để điều khiển tốc độdễ dàng hơn. Và quan trọng nhất, cách thứ hai cho phép ta lưu ảnh độngthành dạng file .gif hoặc thành movie .avi. Chi tiết hơn được trình bàytrong chương 4

2.2.2 Ví dụ minh họa

Bất kì một hình động nào được thực hiện theo phương pháp trước đều cóthể thực hiện lại theo cách này, dưới đây ta sẽ thực hiện một ví dụ về môhình chiếc xe để so sánh với phương pháp thứ nhất.

Thực hiện các bước tương tự, chỉ có thay đổi ở một vài chỗ, đặc biệt nếu ởđây như đã nói ở trên, việc dùng set(gcf,’Renderer’,’OpenGL’) gây ralỗi không sử dụng lại được đoạn movie.

Kiểm tra 4 thuộc tính [ {painters} | zbuffer | OpenGL | None ] của’Property’ ’Renderer’ chỉ có painters và zbuffer là sử dụng được. Lý dotại sao như vậy thì có lẽ cần phải biết thật rõ cấu trúc bên trong của các’Property’ ’Renderer’ này, điều này nằm ngoài khuôn khổ báo cáo. 5

4Đôi khi còn phản tác dụng.5OpenGL là một thư viện đồ họa được phát triển để hỗ trợ lập trình đồ họa, giao

diện độc lập với phần cứng khá nổi tiếng theo chuẩn công nghiệp hỗ trợ đồ họa 3D củahãng Silicon Graphic, Inc. http://en.wikipedia.org/wiki/OpenGL

Page 27: Annimation in Matlab

CHƯƠNG 2. VẼ HÌNH ĐỘNG TRONG MATLAB 27

Tổng kết Khi làm ảnh động với phương pháp dùng drawnow thuần túy,không có movie thì dùng kết hợp ’OpenGL’ là phương án cho kết quả rấtđẹp. Còn nếu dùng movie thì không dùng được ’OpenGL’

Code 3.

clear all

% Tạo dữ liệu

t = 0:0.01:1; % Dữ liệu về tời gian

x = 2*t; % Dữ liệu về vị trí

% Vẽ hình

figure(1); % Chỉ định cửa sổ đồ họa để vẽ

set(gca,’NextPlot’,’replacechildren’) %%(1)

set(gcf,’Renderer’,’zbuffer’); %%(2)

hold on

plot(0,0,’o’,’Markersize’,5,’MarkerFacecolor’,’black’) % Điểm A

plot(2,0,’o’,’Markersize’,5,’MarkerFacecolor’,’black’) % Điểm B

axis([-0.5 2.5 -1 1]) % Giới hạn trục tọa độ

line([0 2] ,[0 0],’color’,’black’) % Vẽ đoạn thẳng AB

% Bắt đầu vẽ bằng vòng lặp

lap = 1;

for i = 1:length(t)

h = plot(x(i),0,’o’,’MarkerSize’,20,’MarkerFaceColor’,’b’);

M(lap) = getframe; % Lấy khung hình

lap = lap+1;

delete(h) % Xóa

end

hold off

movie(M,2); % Play movie 2 lần

Trong dòng lệnh trên, dùng phương pháp movie ta có thể điều khiểnnhanh chậm của đoạn movie, với một tốc độ rùa bò hay chóng mặt màchẳng cần chỉnh sửa gì tới việc phân hoạch AB như cách 1, tức không cầncan thiệp vào bộ dữ liệu, điều này rất tiện lợi khi mà chia nhỏ bộ dữ liệuthì máy càng chạy chậm, do khối lượng tính toán càng nhiều.Sử dụng lệnh

movie(M,n,fps) %% Ví dụ movie(M,2,30)

Page 28: Annimation in Matlab

CHƯƠNG 2. VẼ HÌNH ĐỘNG TRONG MATLAB 28

sẽ cho ta điều khiển tốc độ khung hình trên một giây, ờ trên ta chọn 30frame/s, tốc độ khá mượt. Nhưng chú ý như đã nói trong phần 1.5, khảnăng của máy tính là có hạn nên không phải cứ tăng càng nhiều fps là càngnhanh, có một lúc tới ngưỡng thì có tăng tốc độ vẫn không lên được.

Một chú ý khác là sau mỗi lần chạy, nếu ta sửa code thì chú ý clear all,vì nếu không những lần chạy sau dễ cho kết quả giật và sai do ảnh hưởngtừ movie trước chồng lên (depend).

Page 29: Annimation in Matlab

Chương 3

Các ví dụ dùng vẽ hình động

Trong chương này ta sẽ trình bày một số ví dụ áp dụng 2 cách trong chương2. Một cách rất đơn giản để tạo ra các hình động theo kiểu quay, đó chínhlà áp dụng phương trình tọa độ của phép quay, xem 3.9, hoặc có thể làmthủ công theo tư tưởng tọa độ cực (xem 3.1 hoặc 3.8). Ta lần lượt xem cácví dụ.

3.1 Đường tròn với kim đồng hồ

Dùng phương pháp vẽ và xóa. Ta sẽ vẽ một đường tròn, với một đường kínhquay xung quanh tâm 2 vòng.

Ý tưởng rất đơn giản, ta sẽ sử dụng tọa độcực để biểu thị đường kính, và như vậy khithay đổi tọa độ (cực) theo biến θ chạy mộtlượng nhỏ từ 0 −→ 2π ta thu được đườngkính xoay quanh tâm của đường tròn.

Như vậy, công việc đầu tiên ta sẽ vẽ vòng tròn, kế đến là tham số hóatheo tọa độ cực một đường kính và cuối cùng dùng vòng lặp để thay đổithành phần θ đồng thời vẽ nó lại và xóa nó trước khi sang bước lặp kế tiếp.của đường kính để tạo ra sự chuyển động.

Code dưới đây ta vẽ vòng tròn lớn hơn một chút so với đường kính, tựanhư một chiếc đồng hồ. Và có sử dụng các lệnh set để tạo sự mượt mà hơncho chuyển động.

29

Page 30: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 30

Code 3

r = 0:0.01:2; % rời rạc bán kính

t = 0:pi/200:2*pi; % rời rạc góc theta

[r,t] = meshgrid(r,t); % tăng thêm độ dài, mịn hơn

x = 2.03*cos(t);

y = 2.03*sin(t);

h = plot(x,y,’LineWidth’,2,’color’,’black’); vẽ đường tròn

axis equal

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’OpenGL’);

set(gca,’ytick’,[]) % Xóa trục Oy

set(gca,’xtick’,[]) % Xóa trục Ox

theta = 0:pi/50:2*pi; % Lập góc quay

n = length(theta)

for i= 1:n

g = line([2*cos(theta(i)+pi) 2*cos(theta(i))],...

[2*sin(theta(i)+pi) 2*sin(theta(i))],...

’color’,’r’,’LineWidth’,3);

drawnow

pause(0.001) % giảm tốc độ quay lại

if i<=n-1 % giữ lại đường kính khi quay xong

delete(g) % có thể thay bằng set(g,’color’,’white’)

end

end

Ta hoàn toàn có thể bỏ đi [r,t] = meshgrid(r,t) nhưng khi đó sẽ phảităng độ chia lên thật lớn. Khi ta chọn màn hình nền màu trắng (hoặc đểmặc định thì có thể thay vì delete(g), ta dùng set(g,’color’,’white’)

như đã nói ở trên. Do ở trên ta dùng delete(g) sau mỗi lần drawnow nênđể khi quá trình quay kết thúc vẫn còn lại đường kính, thì tại i = n tứctheta = 2π ta không được xóa delete(g), đó chính là nguyên nhân xuấthiện của dòng if i<= n-1 ở trên. Nếu không có thì sau khi quá trình quaykết thúc, ta chỉ còn mỗi cái đường tròn.

Page 31: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 31

Trong dòng có lệnh line trong code trên, ta có thể sửa lại thành chỉvẽ bán kính, khi đó trong khá giống với cái đồng hồ, phối hợp thêm lệnhpause để tạo ra sự chuyển động như một đồng hồ với kim giây. Chỉ cần sửalại chều quay và độ chia của theta, có thể tăng hoặc giảm pause sao chophù hợp

Code 4 (Mô phỏng đồng hồ đơn giản).

r = 0:0.01:2;

t = 0:pi/200:2*pi;

[r,t] = meshgrid(r,t);

x = 2.03*cos(t);

y = 2.03*sin(t);

h = plot(x,y,’LineWidth’,2,’color’,’black’);

axis equal

%set(gcf,’DithermapMode’,’manual’)

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’OpenGL’);

%%% Ve lan thu nhat

set(gca,’ytick’,[])

set(gca,’xtick’,[])

theta = pi/2:-pi/60:-2* pi + pi/2;

n = length(theta)

for i= 1:n

g = line([0 2*cos(theta(i))],...

[0 2*sin(theta(i))],’color’,’r’,’LineWidth’,3);

drawnow

pause(0.4)

if i<=n-1

delete(g)

end

end

Page 32: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 32

3.2 Một chuyển động đơn giản

Trong ví dụ này, ta sẽ thiết lập một hình động về một vật tròn chuyển độngtrên một đường cong 2D, và thay đổi bán kinh cùng với quá trình chuyểnđộng. Cụ thể ta chọn quỹ đạo chuyển động là đồ thì y = cosx, với đườngtròn có tâm di chuyển trên đồ thị này và bán kính lần lượt thay đổi

Code 5 (Cách thứ nhất).

clear all

clc

syms X Y t

dx = pi/50

x = -pi:dx:2*pi;

n = length(x);

x1 = -pi:dx:pi;

m = length(x1);

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’OpenGL’); %%%% Sửa %%%%

axis([-4 8 -2 2])

hold on

k = plot(x,cos(x),’black’,’LineWidth’,2);

y = cos(x);

r = 0.3:-0.3/(m-1):0;

for i = 1:n-m+1

r(m+i) = r(m-i);

end

for i=1:length(x)

h = ezplot((X-x(i))^2 + (Y - y(i))^2 - r(i));

g = plot(x(i),cos(x(i)),’o’,’color’,’black’,...

’MarkerFacecolor’,’black’);

set(h,’color’,’r’,’LineWidth’,2)

drawnow

if i <= length(x) - 1

delete(h)

delete(g)

end

end

hold off

Page 33: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 33

Hình 3.1: Hình ảnh động thu được

Khi ta thay delete bằng cách đổi màu thành màu nền (trắng) thì sẽxảy ra hiện tượng đường y = cosx bị tô màu trắng tại mỗi khi biên đườngtròn đi qua. Nên phải vẽ lại sau đó ngay trong vòng lặp, dĩ nhiên sẽ tốn bộnhớ hơn. Hoặc khi đó không cần vẽ lại, thì tâm của đường tròn cũng tạora một đường y = cosx với ’Marker’ dạng ’o’

Hình 3.2: Khi không có delete mà thay bằng tô màu

Và nếu không có cả delete và tô màu nền (bật hold on)

Hình 3.3: Bật hold on và không xóa

Page 34: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 34

Cuối cùng, để thiết lập lại theo cách thứ hai, ta chỉ cần sửa vài chỗ

Code 6 (Cách thứ 2).

clear all

clc

syms X Y t

dx = pi/50

x = -pi:dx:2*pi;

n = length(x);

x1 = -pi:dx:pi;

m = length(x1);

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’zbuffer’); %%%% Sửa %%%%

axis([-4 8 -2 2])

hold on

k = plot(x,cos(x),’black’,’LineWidth’,2);

y = cos(x);

r = 0.3:-0.3/(m-1):0;

for i = 1:n-m+1

r(m+i) = r(m-i);

end

for i=1:length(x)

h = ezplot((X-x(i))^2 + (Y - y(i))^2 - r(i));

g = plot(x(i),cos(x(i)),’o’,’color’,’black’,...

’MarkerFacecolor’,’black’);

set(h,’color’,’b’,’LineWidth’,2)

M(i) = getframe;

% if i <= length(x) - 1

% delete(h)

% delete(g)

% end

end

hold off

movie(M,2,24)

Sau đó dùng movie(M,2,24) hoặc movie(M,2,30) cho hình ảnh khámượt.

Page 35: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 35

3.3 Mặt astroid quay trong không gian 3

chiều

Đường cong hình sao (astroid) là đường cong có phương trình xác định bởi

x23 + y

23 = 2

23

Để dựng đứng nó vào không gian 3 chiều, ta tham số hóa lại thành

y23 + z

23 = 2

23 , x = 0

t = 0:pi/100:2*pi;

n = length(t);

x = 2.*cos(t).^3;

y = 2*sin(t).^3;

plot(x,y,’black’)

grid on

fill(x,y,’b’)

t = 0:pi/100:2*pi;

n = length(t);

y = 2.*cos(t).^3;

x = 0.*y;

z = 2*sin(t).^3;

hold on

plot3(x,y,z,’black’)

fill3(x,y,z,’b’)

grid on

%% Vẽ mặt z = 0

[X,Y] = meshgrid(-2:0.2:2);

Z = 0*X + 0*Y;

plot3(X,Y,Z,’black’)

[M,N] = meshgrid(2:-0.2:-2);

P = 0*M + 0*N;

plot3(N,M,P,’black’)

hold off

Page 36: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 36

Ý tưởng của ta là làm hình này chuyển động quay 360◦ theo trục Oz,với cách nhìn đó, ta dùng tọa độ cực thì việc diễn ta sử quay rất dễ dàngvới tham số θ. Như vậy cách vẽ astroid3D nói trên là không dùng được, sửdụng ý tưởng từ bài toán mô phỏng đồng hồ, ta chỉ việc hình dung nhưmột đoạn thẳng d trong mặt phẳng xOy, quay quanh trục Oz, với mỗi vịtrí của d, ta vẽ mặt astroid trên đoạn thẳng đó, thì khi cho θ biến thiên từ0 −→ 2π, đoạn thẳng d quay kéo theo mặt quay. Đây cũng là ý tưởng cơbản và chung nhất cho các bài toán biểu diễn hình quay.

Để tiện lợi hơn, ta sẽ viết một hàm astroidpolar(theta) có đối sốchính là góc θ hợp bởi đường d (giao mặt phẳng z = 0 và mặt astroid).Hàm này sẽ vẽ mặt astroid xoay một góc θ so với mặt phẳng x = 0

Code 7 (function astroidpolar(theta)).

function astroidpolar(theta)

r = -2:0.001:2;

x = r.*cos(theta); % Vẽ đoạn thẳng [-2, 2] theo góc theta

y = r.*sin(theta);

z = ((2^(2/3) - (r.^2).^(1/3)).^3).^(1/2); % Vẽ phần z > 0

n = length(r);

for i = 1:n-1

x(n+i) = x(n-i);

y(n+i) = y(n-i);

z(n+i) = -z(n-i); % Vẽ phần z < 0

end

plot3(x,y,z,’black’)

grid on

fill3(x,y,z,’b’)

axis([-2 2 -2 2 -2 2])

Và giờ ta chỉ cần cho θ biến thiên, ta có đoạn code

Code 8 (Quay astroid).

Page 37: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 37

theta = 0:pi/50:2*pi;

k = cos(phi);

n = length(k);

set(gca, ’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’OpenGL’);

axis([-2 2 -2 2 -2 2])

zlabel(’Oz’)

ylabel(’Oy’)

xlabel(’Ox’)

lap = 1;

set(gca,’PlotBoxAspectRatio’,[1 1 1])

for i = 1:n

astroidpolar((theta(i)))

grid on

view(3)

drawnow

end

Và ta thu được dãy các hình ảnh

Hình 3.4: Mặt astroid quay

Để dùng movie, ta sửa vài chỗ nhỏ

Code 9 (Quay astroid với movie).

Page 38: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 38

theta = 0:pi/50:2*pi;

k = cos(theta);

n = length(k);

set(gca, ’NextPlot’, ’replacechildren’)

set(gcf,’Renderer’,’painters’);%%% zbuffer không tốt với TH này

axis([-2 2 -2 2 -2 2])

zlabel(’Oz’)

ylabel(’Oy’)

xlabel(’Ox’)

lap = 1;

set(gca,’PlotBoxAspectRatio’,[1 1 1])

for i = 1:n

phitieupolar((theta(i)))

grid on

view(3)

M(lap) = getframe;

lap = lap + 1;

end

movie(M,3,24)

Khi này chất lượng đoạn movie khá cao, rất mượt với fps = 24, có thểtăng thêm thành 30 càng mượt hơn. Lưu ý như đã nói ở phần nguyên lý,’PropertyValue’ ’OpenGL’ không hoạt động tốt với movie, chỉ có painters

và zbuffer hoạt động, thử chọn từng thuộc tính để cho kết quả tốt nhất.

Mở rộng Khi ta thêm vào hàm astroidpolar(theta) đoạn code vẽ mặtphẳng z = 0

%% Vẽ mặt z = 0

[X,Y] = meshgrid(-2:0.2:2);

Z = 0*X + 0*Y;

plot3(X,Y,Z,’black’)

[M,N] = meshgrid(2:-0.2:-2);

P = 0*M + 0*N;

plot3(N,M,P,’black’)

thì khi vẽ với drawnow, nếu không dùng ’OpenGL’ thì tốc độ quay là cựckỳ chậm, thật chí giật. Nhưng nếu bỏ ’OpenGL’ vào thì không dùng đượcmovie. Tạm chấp nhận giải pháp dùng ’painters’ hoặc ’zbuffer’, vơi tốc độlần quay đầu tiên là khá chậm, nhưng sau đó dùng movie với tùy chỉnh fps

Page 39: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 39

cho chất lượng khá ổn. Điều này cũng xảy ra khi ta bật hold on, cho thấyvới các hình vẽ phức tạp, tốn nhiều bộ nhớ thì dùng drawnow không phảilà một giải pháp tốt.

Code 10 (Hàm astroidpolar2 có mặt phẳng z = 0).

function astroidpolar2(theta)

r = -2:0.001:2;

x = r.*cos(theta);

y = r.*sin(theta);

z = ((2^(2/3) - (r.^2).^(1/3)).^3).^(1/2);

n = length(r);

for i = 1:n-1

x(n+i) = x(n-i);

y(n+i) = y(n-i);

z(n+i) = -z(n-i);

end

plot3(x,y,z,’black’)

grid on

fill3(x,y,z,’b’)

axis([-2 2 -2 2 -2 2])

%%%%% Ve mat phang z = 0 %%%%%%

hold on

[X,Y] = meshgrid(-2:0.2:2);

Z = 0*X + 0*Y;

plot3(X,Y,Z,’black’)

[M,N] = meshgrid(2:-0.2:-2);

P = 0*M + 0*N;

plot3(N,M,P,’black’)

hold off

Code 11 (astroid3D quay có thêm mặt phẳng z = 0).

Page 40: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 40

theta = 0:pi/50:2*pi;

k = cos(theta);

n = length(k);

set(gca, ’NextPlot’, ’replacechildren’)

set(gcf,’Renderer’,’OpenGL’);

axis([-2 2 -2 2 -2 2])

lap = 1;

for i = 1:n

phitieupolar((theta(i)))

grid on

view(3)

drawnow

end

Hình 3.5: Mặt astroid quay có mặt phẳng z = 0

3.4 Các phương trình sóng

Trong ví dụ này, ta sẽ vẽ phương trình sóng đơn giản có dạng

Hình 3.6: Sóng đơn giản

Page 41: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 41

Để vẽ được, ta coi đây là đồ thị của hàm y theo biến thời gian t. Tạimỗi thời điểm, ta cần biết tọa độ của đỉnh sóng, cũng như xác định từ đầukhảng cách giữa 2 chân sóng. Tham số hóa chúng bằng tọa độ, cụ thể xéttrên trục tọa độ Ox ta đặt như sau

3.4.1 Vẽ với hàm sin

Hình 3.7: Một frame của sóng

Trên đoạn [c−d, c+d] ta cần vẽ một nhịp sóng, còn lại nằm ngoài đoạnnày thì tung độ y bằng 0. Nhịp sóng trên đoạn [c− d, c+ d] này là ảnh củamột hàm dạng sin hoặc để giống hơn, dùng dạng hàm gauss. Như vậy cầncó một song ánh từ [0, π] vào [c − d, c + d] nếu như dùng hàm sin do mộtnhịp sóng như trên có dạng tựa đồ thị hàm sin trên [0, π]

Chọn hàm y với y = sin(t−c+d2d

π), khi x ∈ [c− d, c+ d] ta có được y có

dạng nhịp sóng như trên khi x ∈ [c− d, c+ d], vấn đề tếp theo là xử lý cácđoạn ở ngoài.

Hình 3.8: Ảnh một nhịp sóng trên [c− d, c+ d]

Page 42: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 42

Phân tích Ta sẽ vẽ sóng trên đoạn [0,1]. Như vậy 0 và 1 là hai đầu mútcủa sóng. Với một giá trị c trong [0,1], ta sẽ vẽ được một frame có dạngnhư một nhịp sóng hình 3.9.Khi đó frame đó là đồ thị {t, y(t)} với t = 0→ 1.Khi c chạm tới đầu mút 1 thì dội lại và hiển thị ở phần âm. Khi này tatưởng tượng như c biến thiên từ 1 → 0, và tất nhiên, t cũng biến thiên từ1→ 0 (chuyển động ngược)

Từ đó, code cơ bản nhất của hình vẽ được xây dựng như sau (ta sẽ tiếptục chỉnh sửa cho hoàn thiện)

Code 12 (Code demo).

clear all

axis([0 1 -1 1])

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’zbuffer’);

clear all

dt = 0.001;

d = 0.1;

g = @(t,c,d) ((t>=c-d) & (t<=c+d)) & (c-d >= 0) & (c+d <= 1);

f = @(t,c,d) g(t,c,d).*sin((t - c+d)./(2*d)*pi);

t1 = 0:dt:1;

lap = 1;

for c = 0:0.02:1

y = f(t1,c,d);

plot(t1,y,’LineWidth’,2)

pause(0.05);

M(lap) = getframe;

lap = lap + 1;

end

t2 = 1:-dt:0;

for c = 1:-0.02:0

y = -f(t2,c,d);

plot(t2,y,’LineWidth’,2)

pause(0.05);

M(lap) = getframe;

lap = lap + 1;

end

movie(M,2,30)

Page 43: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 43

Hình 3.9: Ảnh từ code 12

Nhận xét rằng code trên tạo ra hình vẽ thiếu mất phần phản xạ tại haimút. Ta sẽ sửa lại code trên

1. Thay vì chạy 2 vòng lặp, ta cho luôn c bến thiên từ 0 đến 2, và lậptrình lại để khi c trong [0, 1] thì chỉ có phần dương được vẽ, phần âmf(t2,c,d) = 0. Và hơn nữa dù c chạy trên (1,2) nhưng khi xử lý vẫnđưa được về c ∈ [0, 1] do ta chọn vẽ sóng trên [0,1]. Thay vì chạy 2vòng lặp với 2 bộ giá trị y1 = f(t1),y2 = f(t2), ta vẽ chúng ngaytrong một vòng lặp với y = y1 + y2, với cài đặt sao cho y1 > 0 vày2 < 0 Khi đó cần thay đổi t chạy trong [0,2] và xác định thêm hàm

k = @(t) -(t~=1).*(t~=0).*(t~=2).*(2*(t>1)-1);

Ý nghĩa hàm này là tại t = 0,1,2 thì k(t) = 0, ngoài ra trên (0, 1)thì k(t) = 1 , trên [1, 2] thì k(t) = −1 để làm y2 âm.

2. Sửa lại hàm g trong code 12, để tận dụng được khi c gần 2 mút, thìgiá trị của hàm trên phần dương và phần âm cộng lại với nhau sẽ triệttiêu dần dần, chứ không bằng 0 đột ngột, tạo nên hiệu ứng phản xạ.

g = @(t,c,d) abs(mod(t-c,2)-1) >= (1-d)

Trên cơ sở đó, ta có code hoàn chỉnh sau đây

Code 13 (Code Final).

Page 44: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 44

clear all

axis([0 1 -1 1])

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’zbuffer’);

clear all

dt = 0.001;

d = 0.1;

k = @(t) -(t~=1).*(t~=0).*(t~=2).*(2*(t>1)-1);

h = @(t) (mod(t,2)<=1).*mod(t,2) + (mod(t,2)>1).*(mod(t,2)-2);

% Khi 0<t<1 thì h = t, Khi 1 < t < 2 thì h = t-2

% Hàm này dùng để chuyển về (0,1) khi c, t chạy trên (1,2)

g = @(t,c,d) abs(mod(t-c,2)-1) >= (1-d)

f = @(t,c,d) k(t).*g(t,c,d).*sin(h(t - c+d)./(2*d)*pi);

t1 = 0:dt:1; t2 = 2:-dt:1;

lap = 1;

for c = 0:0.02:2

y = f(t1,c,d) + f(t2,c,d);

plot(t1,y,’LineWidth’,2)

pause(0.05);

M(lap) = getframe;

lap = lap + 1;

end

movie(M,2,30)

Và ta thu được dạng són sin có hiệu ứng phản xạ

Hình 3.10: Ảnh từ code 13

Page 45: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 45

3.4.2 Vẽ với hàm gauss

Thực hiện một cách tương tự, ta chỉ thay bằng hàm gauss và chú ý khi nàyhàm gauss đã mang luôn thông số xác định c, d như trên, ta bỏ đi hàm g.

Công thức của hàm Gauss

f = e−K(x−S)2

Sửa lại theo đoạn [0,1] với các giá trị c, d ta có

Code 14 (Gauss).

clear all

axis([0 1 -1 1])

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’zbuffer’);

clear all

dt = 0.001;

d = 0.1;

k = @(t) -(t~=1).*(t~=0).*(t~=2).*(2*(t>1)-1);

h = @(t) (mod(t,2)<=1).*mod(t,2) + (mod(t,2)>1).*(mod(t,2)-2);

% Khi 0<t<1 thì h = t, Khi 1 < t < 2 thì h = t-2

% Hàm này dùng để chuyển về (0,1) khi c, t chạy trên (1,2)

g = @(t,c,d) abs(mod(t-c,2)-1) >= (1-d)

f = @(t,c,d) k(t).*exp( -h(t-c).^2/(2*d^2) );

t1 = 0:dt:1; t2 = 2:-dt:1;

lap = 1;

for c = 0:0.02:2

y = f(t1,c,d) + f(t2,c,d);

plot(t1,y,’LineWidth’,2)

pause(0.05);

M(lap) = getframe;

lap = lap + 1;

end

movie(M,2,30)

Page 46: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 46

3.4.3 Mở rộng sóng gauss

Mở rộng từ dạng sóng gauss nói trên, ta có thể thêm vào một sóng nữalệnh pha so với sóng ban đầu

Hình 3.11: Do động của 2 sóng lệch 0.5 (code 15)

Code 15 (Hai sóng Gauss lệnh 0.5).

clear all

set(gca,’NextPlot’,’replacechildren’);

set(gcf,’Renderer’,’zbuffer’);

axis([0 1 -2 2])

dt = 0.01;

d = 0.1;

k = @(t) -(t~=1).*(t~=0).*(t~=2).*(2*(t>1)-1);

g = @(t,c,d) ((t>=c-d) & (t<=c+d));

h = @(t) (mod(t,2)<=1).*mod(t,2) + (mod(t,2)>1).*(mod(t,2)-2);

f = @(t,c,d) k(t).*exp( -h(t-c).^2/(2*d^2) );

f2 = @(t,c,d) k(t).*exp( -h(t-c - 0.5).^2/(2*d^2) );

t1 = 0:dt:1; t2 = 2:-dt:1;

lap = 1;

hold on

for c = 0:0.02:2

y = f(t1,c,d)+f(t2,c,d);

y2 = f2(t1,c,d)+f2(t2,c,d);

a = plot(t1,y,’r’,’LineWidth’,2)

b = plot(t1,y2,’b’,’LineWidth’,2);

drawnow

pause(0.05);

M(lap) = getframe;

Page 47: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 47

if c < 2

delete(a);

delete(b);

end

lap = lap + 1;

end

hold off

movie(M,1,12)

Hoặc chọn độ lệnh của 2 sóng ít hơn, ta sẽ có được các dạng sóng nhưý muốn

Hình 3.12: Do động của 2 sóng với độ lệch 0.1

Page 48: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 48

3.4.4 Một ví dụ khác về phương trình sóng

Ta sẽ thực hiện mô phỏng dạng sóng hay gặp trong các máy đo tín hiệu.Xét hàm y = f(x) = x cosx, có đồ thị được cho bên dưới

−10 −8 −6 −4 −2 2 4 6 8

−10

−8

−6

−4

−2

2

4

6

8

0

Hình 3.13: Đồ thị hàm y = x cosx

Từ đồ thị này, ta thấy chỉ cần thay đổi x một lượng nhỏ và giới hạnx > 0, thì sẽ tạo ra những đường chuyển động nhỏ dần từ phải về trái(ngược chiều trục Ox). Từ đó dùng phương pháp thứ nhất (hình vẽ nàykhá đơn giản), ta có đoạn code sau

Hình 3.14: Giới hạn x > 0

Page 49: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 49

Code 16.

clear all

set(gca,’NextPlot’,’replacechildren’);

set(gcf,’Renderer’,’zbuffer’);

x = 0:pi/100:8*pi;

lap = 1;

for i=1:200

y=(x).*cos(x+0.1*pi*i);

plot(x,y);

axis([0 25 -25 25]);

%drawnow

pause(0.01);

M(lap) = getframe;

lap = lap + 1;

end

movie(M,2,30)

Dạng sóng thu được có tính tuần hoàn

Hình 3.15: Ảnh từ code 16

Có thể sửa một chút, ta thêm vào một sóng dạng sin nữa

Hình 3.16: Ảnh từ code 17

Page 50: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 50

Khi này ta cần bật hold on và dùng phương pháp vẽ, xóa do có tới 2lệnh plot

Code 17.

clear all

axis([0 25 -25 25]);

set(gca,’NextPlot’,’replacechildren’);

set(gcf,’Renderer’,’zbuffer’);

x = 0:pi/100:8*pi;

lap = 1;

hold on

line([0 25], [0 0],’color’,’black’)

for i=1:200

y = (x).*cos(x+0.1*pi*i);

z = (x).*sin(x+0.1*pi*i);

h = plot(x,y);

g = plot(x,z,’r’);

pause(0.08);

M(lap) = getframe;

delete(h)

delete(g)

lap = lap + 1;

end

hold off

movie(M,2,24)

Page 51: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 51

3.5 Dao động lò xo

Trong ví dụ này, ta sẽ vẽ dao động của một chiếc lò xo treo một vật nặngthẳng đứng.

Từ kết quả lý thuyết vật lý, ta đã biết rằng dao động của lò xo có dạng

x = A sin(ωt+ ϕ)

Trong đó x là tọa độ, t là thời gian.Như vậy, trước hết cho một vật có khối lượng, ta chỉ cần vẽ nó bằng

cách cho thời gian t thay đổi trong phương trình trên, ta sẽ thu được daođộng. Tạm thời xem lò xo như một sợi dây "đàn hồi" được vẽ bằng lệnhline, ta dùng bằng phương pháp vẽ và xóa

Code 18 (Dao động với dây đàn hồi).

x = -pi:pi/100:pi;

n = length(x);

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’OpenGL’);

axis([-4 4 -2 2])

w = 2*pi/3;

for i = 1:1:n

y = 2*sin(w*x(i));

h = plot(0,y,’o’,’Markersize’,20,’MarkerEdgecolor’,...

’black’,’MarkerFacecolor’,’b’);

g = line([0 0],[2 y]); %%% dòng này cần thay

set(g,’LineWidth’,2,’MarkerEdgecolor’,’black’,...

’Markersize’,20,’color’,’black’)

drawnow

if i<=n-1

delete(g)

end

end

Page 52: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 52

Giờ ta chỉ cần vẽ ’lò xo’ nối giữa 2 điểm A,B cho trước, chú ý là số nhịpcủa lò xo phải cố định. Truyền vào n là số nhịp, trước hết ta chia AB ra nđoạn thẳng bằng nhau, rồi ấy trung điểm của đoạn gần A nhất dựng tamgiác vuông cân, lấy đỉnh tam giác này làm gốc nhịp lò xo thứ nhất, lần lượtlấy đối xứng qua các điểm chia ta thu được dạng tựa lò xo.

Code 19 (Hàm mô phỏng lò xo).

function spring = spring(X,Y,n)

% X, Y are two vector, each of them have exactly 2-element

% xA = X(1); yA = Y(1)

% xB = X(2); yB = Y(2)

% in 2D plane

% spring plot a spring from point A(xA,yA) to point B(xB,yB)

% Syntax : spring(xA,xB,yA,yB,n)

% n is the number of spring segment

% Example: Plot a spring from A(0,0) to B(2,2), with n = 8

% spring([0 2],[0 2], 8)

xA = X(1); yA = Y(1);

xB = X(2); yB = Y(2);

dx = (xB - xA)/n;

dy = (yB - yA)/n;

X(1) = xA;

Y(1) = yA;

for i = 2:n+1

X(i) = X(i-1) + dx;

Y(i) = Y(i-1) + dy;

end

P(1) = xA;

Q(1) = yA;

xM = (X(1)+X(2))/2;

yM = (Y(1)+Y(2))/2;

P(2) = xM - dy/(0.2*n);

Q(2) = yM + dx/(0.2*n);

for i = 2:n

P(i+1) = 2*X(i) - P(i);

Q(i+1) = 2*Y(i) - Q(i);

end

P(n+2) = xB;

Q(n+2) = yB;

spring = line(P,Q);

Page 53: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 53

Trên đây ta đã thực hiện nó riêng thành một hàm spring và chỉ cầnthay dòng line trong code 18 thành spring là được.

Code 20 (Dao động lò xo).

x = -pi:pi/100:pi;

n = length(x);

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’OpenGL’);

axis([-4 4 -2 2])

w = 2*pi/3;

for i = 1:1:n

y = 2*sin(w*x(i));

h = plot(0,y,’o’,’Markersize’,20,’MarkerEdgecolor’,...

’black’,’MarkerFacecolor’,’b’);

g = spring([0 0] ,[2 y],10);

set(g,’LineWidth’,2,’MarkerEdgecolor’,’black’,...

’Markersize’,20,’color’,’black’)

drawnow

if i<=n-1

delete(g)

end

end

3.6 Mặt sóng 3D

Trong ví dụ này, ta sẽ vẽ chuyển động dạng lượn sóng của môt mặt trongkhông gian 3 chiều có phương trình có dạng gần gần

z = f(x, y) = cos y + sinx, x, y ∈ [0, 2π]

Tùy chỉnh surf(x,y,z,’LineStyle’,’none’) cho kết quả đẹp mắt hơn

Page 54: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 54

Sử dụng phương pháp thứ nhất với ý tưởng vẽ, xóa, ta sẽ lần lượt vẽ lạimặt z với các giá trị x, y thay đổi nhỏ, đồng thời đưa luôn movie vào

Code 21 (Mặt lượn sóng).

clear all

x = -pi:0.1:pi;

view(3); % chọn góc nhìn 3 chiều

n = length(x);

y = 1:n;

[x,y] = meshgrid(x,y);

Y = y/n*pi;

z = cos(Y) + sin(x);

%h = surf(x,y,z)

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’zbuffer’); %% do dùng movie

hold on

axis([-5 5 0 80 -2 2])

set(gca,’xtick’,[]);

set(gca,’ytick’,[]);

set(gca,’ztick’,[]);

lap = 1;

for j = 1:0.1:10

z = cos(Y+j) + sin(x+j);

h = surf(x,y,z,’LineStyle’, ’none’);

M(lap) = getframe;

lap = lap + 1;

%drawnow %% Nếu dùng theo cách thứ nhất

delete(h);

end

hold off

movie(M,2,30); % chọn fps = 30

Page 55: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 55

Chuyển động thu được rất mượt mà và uyển chuyển, có phần mượt mànhư sóng biển hoặc lá cờ bay trong gió

Hình 3.17: Chuyển động của mặt z

3.7 Mặt besselj

Một ví dụ khác về mặt 3D được tạo bởi hàm besselj có dạng như bônghoa chuyển động

Hình 3.18: Mặt besselj

Page 56: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 56

Code 22 (besselj).

clear all

[x,y] = meshgrid([-10:0.5:10]);

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’zbuffer’);

for j = 1:1:300

z = besselj(0, (j-1)*0.2 + sqrt(x.^2 +y.^2));

surf(x,y,z) % có thể chỉnh LineStyle cho đẹp

drawnow

axis([-10 10 -10 10 -.5 1])

M(j) = getframe;

end

movie(M,2)

3.8 Hình âm dương quay

Trong ví dụ này, ta sẽ thực hiện hình’âm dương’ quay ngược chiều kimđồng hồ. Có thể coi đó là một hìnhtròn tâm O, bán kính 2, và 2 đườngtròn nhỏ hơn bán kính 1 với tâm lầnlượt là (1,0) và (-1,0) đối xứng nhauqua tâm O. Sau đó ta sẽ tô màu chophù hợp để có hình ’âm dương’

Hình âm dương trên đây, khi nối 2 chấm tròn đi ngang qua gốc O và hợpOx một góc θ = 0◦. Sử dụng tọa độ cực, ta sẽ tách ra thành 2 phần, đầutiên là vẽ một hàm myamduong(theta,color) chuyên dùng vẽ một hình âmdương hợp với Ox góc theta, có màu color. Sau đó khi ta cho theta chạytừ 0 đến 2π, lần lượt vẽ bằng cách gọi hàm myamduong(theta,’black’)

tại mỗi thời điểm của theta và xóa nó, ta thu được hình ảnh chuyển độngcủa ’âm dương’ ngược chiều kiem đồng hồ. Tất nhiên cần phải cài đặt hàmsao cho hướng ’âm dương’ là ngược chiều kim đồng hồ.

Page 57: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 57

Code 23 (Hàm myamduong(theta,color)).

function myhand = myamduong(theta,color)

% This function return a ’amduong’ figure has rotate

% an angle ’theta’ by Ox

% Chieu xoay nguoc chieu kim dong ho

% Oriented counter-clockwise

% Cai dat do chia theo t -- goc quay

dt = pi/500;

% Tam duong tron ben phai - mau den

xo = cos(theta);

yo = sin(theta);

% Bat dau qua trinh ve, xay dung cac cung trong

hold on

% Ve nua duong tron theo xo,yo - mau den dinh huong duong

t1 = theta:dt:theta + pi;

X1 = cos(t1) + xo;

Y1 = sin(t1) + yo;

% Ve nua duong tron theo -xo,-yo - mau trang dinh huong am

t2 = theta:-dt:theta - pi;

X2 = cos(t2) - xo;

Y2 = sin(t2) - yo;

% Ve nua duong tron bao ben ngoai phan mau den

t3 = -pi+theta:dt:theta;

X3 = 2*cos(t3);

Y3 = 2*sin(t3);

% Tao bo du lieu X,Y luu cung mau den

X = [X1 X2 X3];

Y = [Y1 Y2 Y3];

% To mau phan mau den

myhand(1) = fill(X,Y,color);

% Ve 2 cham tron (xo,yo) và (-xo,-yo)

myhand(2) = plot(xo,yo,’o’,’MarkerEdgecolor’,’black’,...

’MarkerFacecolor’,’white’,’Markersize’,20);

myhand(3) = plot(-xo,-yo,’o’,’MarkerEdgecolor’,’black’,...

’MarkerFacecolor’,color,’Markersize’,20);

hold off

end

Page 58: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 58

Code 24 (Script file quay ’amduong’).

clear all

qq = figure(1);

set(qq,’color’,’w’)

axis([-2 2 -2 2]);

axis off

set(gca,’PlotBoxAspectRatio’,[1 1 1]);

set(gca,’NextPlot’,’replacechildren’);

set(gcf,’Renderer’,’zbuffer’); %set(gcf,’Renderer’,’OpenGL’);

view(2)

hold on

dt = pi/100;

theta = 0:dt:2*pi;

length_theta = length(theta);

x = 2*cos(theta);

y = 2*sin(theta);

plot(x,y,’k’);

for i = 1:length_theta

h = myamduong(theta(i),’k’);

drawnow

M(i) = getframe;

if i <= length_theta - 1

delete(h)

end

end

hold off

movie(M,10,100)

Page 59: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 59

3.9 Astroid quay trong mặt phẳng 2 chiều

Trong ví dụ này, ta sẽ tiếp nối về mặtastroid trong 3.3. Từ mặt astroid2Dtrong 3.3, giờ ta sẽ quay nó quanhtâm (0,0) bằng cách đơn giản nhất,sử dụng công thức tọa độ của phépquay quanh gốc O(0,0).

Gọi (x, y) là tọa độ của điểm P và (x′, y′) là tọa độ P ′ ảnh của P quaphép quay tâm O góc ϕ, ta có công thức liên hệ sau giữa x, y và x′, y′,với θ là góc hợp bởi vector OP với trục Ox (giống như tọa độ cực), đặtOP = r > 0

θϕ

r

P ′

P

C

D

E F

{x = r cos θ

y = r sin θ{x′ = r cos(θ + ϕ)

y′ = r sin(θ + ϕ){x′ = x cosϕ− y sinϕy′ = x sinϕ+ y cosϕ

Công thức tọa độ của phép quay nói trên cho phép ta đơn giản hóatất cả mọi hình vẽ 2D quay quanh gốc O(0,0). Thật vậy, chỉ cần vẽ tĩnh 1trường hợp của nó, và dùng công thức nói trên, sau đó cho ϕ chạy từ 0 đến2π hoặc nhiều hơn tùy ý, thực hiện vẽ, xóa ta có được chuyển động quaycần tạo. Ta sẽ áp dụng cho hình astroid 2D đưới đây. Trước hết ta thựchiện hàm vẽ một astroid quay một góc θ so với Ox, chú ý ta cần thiệt lậpsao cho hàm trả về các biến handle để quản lý (xóa, tô màu) về sau

Code 25 (astroid2D).

function myhand = astroid2D(theta,color)

hold on

Page 60: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 60

dt = pi/100;

t = theta:dt:2*pi + theta;

x = 2*cos(t).^3;

y = 2*sin(t).^3;

X = x.*cos(theta) - y.*sin(theta);

Y = x.*sin(theta) + y.*cos(theta);

myhand(1) = plot(X,Y,color);

myhand(2) = fill(X,Y,color);

hold off

end

Giờ ta chỉ cần cho gọi hàm astroid2D và tại mỗi thời điểm gọi truyền vàohàm góc khác nhau, có thể tạo thêm hiệu ứng đổi màu cho đẹp nếu muốn

Code 26 (astroid2Dquay).

clear all

axis([-2 2 -2 2]);

set(gca,’xtick’,[]);

set(gca,’ytick’,[]);

set(gca,’PlotBoxAspectRatio’,[1 1 1]);

set(gca,’NextPlot’,’replacechildren’);

%set(gcf,’Renderer’,’zbuffer’);

set(gcf,’Renderer’,’OpenGL’);

dtt = pi/100;

theta = 0:dtt:8*pi;

n = length(theta);

hold on

x = 2*cos(theta); y = 2*sin(theta);

plot(x,y,’ok’);

plot(0,0,’o’,’MarkerFacecolor’,’w’,’MarkerEdgecolor’,’w’)

for i = 1:n

if i <= n/4

color = ’red’;

elseif (n/4 <= i) & i <= n/2

color = ’g’;

elseif n/2 <= i & i <= 3*n/4

color = ’b’;

else

color = ’k’;

end

Page 61: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 61

h = astroid2D(theta(i),color);

drawnow;

%M(i) = getframe;

if i <= n-1

delete(h)

end

end

hold off

%movie(M,2,24)

Code trên dây dùng drawnow, việc sửa lại thành movie chỉ cần bật cácdòng % và xóa dòng ...OpenGL. Ta có chuyển động như hình dưới đây

3.10 Mô phỏng con lắc đơn

Tiếp nối phần con lắc lò xo, ta sẽ mô phỏng chuển động con lắc đơn (treobằng dây không đàn hồi với một vật nặng) Ta cần tạo một chuyển độngđúng theo vật lý, chuyển động này là điều hòa và tắt dần, ta cần cơ sở lýthuyết sau đây

Hình 3.19: Mô hình con lắc đơn

Gọi ω là tốc độ góc, ω =√

glvới g ' π2(m/s2) là gia tốc trọng trường.

l là chiều dài đoạn dây treo con lắc, lấy l = 1(m). Ta xét vị trí của con lắc

Page 62: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 62

tại thời điểm t ứng với góc θ hợp bởi dây treo và phương thẳng đứng, chiềudương về bên tay phải. Khi đó chu kỳ dao động của con lắc là

T =2π

ω(s)

Phương trình dao động của con lắc theo li độ góc θ có dạng1

θ = θ0 cos(ωt)

Trong đó θ0 là biên độ của dao động, chọn θ0 =π

6.

Để chuyển động tắt dần, ta sẽ giảm biên độ dần dần sau mỗi chu kìchuyển động.

Trên cơ sở đó, ta cũng sẽ viết một hàm conlacdon(theta,color) làmnhiệm vụ vẽ con lắc đơn với li độ góc theta và màu color. Sau đó vàoscript file cho theta biến thiên cùng với điều khiển biên độ theo lý thuyếttrên đây ta có được mô phỏng hoàn chỉnh

Code 27 (Hàm conlacdon(theta,color)).

function myhand = conlacdon(theta,color)

% This function return a pendulum with angle

% by vertical is theta

% Ve soi day tu diem (0,0) den chieu dung la (0,-2)

r = 2;

hold on

y = (-1)*abs(2*cos(theta));

if theta >= 0

x = abs(r*sin(theta));

else

x = -abs(r*sin(theta));

end

myhand(1) = line([0,x],[0,y]);

set(myhand(1),’color’,’k’);

myhand(2) = plot(x,y,’o’,’MarkerEdgecolor’,...

color,’MarkerFacecolor’,color,’Markersize’,20);

hold off

end

Code 28 (Mô phỏng con lắc đơn - Script file).

1Đầy đủ là θ = θ0 cos(ωt+ ϕ), nhưng để đơn giản ta cho ϕ = 0 là pha ban đầu

Page 63: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 63

clear all

set(gcf,’color’,’w’)

hold on

axis off % Không hiển thị các trục tọa độ

% Vẽ gốc treo dây

plot(0,0,’o’,’MarkerEdgecolor’,’k’,...

’MarkerFacecolor’,’k’,’Markersize’,10);

k = line([0,0],[-2, 0]);

set(k,’LineStyle’,’--’,’color’,’black’);

axis([-1.5 1.5 -2.5 0.1]);

set(gca,’PlotBoxAspectRatio’,[1 1 1]);

set(gca,’NextPlot’,’replacechildren’);

%set(gcf,’Renderer’,’zbuffer’); % Để làm movie

set(gcf,’Renderer’,’OpenGL’);

dt = pi/50; % Khởi tạo giá trị cho theta

% Chọn theta0 ban đầu = pi/6

% Tốc độ góc w = sqrt(g/l) = pi

% theta = theta0*cos(w*t)

theta0 = pi/6;

w = pi;

% Tính chu kỳ đầu tiên

T = 2*pi/w;

time = 0:dt:T; % Khởi tạo giá trị thời gian theo chu kỳ

%lap = 1;

while theta0 >= 0.01

% Ve chu ki

theta = theta0*cos(w*time);

n = length(theta);

for i = 1:n %%%%%%%%%%%%%%%%%%%%%%

if i<= n-2 %%%%%%%%%%%%%%%%%%%%%%

h = conlacdon(theta(i),’b’);

%M(lap) = getframe;

drawnow

pause(0.05)

delete(h);

%lap = lap + 1; %%%%%%%%%%%%%%%%%%%%%%

end %%%%%%%%%%%%%%%%%%%%%%

end

theta0 = theta0*0.9; % Giảm biên độ

end

% Vẽ con lắc đơn cuối cùng tại ví trí cân bằng

conlacdon(0,’b’);

hold off

% movie(M,2,24)

Page 64: Annimation in Matlab

CHƯƠNG 3. CÁC VÍ DỤ DÙNG VẼ HÌNH ĐỘNG 64

Và mô phỏng nhận được khá tốt

Hình 3.20: Mô phỏng con lắc đơn tắt dần

Ta có thể chỉnh lại code trên để dánh dấu sự giảm dần li độ góc caonhất của con lắc, chỉ cần sửa đoạn ở giữa 2 dòng % . . .% ở trên thành

Code 29 (Lưu hình ảnh giảm dần biên độ).

for i = 1:n

if i<= n-2

h = conlacdon(theta(i),’b’);

%M(lap) = getframe;

drawnow

pause(0.05)

if i<= n-3

delete(h);

end

%lap = lap + 1;

end

end

Và kết quả sẽ là

Hình 3.21: Biên độ con lắc giảm dần

Page 65: Annimation in Matlab

Chương 4

Ảnh và movie trong matlab

Trong phần này ta nói về cách lưu chuyển động thành ảnh .gif và phim .avi,code được viết và kiểm tra chạy tốt trên phiên bản MATLAB R2010a.

4.1 Lưu chuyển động thành file ảnh .gif

Sử dụng phương pháp thứ 2, khi ta đã lưu được một chuyển động vào matrận M. Ta có phương pháp chung để chuyển nó thành file ảnh .gif

Giả sử có M lưu chuyển động, đặt n = length(M). Ta tiến hành nhưđoạn code mẫu sau 1

for i = 1:n

fim = frame2im(F(lap));

[imind,cm] = rgb2ind(fim,256);

if lap == 1; % ghi frame đầu tiên

imwrite(imind,cm,’mypic.gif’,’gif’, ’Loopcount’,inf);

else

imwrite(imind,cm,’mypic.gif’,’gif’,’WriteMode’,...

’append’,’Delaytime’,0.05);

end

end

Các giá trị tham số trong lệnh imwrite có thể có nhiều sự lựa chọn khácnhau cứ không nất thiết phải theo mẫu trên đây một cách cứng nhắc.

Giờ ta đưa ra một ví dụ, lấy lại chính ví dụ trong 3.6.

Code 30 (Lưu chuyển động thành file .gif).

1Chi tiết về các hàm frame2im, rgb2ind,imwrite xem help MATLAB

65

Page 66: Annimation in Matlab

CHƯƠNG 4. ẢNH VÀ MOVIE TRONG MATLAB 66

clear all

x = -pi:0.1:pi;

view(3);

n = length(x);

y = 1:n;

[x,y] = meshgrid(x,y);

Y = y/n*pi;

z = cos(Y) + sin(x);

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’zbuffer’);

hold on

axis([-5 5 0 80 -2 2])

set(gca,’xtick’,[]);

set(gca,’ytick’,[]);

set(gca,’ztick’,[]);

lap = 1;

for j = 1:0.1:10

z = cos(Y+j) + sin(x+j);

h = surf(x,y,z,’LineStyle’, ’none’);

M(lap) = getframe;

%%%%%%--------------------------

fim = frame2im(M(lap));

[imind,cm] = rgb2ind(fim,256);

if lap == 1; % ghi frame đầu tiên

imwrite(imind,cm,’mypic.gif’,’gif’, ’Loopcount’,inf);

else

imwrite(imind,cm,’mypic.gif’,’gif’,’WriteMode’,...

’append’,’Delaytime’,0.05);

end

%%%%%%%--------------------------

drawnow

lap = lap + 1;

delete(h);

end

hold off

movie(M,2,30);

Sau khi run, MATLAB tạo ra file ảnh mypic.gif trong thư mục hiện hành(current folder). Có thể xem nó bằng trình duyệt web Internet Explorer

Page 67: Annimation in Matlab

CHƯƠNG 4. ẢNH VÀ MOVIE TRONG MATLAB 67

Hình 4.1: Xem ảnh động bằng IE

4.2 Lưu chuyển động thành file movie .avi

Cũng sử dụng phương pháp thứ 2, ta chuyển một đoạn chuyển động M vàofile .avi

Bước 1. Tạo một object .avi, sử dụng hàm avifile

aviobj = avifile(’mymovie.avi’,’compression’,’None’);

Bước 2. Chuyển dãy động từ movie M và đặt và object aviobj bằng hàmaddframe với đoạn code mẫu sau2

aviobj = avifile(’mymovie.avi’,’compression’,’None’);

for k=1:length(M)

aviobj = addframe(aviobj,M);

end

Bước 3. Đóng file aviobj.avi lại sau khi hoàn tất với hàm close

aviobj = close(aviobj);

Ví dụ với chuyển động cũng ấy từ 18, code như sau

2Các giá trị về trục tọa độ,. . . chỉ mang tính ví dụ. Chi tiết các hàm xem help

Page 68: Annimation in Matlab

CHƯƠNG 4. ẢNH VÀ MOVIE TRONG MATLAB 68

clear all

x = -pi:0.1:pi;

view(3);

n = length(x);

y = 1:n;

[x,y] = meshgrid(x,y);

Y = y/n*pi;

z = cos(Y) + sin(x);

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’zbuffer’);

hold on

axis([-5 5 0 80 -2 2])

set(gca,’xtick’,[]);

set(gca,’ytick’,[]);

set(gca,’ztick’,[]);

aviobj = avifile(’mymovie.avi’,’compression’,’None’);

for j = 1:0.1:10

z = cos(Y+j) + sin(x+j);

h = surf(x,y,z,’LineStyle’, ’none’);

M = getframe;

%%%%------------------------------------

aviobj = addframe(aviobj,M);

%%%%------------------------------------

drawnow

delete(h);

end

hold off

aviobj = close(aviobj);

Kết thúc, MATLAB tạo ra file mymovie.avi trong thư mục hiện hành(current folder), dù chỉ vài giây nhưng dung lượng khá nặng, test trên máytính tại thời điểm này lên đến 39MB.

Phương pháp khác để tạo movie MATLAB cung cấp lệnh sau để tạo.avi chỉ bằng một lệnh từ matrix movie đã có

movie2avi(mov, ’myPeaks.avi’, ’compression’, ’None’);

Với chú ý nên để ’Renderer’ là ’zbuffer’ trong quá trình tạo matrix M.Ví dụ với chuyển động besselj trong 3.7

Page 69: Annimation in Matlab

CHƯƠNG 4. ẢNH VÀ MOVIE TRONG MATLAB 69

clear all

[x,y] = meshgrid([-10:0.5:10]);

set(gca,’NextPlot’,’replacechildren’)

set(gcf,’Renderer’,’zbuffer’);

for j = 1:1:300

z = besselj(0, (j-1)*0.2 + sqrt(x.^2 +y.^2));

surf(x,y,z)

drawnow

axis([-10 10 -10 10 -.5 1])

M(j) = getframe;

end

movie2avi(M, ’myyyy.avi’, ’compression’, ’None’);

Kết thúc thu được file .avi 20s với dung lượng 131MB.

Nhận xét Thử nghiệm, cùng một đoạn chuyển động với matrix M, làmbằng 2 cách tạo file .avi trên ta đều được file .avi với dung luông gần nhưbằng nhau. (ở trên ta đã chọn ’compression’ là ’none’ trong cả 2 cách)

Page 70: Annimation in Matlab

Tài liệu tham khảo

[1] MATLAB The Language of Technical Computing, Using MATLABGraphics Version 5.2

[2] A MATLAB Companion for Multivarible Calculus, Jeffery Cooper.Department of Mathematics University of Maryland

[3] http://en.wikipedia.org/wiki/Wave_function

[4] http://en.wikipedia.org/wiki/Harmonic_oscillator

[5] http://www.sky-engin.jp/en/MATLABAnimation/index.html

70