%------------------------------------------------------------------------ % 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 xtextpos=max(rotrightside(1,:)); ytextpos=min(rotrightside(2,:)); case 1, augmentedlabel=strvcat(label,' '); %#ok 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