使用 MATLAB 的圆角旋转动画
Animation of Circle angle rotation using MATLAB
我有一个圆圈并将这个圆圈分成 3 个扇形(每个扇形 120 度)。现在我想将一个部分的角度增加 50 度,将另一部分的角度减少 50 度,并保持第三部分不变(例如 170 度第一部分,第二部分70度,第三部分120度。我想用MATLAB为整个过程制作一个动画。
我怎样才能得到这个?如果有人有使用 MATLAB 的这个过程的任何源代码,它对我有很大帮助。
我只是画了一个圆圈,把它分成三个相等的扇形,然后将一些点填入circle.Here,我附上了以下代码:
x0=2;
y0=1;
r=1;
teta=-pi:0.01:pi;
x=r*cos(teta)+x0
y=r*sin(teta)+y0
plot(x,y)
hold on
scatter(x0,y0,'or')
axis square
%----------------------------------------
% divide your circle to n sectors
n=3
tet=linspace(-pi,pi,n+1)
xi=r*cos(tet)+x0
yi=r*sin(tet)+y0
for k=1:numel(xi)
plot([x0 xi(k)],[y0 yi(k)])
hold on
p1=[1.5,0.4];
p2=[2,0.8];
p3=[2.5,0.2];
p4=[2.5,1];
p5=[1.5,1.6];
p6=[1.5,0.8];
p7=[2,1.2];
p8=[2,1.4];
p9=[1.6,0.7];
p10=[2.5,0.6];
p11=[2.7,0.5];
p12=[2,0.9];
p=[p1;p2;p3;p4;p5;p6;p7;p8;p9;p10;p11;p12]';
plot(p(1,:),p(2,:),'go')
end
以下代码将产生您想要的结果。我简化了您的一些代码并向这些部分添加了注释。所有参数都可以在顶部设置。该脚本将创建一个电影文件 circle_anim.mp4
,可以在 Matlab 外部查看。
% set options
x0 = 2; % origin x-coordinate
y0 = 1; % origin y-coordinate
r = 1; % radius of circle
n = 3; % number of pieces
m = 50; % movement of separator in radians (+ACW / -CW)
ts = 3; % target separator (1...n)
fs = 30; % frame rate in fps
T = 2; % duration in seconds
s = T*fs; % movement step count
% predefined points -> [x1,x2,xn;y1,y2,yn]
p = [ 1.5, 2.0, 2.50, 2.5, 1.5, 1.5, 2.0, 2.0, 1.6, 2.5, 2.7, 2.0;
0.4, 0.8, 0.20, 1.0, 1.6, 0.8, 1.2, 1.4, 0.7, 0.6, 0.5, 0.9];
% calculate circle
theta = -pi:0.01:pi;
cirx = r*cos(theta) + x0;
ciry = r*sin(theta) + y0;
% initial plot
figure; hold on;
axis square;
plot(x0,y0,'or'); % origin
plot(cirx,ciry); % circle
plot(p(1,:),p(2,:),'go'); % predefined points
% calculate and plot separations
ciro = linspace(-pi,pi,n+1);
for k = 1:(numel(ciro)-1)
ph(k) = plot([x0,x0+r*cos(ciro(k))],[y0,y0+r*sin(ciro(k))]); %#ok<SAGROW>
end
% vary target separator and create frames
clearvars myFrames;
movo = linspace(ciro(ts),ciro(ts)+(m/180*pi),s);
for k = 1:numel(movo)
set(ph(ts), 'XData', [x0,x0+r*cos(movo(k))]);
set(ph(ts), 'YData', [y0,y0+r*sin(movo(k))]);
myFrames(k) = getframe; %#ok<SAGROW>
end
% write frames to video
myMovie = VideoWriter('circle_anim.mp4','MPEG-4');
myMovie.FrameRate = fs;
open(myMovie);
for k = 1:length(myFrames)
writeVideo(myMovie,myFrames(k));
end
close(myMovie);
我有一个圆圈并将这个圆圈分成 3 个扇形(每个扇形 120 度)。现在我想将一个部分的角度增加 50 度,将另一部分的角度减少 50 度,并保持第三部分不变(例如 170 度第一部分,第二部分70度,第三部分120度。我想用MATLAB为整个过程制作一个动画。
我怎样才能得到这个?如果有人有使用 MATLAB 的这个过程的任何源代码,它对我有很大帮助。
我只是画了一个圆圈,把它分成三个相等的扇形,然后将一些点填入circle.Here,我附上了以下代码:
x0=2;
y0=1;
r=1;
teta=-pi:0.01:pi;
x=r*cos(teta)+x0
y=r*sin(teta)+y0
plot(x,y)
hold on
scatter(x0,y0,'or')
axis square
%----------------------------------------
% divide your circle to n sectors
n=3
tet=linspace(-pi,pi,n+1)
xi=r*cos(tet)+x0
yi=r*sin(tet)+y0
for k=1:numel(xi)
plot([x0 xi(k)],[y0 yi(k)])
hold on
p1=[1.5,0.4];
p2=[2,0.8];
p3=[2.5,0.2];
p4=[2.5,1];
p5=[1.5,1.6];
p6=[1.5,0.8];
p7=[2,1.2];
p8=[2,1.4];
p9=[1.6,0.7];
p10=[2.5,0.6];
p11=[2.7,0.5];
p12=[2,0.9];
p=[p1;p2;p3;p4;p5;p6;p7;p8;p9;p10;p11;p12]';
plot(p(1,:),p(2,:),'go')
end
以下代码将产生您想要的结果。我简化了您的一些代码并向这些部分添加了注释。所有参数都可以在顶部设置。该脚本将创建一个电影文件 circle_anim.mp4
,可以在 Matlab 外部查看。
% set options
x0 = 2; % origin x-coordinate
y0 = 1; % origin y-coordinate
r = 1; % radius of circle
n = 3; % number of pieces
m = 50; % movement of separator in radians (+ACW / -CW)
ts = 3; % target separator (1...n)
fs = 30; % frame rate in fps
T = 2; % duration in seconds
s = T*fs; % movement step count
% predefined points -> [x1,x2,xn;y1,y2,yn]
p = [ 1.5, 2.0, 2.50, 2.5, 1.5, 1.5, 2.0, 2.0, 1.6, 2.5, 2.7, 2.0;
0.4, 0.8, 0.20, 1.0, 1.6, 0.8, 1.2, 1.4, 0.7, 0.6, 0.5, 0.9];
% calculate circle
theta = -pi:0.01:pi;
cirx = r*cos(theta) + x0;
ciry = r*sin(theta) + y0;
% initial plot
figure; hold on;
axis square;
plot(x0,y0,'or'); % origin
plot(cirx,ciry); % circle
plot(p(1,:),p(2,:),'go'); % predefined points
% calculate and plot separations
ciro = linspace(-pi,pi,n+1);
for k = 1:(numel(ciro)-1)
ph(k) = plot([x0,x0+r*cos(ciro(k))],[y0,y0+r*sin(ciro(k))]); %#ok<SAGROW>
end
% vary target separator and create frames
clearvars myFrames;
movo = linspace(ciro(ts),ciro(ts)+(m/180*pi),s);
for k = 1:numel(movo)
set(ph(ts), 'XData', [x0,x0+r*cos(movo(k))]);
set(ph(ts), 'YData', [y0,y0+r*sin(movo(k))]);
myFrames(k) = getframe; %#ok<SAGROW>
end
% write frames to video
myMovie = VideoWriter('circle_anim.mp4','MPEG-4');
myMovie.FrameRate = fs;
open(myMovie);
for k = 1:length(myFrames)
writeVideo(myMovie,myFrames(k));
end
close(myMovie);