Cartoon of the photoelectric effect
Matlab code 

% Cartoon of the photoelectric effect

 

vid = VideoWriter('photoelectricEffect.mp4','MPEG-4');

vid.Quality = 100;

vid.FrameRate = 30;

open(vid);

figure('units','pixels','position',[0 0 1920 1080],'ToolBar','none');

set(0,'defaultfigurecolor',[1 1 1]);

set(gca,'linewidth',7);

lp = [7 5 4]; % Angle of lighting 

grey = [0.64 0.64 0.64];

myNickel = [0.44 0.46 0.44];

myBlue = [0.4 0.44 0.73];

 

r = 0:0.05:0.05; % For cone arrowhead 

[X,Y,Z] = cylinder(r,50); % Arrow head

discR = 3.2; % Radius of metal disc 

[XX,YY,ZZ] = cylinder(discR,300); % Metal disc circular side 

[a,b,c] = sphere(50); % Electron 

re = 0.1; % electron radius

theta = 0:pi/180:2*pi; % Used to draw circular surface of metal sample 

circx = discR*cos(theta);

circy = discR*sin(theta);

circz = 0.0*circx;

 

% dark-red - red - orange - yellow - green - cyan - blue - violet custom colormap

rgb = customcolormap([0 0.14 0.28 0.43 0.57 0.72 0.86 1], {'#880000','#ff0000','#ff8800','#ffff00','#00ff00','#00cccc','#0000ff','#7f00ff'});

fliprgb = flip(rgb);

colormap(fliprgb);

 

xArrow = 0:1/180:1/4; % Quarter wavelength, 90 degrees for arrow head of photon symbol

yArrow = 0.0*xArrow;

zArrow = 0.5*(cos(2*pi*xArrow)).^2;

arrowLength = 0.23;

xCos = 0:1/180:3; % Wiggly part of incoming photon symbol

yCos = 0.0*xCos;

 

for lambda = 700:-1:350 % Deep red to near UV

    % Incident radiation color

    index = 1 + round(255*(700-lambda)/350);

    colNow = fliprgb(index,:);

    

    newplot

    hold off

    

    r2 = 0.02+0.0*xCos;

    [x,y,z] = cylinder(r2,40);

    for i = 1:41

        x(:,i) = 0.5*cos(2*pi*700*xCos'/lambda) + x(:,i);

    end

    wiggle1 = surf(x,y,z*3+1.4*(max(xArrow)*lambda/700)+arrowLength,...

        'FaceColor',colNow,'LineStyle',...

        'none','FaceLighting','flat','DiffuseStrength',1);

    rotate(wiggle1,[0 1 0],-50,[0,0,0]);

    

    hold on

    r3 = 0.02+0.0*xArrow;

    [x,y,z] = cylinder(r3,40);

    for i = 1:41

        x(:,i) = 0.5*(sin(2*pi*xArrow')).^2 + x(:,i);

    end

    wiggle2 = surf(x,y,z*0.25*1.4*(lambda/700)+arrowLength,...

        'FaceColor',colNow,'LineStyle',...

        'none','FaceLighting','flat','DiffuseStrength',1);

    rotate(wiggle2,[0 1 0],-50,[0,0,0]);

    

    arrowHead = surf(X,Y,Z*arrowLength,...

        'FaceColor',colNow,'LineStyle',...

        'none','FaceLighting','flat','DiffuseStrength',1);

    rotate(arrowHead,[0 1 0],-50,[0,0,0]);

    metalDisc = surf(XX,YY,ZZ-1,...

        'FaceColor',myNickel,'LineStyle',...

        'none','FaceLighting','gouraud','DiffuseStrength',1);

    fill3(circx,circy,circz,...

        myNickel,'LineStyle',...

        'none','FaceLighting','flat','DiffuseStrength',1);

    dumLine = plot3([0 0],[0 0],[-1 4.1],'Color','w');

    dumLine.Color(4) = 0.0; % alpha = 0; fully transparent

    

    if (lambda <= 580)

        LL = (580 - lambda)/50;

        LLx = LL*cosd(60);

        LLz = LL*sind(60);

        surf(re*a+LLx,re*b,re*c+LLz,...

            'FaceColor',myBlue,'LineStyle',...

            'none','FaceLighting','flat','DiffuseStrength',1);

        index = 1 + round(255*(580-lambda)/350);

        colNow = fliprgb(index,:);        

        mArrow3([-0.5*cosd(60) 0 -0.5*sind(60)],[(LL-re)*cosd(60) 0 (LL-re)*sind(60)],'color',...

            colNow,'stemWidth',0.016,'tipWidth',0.04);

    end

    axis equal 

    axis off

    axis tight

    light('Position',lp,'Style','infinite');

    set(gca, 'Projection','perspective');

    set(gca,'View',[64,17]);

    

    frame = getframe(gcf);

    writeVideo(vid,frame);

    hold off

end

% Output the movie as an mpg file

close(vid);