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