Ray tracing of focussing using ellipses and parabolas
Matlab codes
% Program to plot reflection of rays originating at one of the foci of an
% ellipse. The ellipse ratio a/b is an input parameter
clear; close all;
prompt = 'Ratio of major to minor axes [>1; default 5]: ';
aob = input(prompt);
if isempty(aob)
aob = 5;
end
aaxis = 1.0; % semimajor axis
baxis = aaxis/aob; % semiminor axis
str1 = 'ellipseFocussing_a2b_';
str2 = num2str(aob);
str3 = '.mp4';
strTot = [str1,str2,str3];
vid = VideoWriter(strTot,'MPEG-4');
vid.FrameRate = 60;
vid.Quality = 100;
open(vid);
figure('ToolBar','none');
set(0,'defaultfigurecolor',[1 1 1]);
theta = (-pi:pi/200:pi)'; % causes the chords to make one full period forwards/backwards
xcoord = (cos(theta)).*aaxis;
ycoord = baxis.*(1 - xcoord.^2./aaxis^2).^0.5;
foci = (aaxis^2 - baxis^2)^0.5;
% Plot
for i = 1:size(xcoord,1)
hold off;
plot(xcoord,ycoord,'color',[0,0,0], 'LineWidth', 2.0); % top half of ellipse
axis([-aaxis-0.1 aaxis+0.1 -aaxis-0.1 aaxis+0.1]);
axis square % square plot
axis equal
axis off
hold on;
plot(xcoord,-ycoord,'color',[0,0,0], 'LineWidth', 2.0); % bottom half of ellipse
xchord = [-foci xcoord(i) foci]; % x-coordinates of ray path between foci
ychord = [0 ycoord(i) 0]; % y-coordinates of ray path between foci
plot(xchord,ychord, 'color',[1 0 0], 'Linewidth', 2.0); % reflection off upper half
plot(xchord,-ychord, 'color',[1 0 0], 'Linewidth', 2.0); % reflection off lower half
% Store the frame
frame = getframe(gcf);
writeVideo(vid,frame);
end
hold off;
% Output the movie as an mpg file
close(vid);
% Program to plot reflection of incident parallel rays on a parabolic
% surface coming to a focus at a point
clear; close all;
aconst = 5.0; % constant in x = ay^2
nR = 0.99;
vid = VideoWriter('parabolaFocussingTransmission.mp4','MPEG-4');
vid.FrameRate = 30;
vid.Quality = 100;
open(vid);
figure('ToolBar','none');
set(0,'defaultfigurecolor',[1 1 1]);
ycoord = (-0.2:0.00999999:0.2)'; % range of y-values of incoming horizontal beam
xcoord = aconst.*ycoord.^2; % x-value for a given y-value on surface of parabola
% Max x-value
grad = (4*aconst*xcoord(size(ycoord,1)))^-0.5;
theta = atan(grad);
thetaP = acos(nR*cos(theta));
delta = thetaP - theta;
xmax = xcoord(size(ycoord,1)) + ycoord(size(ycoord,1))/tan(delta);
for i = 1:size(ycoord,1)
hold off;
grad = (4*aconst*xcoord(i))^-0.5;
theta = atan(grad);
thetaP = acos(nR*cos(theta));
delta = thetaP - theta;
xf = xcoord(i) + abs(ycoord(i))/tan(delta);
fill([xcoord' -0.5 -0.5 min(xcoord)],[ycoord' 0.2 -0.2 -0.2],[0.5 0.5 0.5],'LineStyle','none');
hold on
plot(xcoord,ycoord,'color',[0,0,0], 'LineWidth', 2.0); % plot parabola
axis([-0.7 xmax -(xmax/2-0.05)/20 (xmax/2+0.05)/20]);
axis square % square plot
axis off
hold on;
xchord = [-0.7 xcoord(i) xf]; % x-coordinates of ray path between foci
ychord = [ycoord(i) ycoord(i) 0]; % y-coordinates of ray path between foci
plot(xchord,ychord, 'color',[1 0 0], 'Linewidth', 2.0); % reflection off upper half
plot(xchord,-ychord, 'color',[1 0 0], 'Linewidth', 2.0); % reflection off lower half
str1 = 'n = ';
str2 = num2str(nR,'% 4.3f');
strTot = [str1,str2];
hText = text(xmax*.8, -0.16, strTot, 'FontSize',14);
hText = text(xmax*.8, -0.195, 'x = 5y^2', 'FontSize',14);
% Store the frame
frame = getframe(gcf);
writeVideo(vid,frame);
end
hold off;
% Output the movie as an mpg file
close(vid);
% Program plotting parallel rays focussed by refraction as they pass
% through a plano-parabolic lens. The x- and y-dimensions are not equal in
% order to enhance the refraction angles
clear; close all;
aconst = 1.6; % constant in x = ay^2
vid = VideoWriter('parabolaFocussingReflection.mp4','MPEG-4');
vid.FrameRate = 30;
vid.Quality = 100;
open(vid);
figure('ToolBar','none');
set(0,'defaultfigurecolor',[1 1 1]);
ycoord = (-1:0.0099999999:1)'; % range of y-values of incoming horizontal beam
xcoord = aconst.*ycoord.^2; % x-value for a given y-value on surface of parabola
xmax = xcoord(size(ycoord,1)) + 1;
for i = 10:size(ycoord,1)-10
hold off;
grad = (4*aconst*xcoord(i))^-0.5;
theta = atan(grad);
ldist = abs(ycoord(i))/tan(2*theta);
xf = xcoord(i) - ldist;
plot(xcoord,ycoord,'color',[0,0,0], 'LineWidth', 2.0); % plot parabola
axis([-0.1 xmax -xmax/2-0.05 xmax/2+0.05]);
axis square % square plot
axis equal
axis off
hold on;
xchord = [xf xcoord(i) xmax]; % x-coordinates of ray path between foci
ychord = [0 ycoord(i) ycoord(i)]; % y-coordinates of ray path between foci
plot(xchord,ychord, 'color',[1 0 0], 'Linewidth', 2.0); % reflection off upper half
plot(xchord,-ychord, 'color',[1 0 0], 'Linewidth', 2.0); % reflection off lower half
frame = getframe(gcf);
writeVideo(vid,frame);
end
hold off;
% Output the movie as an mpg file
close(vid);