0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 function [DataOut,DataOut_1]=phys_polar(varargin)
0016 Calib{1}=[];
0017 if nargin==2||nargin==4
0018 Data=varargin{1};
0019 DataOut=Data;
0020 DataOut_1=[];
0021 CalibData=varargin{2};
0022 if isfield(CalibData,'GeometryCalib')
0023 Calib{1}=CalibData.GeometryCalib;
0024 end
0025 Calib{2}=Calib{1};
0026 else
0027 DataOut.Txt='wrong input: need two or four structures';
0028 end
0029 test_1=0;
0030 if nargin==4
0031 test_1=1;
0032 Data_1=varargin{3};
0033 DataOut_1=Data_1;
0034 CalibData_1=varargin{4};
0035 if isfield(CalibData_1,'GeometryCalib')
0036 Calib{2}=CalibData_1.GeometryCalib;
0037 end
0038 end
0039
0040
0041
0042 origin_xy=[0 0];
0043 if isfield(Calib{1},'PolarCentre') && isnumeric(Calib{1}.PolarCentre)
0044 if isequal(length(Calib{1}.PolarCentre),2);
0045 origin_xy= Calib{1}.PolarCentre;
0046 end
0047 end
0048 radius_offset=0;
0049 angle_offset=0;
0050 if isfield(Calib{1},'PolarReferenceRadius') && isnumeric(Calib{1}.PolarReferenceRadius)
0051 radius_offset=Calib{1}.PolarReferenceRadius;
0052 end
0053 if radius_offset > 0
0054 angle_scale=radius_offset;
0055 else
0056 angle_scale=180/pi;
0057 end
0058 if isfield(Calib{1},'PolarReferenceAngle') && isnumeric(Calib{1}.PolarReferenceAngle)
0059 angle_offset=Calib{1}.PolarReferenceAngle;
0060 end
0061
0062
0063
0064
0065
0066 iscalar=0;
0067 if ~isempty(Calib{1})
0068 DataOut=phys_1(Data,Calib{1},origin_xy,radius_offset,angle_offset,angle_scale);
0069
0070 if isfield(Data,'A')&isfield(Data,'AX')&~isempty(Data.AX) & isfield(Data,'AY')&...
0071 ~isempty(Data.AY)&length(Data.A)>1
0072 iscalar=1;
0073 A{1}=Data.A;
0074 end
0075
0076 if isfield(Data,'ZIndex')&~isempty(Data.ZIndex)
0077 ZIndex=Data.ZIndex;
0078 else
0079 ZIndex=0;
0080 end
0081 end
0082
0083 if test_1
0084 DataOut_1=phys_1(Data_1,Calib{2},origin_xy,radius_offset,angle_offset,angle_scale);
0085 if isfield(Data_1,'A')&isfield(Data_1,'AX')&~isempty(Data_1.AX) & isfield(Data_1,'AY')&...
0086 ~isempty(Data_1.AY)&length(Data_1.A)>1
0087 iscalar=iscalar+1;
0088 Calib{iscalar}=Calib{2};
0089 A{iscalar}=Data_1.A;
0090 if isfield(Data_1,'ZIndex')&~isequal(Data_1.ZIndex,ZIndex)
0091 DataOut.Txt='inconsistent plane indexes in the two input fields';
0092 end
0093 if iscalar==1
0094 [A,AX,AY]=phys_Ima(A,Calib,ZIndex,origin_xy,radius_offset,angle_offset,angle_scale);
0095 DataOut_1.A=A{1};
0096 DataOut_1.AX=AX;
0097 DataOut_1.AY=AY;
0098 return
0099 end
0100 end
0101 end
0102 if iscalar~=0
0103 [A,AX,AY]=phys_Ima(A,Calib,ZIndex,origin_xy,radius_offset,angle_offset,angle_scale);
0104 DataOut.A=A{1};
0105 DataOut.AX=AX;
0106 DataOut.AY=AY;
0107 if iscalar==2
0108 DataOut_1.A=A{2};
0109 DataOut_1.AX=AX;
0110 DataOut_1.AY=AY;
0111 end
0112 end
0113
0114
0115 function DataOut=phys_1(Data,Calib,origin_xy,radius_offset,angle_offset,angle_scale)
0116
0117 DataOut=Data;
0118 DataOut.CoordType='phys';
0119 if isfield(Calib,'CoordUnit')
0120 DataOut.CoordUnit=Calib.CoordUnit;
0121 else
0122 DataOut.CoordUnit='cm';
0123 end
0124 DataOut.TimeUnit='s';
0125
0126 if isfield(Data,'CoordType') && isequal(Data.CoordType,'px') && ~isempty(Calib)
0127 if isfield(Data,'CoordUnit')
0128 DataOut=rmfield(DataOut,'CoordUnit');
0129 end
0130
0131 if isfield(Data,'ZIndex')&~isempty(Data.ZIndex)
0132 Z=Data.ZIndex;
0133 else
0134 Z=0;
0135 end
0136 if isfield(Data,'X') &isfield(Data,'Y')&~isempty(Data.X) & ~isempty(Data.Y)
0137 [DataOut.X,DataOut.Y,DataOut.Z]=phys_XYZ(Calib,Data.X,Data.Y,Z);
0138 DataOut.X=DataOut.X-origin_xy(1);
0139 DataOut.Y=DataOut.Y-origin_xy(2);
0140 [theta,DataOut.X] = cart2pol(DataOut.X,DataOut.Y);
0141
0142 DataOut.X=DataOut.X-radius_offset;
0143 DataOut.Y=theta*angle_scale-angle_offset;
0144
0145 if isfield(Data,'U')&isfield(Data,'V')&~isempty(Data.U) & ~isempty(Data.V)& isfield(Data,'dt')
0146 if ~isempty(Data.dt)
0147 [XOut_1,YOut_1]=phys_XYZ(Calib,Data.X-Data.U/2,Data.Y-Data.V/2,Z);
0148 [XOut_2,YOut_2]=phys_XYZ(Calib,Data.X+Data.U/2,Data.Y+Data.V/2,Z);
0149 UX=(XOut_2-XOut_1)/Data.dt;
0150 VY=(YOut_2-YOut_1)/Data.dt;
0151
0152 DataOut.U=UX.*cos(theta)+VY.*sin(theta);
0153 DataOut.V=(-UX.*sin(theta)+VY.*cos(theta));
0154
0155 end
0156 end
0157 end
0158 end
0159
0160
0161
0162 function [A_out,Rangx,Rangy]=phys_Ima(A,CalibIn,ZIndex,origin_xy,radius_offset,angle_offset,angle_scale)
0163 xcorner=[];
0164 ycorner=[];
0165 npx=[];
0166 npy=[];
0167
0168 for icell=1:length(A)
0169 siz=size(A{icell});
0170 npx=[npx siz(2)];
0171 npy=[npy siz(1)];
0172 zphys=0;
0173 if isfield(CalibIn{icell},'SliceCoord')
0174 SliceCoord=CalibIn{icell}.SliceCoord(ZIndex,:);
0175 zphys=SliceCoord(3);
0176 end
0177 xima=[0.5 siz(2)-0.5 0.5 siz(2)-0.5];
0178 yima=[0.5 0.5 siz(1)-0.5 siz(1)-0.5];
0179 [xcorner_new,ycorner_new]=phys_XYZ(CalibIn{icell},xima,yima,ZIndex);
0180
0181 xcorner_new=xcorner_new-origin_xy(1);
0182 ycorner_new=ycorner_new-origin_xy(2);
0183 [theta,xcorner_new] = cart2pol(xcorner_new,ycorner_new);
0184 if (max(theta)-min(theta))>pi
0185 xcorner_new=[0 max(xcorner_new)];
0186 theta=[-pi pi];
0187 end
0188
0189 xcorner_new=xcorner_new-radius_offset;
0190 ycorner_new=theta*angle_scale-angle_offset;
0191 xcorner=[xcorner xcorner_new];
0192 ycorner=[ycorner ycorner_new];
0193 end
0194 Rangx(1)=min(xcorner);
0195 Rangx(2)=max(xcorner);
0196 Rangy(2)=min(ycorner);
0197 Rangy(1)=max(ycorner);
0198
0199 npx=max(npx);
0200 npy=max(npy);
0201 x=linspace(Rangx(1),Rangx(2),npx);
0202 y=linspace(Rangy(1),Rangy(2),npy);
0203 [X,Y]=meshgrid(x,y);
0204
0205 X=X+radius_offset;
0206 Y=(Y+angle_offset)/angle_scale;
0207 [X,Y] = pol2cart(Y,X);
0208 X=X+origin_xy(1);
0209 Y=Y+origin_xy(2);
0210 for icell=1:length(A)
0211 [XIMA,YIMA]=px_XYZ(CalibIn{icell},X,Y,zphys);
0212 XIMA=reshape(round(XIMA),1,npx*npy);
0213 YIMA=reshape(round(YIMA),1,npx*npy);
0214 flagin=XIMA>=1 & XIMA<=npx & YIMA >=1 & YIMA<=npy;
0215 vec_A=reshape(A{icell}(:,:,1),1,npx*npy);
0216 ind_in=find(flagin);
0217 ind_out=find(~flagin);
0218 ICOMB=((XIMA-1)*npy+(npy+1-YIMA));
0219 ICOMB=ICOMB(flagin);
0220 vec_B(ind_in)=vec_A(ICOMB);
0221 vec_B(ind_out)=zeros(size(ind_out));
0222 A_out{icell}=reshape(vec_B,npy,npx);
0223 end
0224
0225
0226