• Remix
  • Share
  • New Entry

on 19 Nov 2023
  • 22
  • 27
  • 0
  • 0
  • 1920
drawframe(1);
Write your drawframe function below
% drawframe(1);
% Write your drawframe function below
% https://github.com/minoue-xx/Visualize-Phase-Modulation-with-MATLAB/tree/master
function drawframe(f)
% Number of data points to plot
N=150;
fC=2;
fD=1;
p2=pi/2;
t0=linspace(0,4*pi,N);
% Figure 上で Axes 作成
% hf=figure(Position=[1,1,4,4]*100,Color='white');
hf=figure;
haA=setA(hf,[1,1,2,2]/13,'none');
haB=setA(hf,[4,1,8,2]/13,'green');
haC=setA(hf,[1,4,2,8]/13,'red');
haD=setA(hf,[4,7,8,2]/13,'blue');
% やっぱりこれ
%text(haB, 1, -0.1,"Visualized by MATLAB",'HorizontalAlignment','right',...
% 'Units','normalized','FontSize', 10,'Color',0.5*[1,1,1]);
% y=0 の Tick 作成 (Axes A 以外)
haB.YTick=0;
haC.XTick=0; % Axes C は縦向き
haC.YTick=2*pi; % 真ん中(y=2pi を t=0 と表示)
haC.YTickLabel="0"; % 真ん中(y=2pi を t=0 と表示)
haD.YTick=0;
grid(haB,'on');
grid(haC,'on');
grid(haD,'on');
% それぞれの Axes 表示範囲を固定
haA.XLim=[-p2,p2];
haA.YLim=[-p2,p2];
haB.XLim=[0,4*pi];
haB.YLim=[-p2,p2];
haC.XLim=[-p2,p2]; % Axes C は縦向き
haC.YLim=[0,4*pi]; % Axes C は縦向き
haD.XLim=[0,4*pi];
haD.YLim=[-p2,p2];
% Axes A の y=-x の線を描く
hlA=line(haA,[-p2,p2],[p2,-p2],Color='black',LineWidth=2);
% Axes C, Axes D のサインカーブ
y=p2*sin(t0);
hlC=line(haC,y,t0,Color='red',LineWidth=2); % Axes C は縦向き
hlD=line(haD,t0,y,Color='blue',LineWidth=2);
% 動く点座標を描画
tC=2*pi+y(1); % y position in C axes
xC=p2*sin(tC); % x position in C axes
hpA=line(haA,xC,-xC,Marker='o',MarkerFaceColor='black');
hpB=line(haB,0,-xC,Marker='o',MarkerFaceColor='green');
hpC=line(haC,xC,tC,Marker='o',MarkerFaceColor='red');
hpD=line(haD,0,y(1),Marker='o',MarkerFaceColor='blue');
% Axes B に新たな線を追加(時間経過とともに伸びます)
hlB=line(haB,0,-xC,Color='green',LineWidth=2);
% 式表示
% haB.Title.Interpreter='latex';
% haB.Title.FontSize=15;
% haB.Title.String="$$\frac{\pi}{2}\sin\left(" + string(fC) + ...
% "t + \frac{\pi}{2} \sin \left( " + string(fD) +" t \right) \right)$$";
% 動く点を結ぶ線を描きます。
% Figure 座標系に変換
[xAf,yAf]=p_a2f([xC,-xC],haA);
[xBf,yBf]=p_a2f([0,-xC],haB);
[xCf,yCf]=p_a2f([xC,tC],haC);
[xDf,yDf]=p_a2f([0,y(1)],haD);
% まず A <-> B
hanAB=annotation('line',[xAf,xBf],[yAf,yBf],Color='green');
hanAC=annotation('line',[xAf,xCf],[yAf,yCf],Color='red');
hanCD=annotation('line',[xCf,xDf],[yCf,yDf],Color='blue');
% あとはデータを更新して動かすだけ!
dt=4*pi/N;
% for ii=1:N % 1波長分描きます。
ii = f*3;
yC=p2*sin(t0 + fC*dt*ii);
yD=p2*sin(t0 + fD*dt*ii);
% Axes C, Axes D のサインカーブ
hlC.XData=yC; % Axes C は縦向き
hlD.YData=yD;
% 動く点座標を描画
tC=2*pi+yD(1); % y position in C axes
xC=p2*sin(tC+fC*dt*ii); % x position in C axes
hpA.XData=xC;
hpA.YData=-xC;
hpB.YData=-xC;
hpC.XData=xC;
hpC.YData=tC;
hpD.YData=yD(1);
persistent Bx By
% Axes B にデータ追加(線を伸ばす)
Bx=[dt*ii,Bx];
By=[By,-xC];
hlB.XData=Bx;
hlB.YData=By;
% 動く点を結ぶ線を描きます。
% Figure 座標系に変換
[xAf,yAf]=p_a2f([xC,-xC],haA);
[xBf,yBf]=p_a2f([0,-xC],haB);
[xCf,yCf]=p_a2f([xC,tC],haC);
[xDf,yDf]=p_a2f([0,yD(1)],haD);
% まず A <-> B
hanAB.X=[xAf,xBf];
hanAB.Y=[yAf,yBf];
hanAC.X=[xAf,xCf];
hanAC.Y=[yAf,yCf];
hanCD.X=[xCf,xDf];
hanCD.Y=[yCf,yDf];
drawnow
end
function [xF,yF]=p_a2f(d,ha)
% Copyright 2020 Michio Inoue
x=d(1);
y=d(2);
% ha.Units='normalize';
ha.Units='n';
XL=ha.XLim;
YL=ha.YLim;
aP=ha.Position;
wD=XL(2)-XL(1);
hD=YL(2)-YL(1);
xF=(x-XL(1))/wD*aP(3) + aP(1);
yF=(y-YL(1))/hD*aP(4) + aP(2);
end
function h=setA(hf, p, c)
% Copyright 2020 Michio Inoue
% handle_axes=h;
h=axes(hf,Position=p,Box="on");
h.XColor=c;
h.YColor=c;
h.XTick=[];
h.YTick=[];
h.LineWidth=2;
end
Animation
Remix Tree