Cartoon of phase conditions for Bragg’s law
Matlab code
% Program to generate a cartoon of Bragg's law
clear; close all;
figure('units','pixels','position',[0 0 1920 1080],'ToolBar','none');
vid = VideoWriter('braggsLaw1.mp4','MPEG-4');
vid.Quality = 100;
vid.FrameRate = 30;
open(vid);
set(0,'defaultfigurecolor',[1 1 1]);
set(gca,'linewidth',7);
set(gca, 'Projection','perspective');
lp1 = [-0.4 -10.7 1.4];
lp2 = [0.4 -0. 1.4];
myBlue = [0.3 0.34 0.61];
myGold = [0.7 0.6 0];
myPurple = [0.5 0 0.5];
axis equal
LL = 4;
d = 1;
lambda = 0.5;
xlim([-LL LL]);
ylim([-LL LL]);
zlim([-LL LL]);
[x,y,z] = sphere(40); % Create sphere coordinates
ar = 0.25; % radius of atoms
thetaStart = 20;
thetaEnd = 40;
thetaStep = 0.1;
nthsteps = (thetaEnd-thetaStart)/thetaStep;
fwd = [thetaStart:thetaStep:thetaEnd];
for theta = [fwd flip(fwd)] % from min angle to max and back again
hold off
for jj = 0:3
for ii=-3:3
atom = surf(ii*d+x*ar,y*ar,z*ar-jj*d,'FaceAlpha',(4.7-jj)/5,'FaceColor',myBlue, ...
'LineStyle','none','FaceLighting','gouraud','DiffuseStrength',1, ...
'AmbientStrength',0.1);
hold on
end
set(gca, 'Projection','perspective');
set(gca,'View',[0,0]);
axis equal
xlim([-LL LL]);
ylim([-LL LL]);
zlim([-LL LL]);
% incident x-rays at angle theta to atomic planes
rayLength = 2*LL+jj*d*sind(theta);
braggAng = asind(2*lambda/(2*d));
offdiff = abs((braggAng-theta)/braggAng);
if (offdiff <= 0.01)
myCol = [1 0 0];
myCol2 = myCol;
else
myCol = myGold;
myCol2 = [0 0 0];
end
wavex = 0:LL/200:rayLength;
wavey = 0.0*wavex-0.25;
wavez = 0.2*sin(2*pi*(wavex/lambda))-jj;
h = plot3(wavex-rayLength,wavey,wavez,'color',myCol, 'LineWidth', 3.5);
rotate(h,[0 1 0],theta,[0,-0.25,-jj]);
h.Color(4) = (4.7-jj)/5; % Semitransparent line
% x-rays scattered by 2theta
wavex = 0:LL/200:2*LL+jj*sind(theta);
wavez = 0.2*sin(2*pi*(wavex+jj*d*sind(theta))/lambda);
h = plot3(wavex,wavey,wavez-jj*d,'color',myCol, 'LineWidth', 3.5);
rotate(h,[0 1 0],-theta,[0,-0.25,-d*jj]);
h.Color(4) = (4-jj)/5; % Semitransparent line
% Peak-indicating dot-dashed lines showing phase differences
phline = plot3([2-3*lambda/4-jj*d*(sind(theta)-1) ...
2-3*lambda/4-jj*d*(sind(theta)-1)],[-0.25 -0.25], ...
[0.5-d*jj -0.5-d*jj],'color',myCol2, 'LineWidth',1.4,'LineStyle','-.');
rotate(phline,[0 1 0],-theta,[0,-0.25,-d*jj]);
% Plot Gaussian to represent Bragg peak signal
gaussx = [-0.5:1/nthsteps:0.5];
gaussy = 0*gaussx;
gaussz = 1+exp(-gaussx.^2/0.01);
gaIndex = (theta-thetaStart)/thetaStep+1;
gauss = plot3(gaussx(1:gaIndex),gaussy(1:gaIndex),gaussz(1:gaIndex), ...
'color',myCol2,'LineWidth',2);
hText = text(0, 0, 0.83,'2\theta', 'FontSize',18,'HorizontalAlignment', 'center');
% In and out arrows
arrow1 = mArrow3([-LL -0.4 -1.5*d],[-LL+1 -0.4 -1.5*d],'color',myGold, ...
'stemWidth',0.05,'tipWidth',0.1,'facealpha',1); %
rotate(arrow1,[0 1 0],theta,[0,-0.4,-1.5*d]);
arrow2 = mArrow3([LL-1 -0.4 -1.5*d],[LL -0.4 -1.5*d],'color',myGold, ...
'stemWidth',0.05,'tipWidth',0.1,'facealpha',1); %
rotate(arrow2,[0 1 0],-theta,[0,-0.4,-1.5*d]);
end
light('Position',lp1,'Style','infinite');
light('Position',lp2,'Style','infinite');
axis off
frame = getframe(gcf);
writeVideo(vid,frame);
end
% Output the movie as an mpg file
close(vid);