matlab 图线动画,Matlab绘制简单动画
偶然間發現matlab很萬能,平時用matlab做實驗顯得有點敷衍了,今天學習了一點做簡單動圖的東西,語法很簡單,實際就是要有深厚的數學功底哇!
一、運動的余弦函數
打開了matlab,新建文件animation1.m, 開始第一個簡單的練手工作,要想運動,就得先做一個余弦函數
先定義其X的定義域,再令Y=sin(X);即可有如下效果
X = -2*pi : 0.1 : 2*pi;
Y = sin(X);
plot(X,Y)
而我們要實現運動的效果,實際就是所有的點向右平移了,所有定義域就要發生改變,這里定義平移的尺度為0.1,對應的值也要發生相應改變,這里注意set的用法,它重新設定了新值,即把我們新的X,Y的值賦給h,而drawnow表示繪制這時候的圖形
X = X + 0.1;
Y = sin(X);
set(h, 'XData', X, 'YData', Y);
drawnow;
這樣我們就能得到一個平移了0.1的余弦圖形了,怎么樣才能一直平移呢,就是讓他一直循環下去,利用while true即可實現
while true
X = X + 0.1;
Y = sin(X);
set(h, 'XData', X, 'YData', Y);
drawnow;
end
一個移動的圖就得到了。
這里再提供一種更簡單的方法。
while true
X = X + 0.1;
Y = sin(X);
plot(X,Y);
getframe;
end
這里的getframe可以實現set的功能。
再注意一下,我們的代碼停止運行的話會產生如下錯誤,但沒有影響的。
這是由于我們關掉了窗口,繪制圖形就識別不到了我們的參數,所有報錯了。
二、會動的彈簧
同樣我們先做一個不會動的彈簧,怎么做一個螺旋型的呢,就需要我們的兩個方向的余弦,正弦函數,再繪制一個三維圖即可,為了使彈簧形狀更美觀,這里設置了其坐標軸標度。
theta = -10*pi : 0.1 : 10*pi;
X = cos(theta);
Y = sin(theta);
Z = theta;
plot3(X, Y, Z);
axis( [-2, 2, -2, 2, -10*pi, 10*pi]);
注意一下這里的Z軸決定了它的高度。
為了壓縮,那就是要乘以一個系數就好,不停壓縮的話就是不停乘以系數,給予合適的壓縮次數,而要彈回來,那就要除以我們的系數,達到增大高度的目的。
壓縮彈簧
for i = 1: 100
Z = 0.98*Z;
set(h, 'XData', X, 'YData', Y, 'ZData', Z);
drawnow;
end
彈回去
for i = 1: 100
Z = Z/0.98;
set(h, 'XData', X, 'YData', Y, 'ZData', Z);
drawnow;
end
我們這里選定次數為100次,然后再用一個總的while true循環包括這兩部分就可以實現我們的不停的跳動了。
一定要設定坐標軸固定,不然跳動的效果會受影響。
三、會轉的時鐘
做完兩個是不是就已經套路是啥了呢,時鐘就是確定原點為中心,畫一個圓,一根會轉的線,圓的話用我們的余弦函數就好了
t = 0 : pi/50 : 2*pi;
X = cos(t);
Y = sin(t);
plot(X,Y);
hold on;
axis equal;
注意這里時間的劃分,是pi/50,跨度越小,越接近于完美的圓,同時說明兩個地方的用法(如果這里跨度取0.1的話,會看到圓的右側有個缺口)
hold on 幫助我們保持住我們的圓,不被我們后面要畫的直線覆蓋住
axis equal 保持我們的兩個坐標軸刻度相同,使圓更圓
那我們接下來就是畫線了,我們知道一條直線實際上就是一個向量,確定兩個點就可以了,我們這里一個是原點,一個假定為(1,0),那我們就可以得到X軸上的線了
lineX = [0 ,1];
lineY = [0 ,0];
h = plot(lineX, lineY);
那如何讓這根線轉動呢,那就是要將我們的(1,0)坐標換成很多個與角度有關的點就可以了
theta = 0;
while true
theta = theta + 0.1;
lineX(2)= cos(theta);
lineY(2)= sin(theta);
set(h, 'XData', lineX, 'YData', lineY);
drawnow;
end
先令角度theta為0,然后慢慢增加,令坐標為cos(theta)和sin(theta)即可,其余按套路來即可。注意這里的矩陣表示法lineX(2)和lineY(2)都是表示第二個元素。
效果圖如下:
然后可以自己再加幾根線上去,做成一個完整的時鐘哦!
四、密集的三維波形圖
這個圖形密集恐懼癥勿進哈!
X = -10 : 0.2 : 10;
Y = -10 : 0.2 : 10;
[X,Y] = meshgrid(X,Y);
Z = sin(X) + cos(Y);
h = surf(X,Y,Z);
axis([-10 , 10, -10, 10, -20, 20]);
while true
for i = 1 : 100
Z = Z*0.97;
set(h, 'XData', X, 'YData', Y, 'Zdata', Z);
drawnow;
end
for i = 1 : 100
Z = Z/0.97;
set(h, 'XData', X, 'YData', Y, 'Zdata', Z);
drawnow;
end
end
這里我們的meshgrid用來生成x,y平面即根據x y 生成網格得到坐標點集合(X, Y),surf用來繪制三個方向的圖,其余和前面一樣哦!可以先自己動手試試
五、可以吃的曲奇餅
話不多說,直接上餅來恰!
R1 = 2;
t = 0 : 0.1 : 10;
for n = 1: length(t)
theta = 0 : pi/50 : 2*pi;
phi = 0 : pi/50 : 2*pi;
[theta, phi] = meshgrid(theta, phi);
R2= 1+ 0.2*cos(8*(phi-theta-t(n)));
X = (R1 + R2.*cos(theta)).*cos(phi);
Y = (R1 + R2.*cos(theta)).*sin(phi);
Z = R2.*sin(theta);
surf(X, Y, Z);
axis equal;
axis([-3.5, 3.5, -3.5, 3.5, -1.5, 1.5]);
shading interp
M(n) = getframe;
end
提供一下思路:
做一個圓,使其圍繞Z軸旋轉,但要注意不是規則的旋轉,故肯定會有兩個角度,這和我們建立球坐標系原理是一樣的,主要是X,Y,Z的坐標如何設定,然后為了讓他運動,就要改變它的R2,使其隨時間變化即可!
今天學完之后真開心!
我要糖
發布了78 篇原創文章 · 獲贊 179 · 訪問量 8317
私信
關注
標簽:動畫,set,10,0.1,Matlab,theta,pi,繪制,sin
來源: https://blog.csdn.net/qq_44790423/article/details/104599054
總結
以上是生活随笔為你收集整理的matlab 图线动画,Matlab绘制简单动画的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ElasticSearch创建、修改、获
- 下一篇: matlab 画m,Matlab画直线(