summaryrefslogtreecommitdiff
path: root/axial/lensplot.m
diff options
context:
space:
mode:
Diffstat (limited to 'axial/lensplot.m')
-rw-r--r--axial/lensplot.m116
1 files changed, 116 insertions, 0 deletions
diff --git a/axial/lensplot.m b/axial/lensplot.m
new file mode 100644
index 0000000..a8f438d
--- /dev/null
+++ b/axial/lensplot.m
@@ -0,0 +1,116 @@
+%------------------------------------------------------------------------
+% Draws a representation of a lens at the position and angle specified.
+%
+% SYNTAX: [handle,texthandle,pos,rotpos]
+% =lensplot(d <,t,x,y,theta,lambda,label,labelpos,suppress>);
+%
+% INPUT ARGUMENTS:
+% d = diameter of the lens. The lens radius of curvature is assumed
+% to be essentially infinite (1e30).
+% d can also be passed as a 2-element vector d=[diameter,radius],
+% where the first element is the lens diameter and the second
+% is the radius of curvature of the lens surface.
+% t = additional lens thickness (same units as the diameter)
+% x,y = x,y - position offset, default=0,0.
+% theta = rotation of optic axis counterclockwise relative to x-axis,
+% defaul=0
+% lambda = wavelength, default=1064 nm
+% label = string with which to label the lens, default is ''.
+% labelpos = 0 to put label at bottom, 1 to put label at top, default 0
+% suppress = set to 1 to suppress plotting, default 0.
+%
+% OUTPUT ARGUMENTS:
+% handle = handle of the trace plotted
+% texthandle= handle of the text label if supplied (otherwise -1)
+% pos = 2xn matrix. Second row is lens face height, first row is
+% the corresponding position along the optic axis, measured
+% from the point at which q is specified.
+% rotpos = 2xn matrix. x,y coordinates of the lens trace,
+% first row corresponds to x coord's, second row to y coord's.
+%
+% Last Modified: Dec. 10, 2003 by Andri M. Gretarsson.
+%
+%-------------------------------------------------------------------------
+% SYNTAX: [handle,texthandle,pos,rotpos]
+% =lensplot(d <,t,x,y,theta,lambda,label,labelpos,suppress>);
+%-------------------------------------------------------------------------
+
+function [handle,texthandle]=lensplot(d,varargin)
+
+if size(d,2)>1, Rlens=d(2); else Rlens=1e30; end
+if nargin>=2, t=varargin{1}; else t=0; end
+if nargin>=3, x=varargin{2}; else x=0; end
+if nargin>=4, y=varargin{3}; else y=0; end
+if nargin>=5, theta=varargin{4}*pi/180; else theta=0; end
+if nargin>=6, lambda=varargin{5}; else lambda=1064e-9; end
+if nargin>=7, label=varargin{6}; else label=''; end
+if nargin>=8, labelpos=varargin{7}; else labelpos=0; end
+if nargin>=9, suppress=varargin{8}; else suppress=0; end
+
+lensheight=d(1)/2;
+phimax=asin(lensheight/Rlens);
+phi=-phimax:phimax/100:phimax;
+if Rlens>=0
+ curvethickness=abs(Rlens-Rlens*cos(phimax));
+ xleftside=Rlens*(cos(phimax)-cos(phi))+curvethickness;
+ xrightside=-Rlens*(cos(phimax)-cos(phi))+curvethickness+t;
+ xtop=[max(xleftside),min(xrightside)];
+ xbottom=[max(xleftside),min(xrightside)];
+ xcenter=t/2+curvethickness;
+else
+ curvethickness=abs(Rlens-Rlens*cos(phimax));
+ xleftside=Rlens*(cos(phimax)-cos(phi));
+ xrightside=-Rlens*(cos(phimax)-cos(phi))+t+2*curvethickness;
+ xtop=[min(xleftside),max(xrightside)];
+ xbottom=[min(xleftside),max(xrightside)];
+ xcenter=curvethickness+t/2;
+end
+yleftside=Rlens*sin(phi);
+yrightside=yleftside;
+
+rightside=[xrightside;yrightside];
+leftside=[xleftside;yleftside];
+top=[xtop;[max(yleftside),max(yrightside)]];
+bottom=[xbottom;[min(yleftside),min(yrightside)]];
+
+rotmat=[[cos(theta), -sin(theta)];[sin(theta), cos(theta)]];
+rotrightside=rotmat*(rightside-[ones(size(rightside(1,:)))*xcenter;zeros(size(rightside(2,:)))]);
+rotleftside=rotmat*(leftside-[ones(size(rightside(1,:)))*xcenter;zeros(size(rightside(2,:)))]);
+rottop=rotmat*(top-[ones(size(top(1,:)))*xcenter;zeros(size(top(2,:)))]);
+rotbottom=rotmat*(bottom-[ones(size(bottom(1,:)))*xcenter;zeros(size(bottom(2,:)))]);
+
+rotrightside(1,:)=rotrightside(1,:)+x+xcenter;
+rotrightside(2,:)=rotrightside(2,:)+y;
+rotleftside(1,:)=rotleftside(1,:)+x+xcenter;
+rotleftside(2,:)=rotleftside(2,:)+y;
+rottop(1,:)=rottop(1,:)+x+xcenter;
+rottop(2,:)=rottop(2,:)+y;
+rotbottom(1,:)=rotbottom(1,:)+x+xcenter;
+rotbottom(2,:)=rotbottom(2,:)+y;
+
+switch labelpos
+case 2,
+ augmentedlabel=[' ',label];
+ xtextpos=max(rotrightside(1,:));
+ ytextpos=( min(rotrightside(2,:)) + max(rotrightside(2,:)) )/2;
+case 0,
+ augmentedlabel=strvcat(' ',label); %#ok<VCAT>
+ xtextpos=max(rotrightside(1,:));
+ ytextpos=min(rotrightside(2,:));
+case 1,
+ augmentedlabel=strvcat(label,' '); %#ok<VCAT>
+ xtextpos=max(rotrightside(1,:));
+ ytextpos=max(rotrightside(2,:));
+end
+
+if suppress~=1
+ handle=plot(rotrightside(1,:),rotrightside(2,:),'k-',...
+ rotleftside(1,:),rotleftside(2,:),'k-',...
+ rottop(1,:),rottop(2,:),'k-',...
+ rotbottom(1,:),rotbottom(2,:),'k-');
+ if ~isempty(label)
+ texthandle=text(xtextpos,ytextpos,augmentedlabel);
+ else
+ texthandle=-1;
+ end
+end \ No newline at end of file