MATLAB Mathematical Show: The Illusion of Rotation

Reference video : https://b23.tv/QRQpHi
Description : When the radius of the small circle is half of the large circle, and the small circle does pure rolling motion in the large circle, the motion trajectory of each point on the small circle is a straight line, the
test effect :
Insert picture description here
Insert picture description here
Insert picture description here
complete Code:

function PointOnLineInCircle(N)
if nargin<1||N<3
    N=4;
end
% 0.2157    0.3765    0.5725
% 0.3098    0.5059    0.7412

fig=gcf;
fig.Name='PoLiC';
fig.Position=[50 50 600 600];
fig.NumberTitle='off';
fig.MenuBar='none';

ax=axes(fig);
ax.Position=[0 0 1 1];
ax.XLim=[-2 2];
ax.YLim=[-2 2];
ax.XColor='none';
ax.YColor='none';
hold(ax,'on');
% grid on

thetaB=0;
thetaS=0;



pntsTheta=0:2*pi/N:2*pi;


for i=1:(length(pntsTheta)-1)
    plot([cos(pntsTheta(i)),cos(pntsTheta(i)+pi)].*2,...
         [sin(pntsTheta(i)),sin(pntsTheta(i)+pi)].*2,...
         'Color',[0.8 0.8 0.8],'LineWidth',1.5)
end
if mod(N,2)==0
    for i=1:(length(pntsTheta)-1)
        plot([cos(pntsTheta(i)+2*pi/N/2),cos(pntsTheta(i)+2*pi/N/2+pi)].*2,...
             [sin(pntsTheta(i)+2*pi/N/2),sin(pntsTheta(i)+2*pi/N/2+pi)].*2,...
             'Color',[0.8 0.8 0.8],'LineWidth',1.5)
    end
end


tempT=0:0.1:2*pi+0.1;
CPnts=[cos(tempT);sin(tempT)];
plot(CPnts(1,:).*2,CPnts(2,:).*2,'Color',[0.2098 0.4059 0.6412],'LineWidth',2);

sCircleHdl=plot(cos(thetaB)+CPnts(1,:),sin(thetaB)+CPnts(2,:),...
    'Color',[0.3098 0.5059 0.7412],'LineWidth',2);

pntsHdl=plot(cos(pntsTheta+thetaS)+cos(thetaB),...
    sin(pntsTheta+thetaS)+sin(thetaB),...
    'Color',[0.2157 0.3765 0.5725],'LineWidth',2,'Marker','o',...
    'MarkerFaceColor',[0 0 0],'MarkerEdgeColor',[0 0 0],'MarkerSize',6);

patchHdl=fill(cos(pntsTheta(1:end-1)+thetaS)+cos(thetaB),...
              sin(pntsTheta(1:end-1)+thetaS)+sin(thetaB),...
              [0.8500 0.3250 0.0980],'EdgeColor','none','FaceAlpha',0.1);

while 1
    thetaB=thetaB-2*pi/200;
    thetaS=thetaS+2*pi/200;
    sCircleHdl.XData=cos(thetaB)+CPnts(1,:);
    sCircleHdl.YData=sin(thetaB)+CPnts(2,:);
    pntsHdl.XData=cos(pntsTheta+thetaS)+cos(thetaB);
    pntsHdl.YData=sin(pntsTheta+thetaS)+sin(thetaB);
    patchHdl.XData=cos(pntsTheta(1:end-1)+thetaS)+cos(thetaB);
    patchHdl.YData=sin(pntsTheta(1:end-1)+thetaS)+sin(thetaB);
    pause(0.05);
end


end

Guess you like

Origin blog.csdn.net/slandarer/article/details/114037340