0001 function posdata = atgeometry3(ring,varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 [hangle,args]=getoption(varargin,'Hangle',0);
0027 [vangle,args]=getoption(args,'Vangle',0);
0028 [refpts,offset]=parseargs({1:length(ring)+1,[0 0 0]},args);
0029 conv=eye(3);
0030 hkick(hangle);
0031 vkick(vangle);
0032 xyzc=[0;0;0];
0033 if isscalar(offset)
0034 xyzc(2)=offset;
0035 else
0036 xyzc(1:length(offset))=offset';
0037 end
0038 [xx,yy,zz]=cellfun(@incr,[{struct()};ring]);
0039 posdata=struct('x',num2cell(xx(refpts)),'y',num2cell(yy(refpts)),...
0040 'z',num2cell(zz(refpts)));
0041
0042 function varargout=incr(elem)
0043 if isfield(elem,'R1')
0044 rots(elem.R1);
0045 end
0046 if isfield(elem,'BendingAngle')
0047 ang=0.5*elem.BendingAngle;
0048 L=elem.Length/ang*sin(ang);
0049 hkick(-ang);
0050 xyzc=xyzc+conv*[L;0;0];
0051 hkick(-ang);
0052 elseif isfield(elem,'Length')
0053 L=elem.Length;
0054 xyzc=xyzc+conv*[L;0;0];
0055 end
0056 if isfield(elem,'R2')
0057 rots(elem.R2);
0058 end
0059 varargout=num2cell(xyzc');
0060 end
0061 function rots(R)
0062 cns=R(1,1);
0063 sns=R(1,3);
0064 conv=conv*[1 0 0;0 cns -sns;0 sns cns];
0065 end
0066 function hkick(ang)
0067 cns=cos(ang);
0068 sns=sin(ang);
0069 conv=conv*[cns -sns 0;sns cns 0;0 0 1];
0070 end
0071 function vkick(ang)
0072 cns=cos(ang);
0073 sns=sin(ang);
0074 conv=conv*[cns 0 -sns;0 1 0;sns 0 cns];
0075 end
0076 end
0077