Cartoon of monochromator movements
Matlab code
% Program to animate crystal movements in a four-bounce mono
clear; close all;
figure('units','pixels','position',[0 0 1920 1080],'ToolBar','none');
vid = VideoWriter('fourbounceMovement.mp4','MPEG-4');
vid.FrameRate = 30; % Default 30
vid.Quality = 100; % Default 75
open(vid);
set(0,'defaultfigurecolor',[1 1 1]);
set(gca,'linewidth',7);
% Some dimensions of the mono
h= 0.1; % beam half height
d = 1; % channel height
thSt = 35; % starting angle
thEnd = 15; % ending angle
thStep = -0.25; % angle step size
mirrorX = 4.25; % mirror plane of two crystals in the four-bounce configuration
fwd = [thSt:thStep:thEnd];
X1x = [-1.5 1.0 1.0 -1.5]; % x-coords X1 first channel cut
X1y = [0 0 -0.5 -0.5]; % y-coords X1 first channel cut
X2x = [-1 4.5 4.5 -1]; % x-coords X2 first channel cut
X2y = [1 1 1.5 1.5]; % y-coords X2 first channel cut
Brix = [-1 1 1 -1]; % x-coords bridge piece first channel cut
Briy = [0 0 1 1]; % y-coords bridge piece first channel cut
mirX1x = 2*mirrorX - [-1.5 1.0 1.0 -1.5]; % x-coords X1 second channel cut
mirX2x = 2*mirrorX - [-1 4.5 4.5 -1]; % x-coords X2 second channel cut
mirBrix = 2*mirrorX - [-1 1 1 -1]; % x-coords bridge piece second channel cut
% Create rgb progression through a rainbow
bot = 0:8:120; % 0 to 7f in 16 steps
top = 128:8:248; % 80 to ff
all = 0:16:240; % 0 to ff
botc = 0*all; % vector of zeros
midc = botc + 127; % vector of 127s
topc = botc + 255; % vector of 255s
rcomp = [top topc topc flip(all) botc botc bot flip(bot)]/256; % R in rgb
gcomp = [botc bot top flip(top) midc flip(bot) botc botc]/256; % G in rgb
bcomp = [botc botc botc botc bot midc midc flip(bot)]/256; % B in rgb
grey = [0.5 0.5 0.5];
dkgrey = [0.3 0.3 0.3];
% for th = [fwd flip(fwd)]
for th = [fwd flip(fwd)]
newplot
hold on
OA = d/sind(th);
BLx = -h/tand(th);
BLy = -h;
BRx = h/tand(th);
BRy = h;
TLx = BLx + OA*cosd(2*th);
TLy = BLy + OA*sind(2*th);
TRx = BRx + OA*cosd(2*th);
TRy = BRy + OA*sind(2*th);
X2 = fill(X2x,X2y,grey,'LineStyle','none');
rotate(X2,[0 0 1],th,[0,0,0]);
Bridge = fill(Brix,Briy,dkgrey,'LineStyle','none');
rotate(Bridge,[0 0 1],th,[0,0,0]);
for ii = -h:h/10:h
axis off
axis equal
x = [-4,ii/tand(th)];
y = [ii,ii];
colIndex = round(6*(1 + (ii+h)*90));
plot(x,y,'color',[rcomp(colIndex),gcomp(colIndex),bcomp(colIndex)],'LineWidth',2);
end
beamColInd = round(abs((thSt - th)/(thSt - thEnd))*120) + 1;
monoBeam1 = fill([BLx BRx TRx TLx],[BLy BRy TRy TLy],...
[rcomp(beamColInd),gcomp(beamColInd),bcomp(beamColInd)],'LineStyle','none');
set(monoBeam1,'facealpha',.5)
X1 = fill(X1x,X1y,grey,'LineStyle','none');
rotate(X1,[0 0 1],th,[0,0,0]);
% Second channel-cut crystal
BLx = 2*mirrorX - BLx;
BLy = -h;
BRx = 2*mirrorX - BRx;
BRy = h;
TLx = 2*mirrorX - TLx;
TLy = BLy + OA*sind(2*th);
TRx = 2*mirrorX - TRx;
TRy = BRy + OA*sind(2*th);
mirX2 = fill(mirX2x,X2y,grey,'LineStyle','none');
rotate(mirX2,[0 0 1],-th,[2*mirrorX,0,0]);
Bridge = fill(mirBrix,Briy,dkgrey,'LineStyle','none');
rotate(Bridge,[0 0 1],-th,[2*mirrorX,0,0]);
mirX1 = fill(mirX1x,X1y,grey,'LineStyle','none');
rotate(mirX1,[0 0 1],-th,[2*mirrorX,0,0]);
monoBeam2 = fill([TLx TRx 2*mirrorX-TRx 2*mirrorX-TLx TLx],...
[TLy TRy TRy TLy TLy],[rcomp(beamColInd), gcomp(beamColInd),...
bcomp(beamColInd)],'LineStyle','none');
set(monoBeam2,'facealpha',.5)
monoBeam3 = fill([BLx BRx TRx TLx],[BLy BRy TRy TLy],[rcomp(beamColInd),...
gcomp(beamColInd),bcomp(beamColInd)],'LineStyle','none');
set(monoBeam3,'facealpha',.5)
monoBeam4 = fill([BLx BRx 11.85 12 11.85 BLx],[BLy BRy BRy BRy-h BLy BLy],...
[rcomp(beamColInd), gcomp(beamColInd),bcomp(beamColInd)],'LineStyle','none');
set(monoBeam4,'facealpha',.5)
viscircles([0 0],0.044,'LineWidth',4,'Color','k');
viscircles([2*mirrorX 0],0.044,'LineWidth',4,'Color','k');
xlim([-4 12]);
ylim([-1.5 4]);
hold off
% Store the frame
frame = getframe(gcf);
writeVideo(vid,frame);
end
% Output the movie as an mpg file
close(vid);