使用 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);