Cartoon of refraction of visible light by a prism
Matlab code
% Cartoon movie of refraction of visible light by a prism
clear; close all;
vid = VideoWriter('prismRefraction.mp4','MPEG-4');
vid.Quality = 100;
vid.FrameRate = 30;
open(vid);
figure('units','pixels','position',[0 0 1920 1080],'ToolBar','none');
set(0,'defaultfigurecolor',[0 0 0]); % black background = [0 0 0]. Normally white [1 1 1]
set(gcf,'color',[0 0 0]);
set(gca,'linewidth',7);
LL = 1;
ampl = 0.01;
nR = 1.5;
% Incident point of white beam on prism
incPtx = -LL/4;
incPty = -sqrt(3)/4;
% Angle of incident beam relative to horizontal
incAng = 18;
% End of straight line defined by incident beam behind vertical axis of prism
endIncx = 0;
endIncy = incPty+tand(incAng)*LL/4;
% Define 7 colors of dispersed rays
rayColors = [1 0 0; 1 0.5 0; 1 1 0; 0 1 0; 0 0.5 1; 0 0 1; 0.5 0 0.5];
for t = 0:2*pi/10:120*pi-pi/10
newplot
axis square
axis equal
axis tight
ax = gca;
ax.Visible = 'off';
hold on
xlim = ([-2*LL 2*LL]);
ylim = ([-2*LL 0.5*LL]);
alphaTemp = 0;
hold on
% Draw incident white beam
for lw = 42:-4:2
alphaTemp = alphaTemp+0.02;
lineAlpha = exp(-lw^2/200);
incRay = plot3([endIncx,endIncx-0.7*LL],[endIncy,endIncy-0.7*LL*tand(incAng)],...
[-lw/1000,-lw/1000],'Color','w','LineWidth',lw);
incRay.Color(4) = alphaTemp;
end
% Draw grey prism
pgon = polyshape([0 0.88*LL/2 -0.88*LL/2],[0 -0.88*LL*sqrt(3)/2 -0.88*LL*sqrt(3)/2]);
prism = plot(pgon);
prism.FaceColor = [0.1 0.1 0.1];
prism.FaceAlpha = 1;
prism.EdgeColor = [0.2 0.2 0.2];
prism.LineWidth = 2.5;
for rayCol = 1:7
hold on
% Calculate where each dispersed ray passes out through the prism
dispAng = 2*(7 - rayCol);
m = tand(dispAng); % gradient of dispersed ray
c = incPty - m*incPtx; % constant of y = mx + c describing ray
% Now determine where ray passes out of prism
% Given by where y = mx + c and y = -sqrt(3)x cross
endPrisx = -c/(sqrt(3)+m);
endPrisy = -sqrt(3)*endPrisx;
% Now determine length of dispersed ray in prism and make an array 1000
% steps long of this length
dispRayLength = ((endPrisx-incPtx)^2 + (endPrisy-incPty)^2)^0.5;
dispRay = (0:dispRayLength/1000:dispRayLength);
lambda = 0.064*(14-rayCol)/14;
lambdaRed = 0.064*6/7;
k = 2*pi/lambda;
dispWavey = ampl*sin(k*dispRay - lambdaRed*t/lambda);
ray1 = plot(dispRay+incPtx,dispWavey+incPty,'LineWidth',2.5,'Color',rayColors(rayCol,:));
rotate(ray1,[0 0 1],dispAng,[incPtx,incPty,0]);
% Determine phase of wave as it exits prism
phiPrism = 2*pi*mod(dispRayLength,lambda)/lambda
% shift in start of ray emerging from prism
delStart = -ampl*sin(phiPrism)*sind(2.6*dispAng-incAng);
outRayLength = 0.7*LL-(endPrisx+delStart);
outRay = (0:outRayLength/1000:outRayLength);
% Draw dispersed waves after emerging from prism
lambda = nR*0.064*(14-rayCol)/14;
k = 2*pi/lambda;
outWavey = ampl*sin(phiPrism+k*dispRay - nR*lambdaRed*t/lambda);
ray2 = plot(outRay+(endPrisx+delStart),outWavey+endPrisy,...
'LineWidth',2.5,'Color',rayColors(rayCol,:));
rotate(ray2,[0 0 1],1.6*dispAng-incAng,[endPrisx+delStart,endPrisy,0]);
end
% Store the frame
frame = getframe(gcf);
writeVideo(vid,frame);
hold off
end
% Output the movie as an mpg file
close(vid);