1 |
function [line_handle] = pp(varargin) |
---|
2 |
|
---|
3 |
%PP Plots and manipulates polar plots |
---|
4 |
% |
---|
5 |
% PP(THETA,R) plots the polar representation of THEATA and R with the |
---|
6 |
% centre and max values being the minimum and maximum values of R. |
---|
7 |
% |
---|
8 |
% PP(THETA,R,S) plots as above, where S is a character string made from |
---|
9 |
% standard plotting formatting in the PLOT function. See HELP PLOT. |
---|
10 |
% |
---|
11 |
% PP(THETA,R,A) plots as above, but within the axis limits of A. A is |
---|
12 |
% a 1x2 or 2x1 array containing the centre value and maximum value of |
---|
13 |
% the polar plot ring axes. |
---|
14 |
% |
---|
15 |
% PP(THETA,R,'Property 1',...) plots as above with the selected |
---|
16 |
% properties. See below for propterties. |
---|
17 |
% |
---|
18 |
% PP('Property 1',...) edits the current figure (if it is a polar plot |
---|
19 |
% figure) to the assigned properties. |
---|
20 |
% |
---|
21 |
% PP('Trace', 3, 'Property 1', ... , 'Trace', 1, 'Property 10', ... ) |
---|
22 |
% changes properties of trace 3 and trace one. Any properties defined |
---|
23 |
% after the trace belong to that trace until a new trace number is |
---|
24 |
% defined. |
---|
25 |
% |
---|
26 |
% PROPERTIES: DEFAULT POSSIBLE |
---|
27 |
% --------------- ----------- ---------- |
---|
28 |
% |
---|
29 |
% GENERAL PLOTTING: |
---|
30 |
% 'ThetaDirection' 'ccw' 'cw','ccw' |
---|
31 |
% 'LineStyle' '-' see PLOT |
---|
32 |
% 'LineWidth' 1 1,2,... |
---|
33 |
% 'LineColor' 'b' see PLOT or RGB vector |
---|
34 |
% 'Marker' 'none' see PLOT |
---|
35 |
% 'ThetaStartAngle' 0 0-360 |
---|
36 |
% 'ppStyle' 0 0,1,2 |
---|
37 |
% |
---|
38 |
% AXES RANGE: |
---|
39 |
% 'MaxValue' 'max' numeric value (greater than CetreValue) |
---|
40 |
% 'CentreValue' 'min' numeric value (less than MaxValue) |
---|
41 |
% |
---|
42 |
% ANGLE AXIS: |
---|
43 |
% 'AngleAxis' 'on' 'on','off','none' |
---|
44 |
% 'AngleStep' 30 numeric value |
---|
45 |
% 'AngleAxisStyle' ':' see PLOT |
---|
46 |
% 'AngleAxisColor' black see PLOT or RGB vector |
---|
47 |
% 'AngleLineWidth' 1 1,2,... |
---|
48 |
% 'AngleLabel' 'on' 'on','off','none' |
---|
49 |
% 'AngleLabelStep' same as axis numeric value |
---|
50 |
% 'AngleFontSize' 10 numeric value |
---|
51 |
% 'AngleFontColor' black see PLOT or RGB vector |
---|
52 |
% 'AngleFontWeight' 'normal' 'normal','bold','light','demi' |
---|
53 |
% 'AngleDegreeMark' 'off' 'off',0, 'on',1 |
---|
54 |
% |
---|
55 |
% RING AXIS: |
---|
56 |
% 'NumRings' 4 integer value >= 0 |
---|
57 |
% 'RingAxis' 'on' 'on','off','none' |
---|
58 |
% 'RingAxisStyle' ':' see PLOT |
---|
59 |
% 'RingAxisColor' black see PLOT or RGB vector |
---|
60 |
% 'RingStep' cal. from No. rings integer value > 0 |
---|
61 |
% 'RingLineWidth' 0.1 1,2,... |
---|
62 |
% 'RingLabel' 'on' 'on','off','none' |
---|
63 |
% 'RingFontSize' 10 numeric value |
---|
64 |
% 'RingFontWeight' 'normal' 'normal','bold','light','demi' |
---|
65 |
% 'RingFontColor' black see PLOT or RGB vector |
---|
66 |
% 'AxisOuterRingStyle' '-' see PLOT |
---|
67 |
% 'RingUnits' '' Some String Value |
---|
68 |
% 'MagMarkAngle' 45 0-360 |
---|
69 |
% |
---|
70 |
% FIGURE PROPERTIES: |
---|
71 |
% 'FigurePosition' |
---|
72 |
% 'FigureBackgroundColor' |
---|
73 |
% 'PlotBackgroundColor' |
---|
74 |
% 'PlotBorderColor' |
---|
75 |
% 'PlotBorderLineColor' |
---|
76 |
% |
---|
77 |
% TRACE: |
---|
78 |
% 'Trace' 1 any trace number |
---|
79 |
% 'LineStyle' '-' see PLOT |
---|
80 |
% 'LineWidth' 1 1,2,... |
---|
81 |
% 'LineColor' 'b' see PLOT or RGB vector |
---|
82 |
% 'Marker' 'none' see PLOT |
---|
83 |
% 'RhoData' |
---|
84 |
% 'ThetaData' |
---|
85 |
% |
---|
86 |
% OTHER: |
---|
87 |
% 'SetupVariables' |
---|
88 |
% 'Axes' |
---|
89 |
% |
---|
90 |
|
---|
91 |
% Author: Robert Schlub |
---|
92 |
% Last Modified: 4th December 2002 |
---|
93 |
|
---|
94 |
|
---|
95 |
%Setup global variables that will be used within function blocks |
---|
96 |
global DB args oc NewTrace Traces CreateNewFigure r theta tc axis_limits HoldWasOn ErrorFlag ppStyle; |
---|
97 |
|
---|
98 |
%default settings |
---|
99 |
tc = struct( 'line_color', [0 0 1] ,... RGB or PLOT value of line color |
---|
100 |
'line_style', '-' ,... line style string same as PLOT function |
---|
101 |
'line_width', 1 ,... line width of trace |
---|
102 |
'line_marker', 'none' ,... line marker style |
---|
103 |
'trace_index', 1 ,... trace number identifier |
---|
104 |
'trace_string', '' );% trace string identifier |
---|
105 |
|
---|
106 |
|
---|
107 |
oc = struct( 'theta_start', 0 ,... theta start angle in degrees |
---|
108 |
'angle_step', 30 ,... number of theta markers |
---|
109 |
'angle_label_step', 0 ,... number of theta labels |
---|
110 |
'number_of_rings', 4 ,... number of magnitude rings |
---|
111 |
'max_mag', 'max' ,... maximum ring magnitude ('max' makes data's max value it) |
---|
112 |
'centre_value', 'min' ,... minimum ring value (centre value) |
---|
113 |
'background_color', [0.8 0.8 0.8] ,... background color |
---|
114 |
'theta_direction', 'ccw' ,... direction of theta increment |
---|
115 |
'ring_step', 0 ,... step size of rings |
---|
116 |
'mag_mark_angle', 45 ,... angle of magnitude labels |
---|
117 |
'axes_hold', 'off' ,... flag to tell whether axis hold is on or off |
---|
118 |
'ring_color', 'k' ,... ring axis color |
---|
119 |
'ring_style', ':' ,... ring axis style |
---|
120 |
'ring_line_width', 0.1 ,... ring axis line width |
---|
121 |
'ring_border_line_width',0.5 ,... ring border line width |
---|
122 |
'angle_axis', '' ,... angle axis is ON or OFF |
---|
123 |
'angle_color', 'k' ,... angle axis color |
---|
124 |
'angle_style', ':' ,... angle axis style |
---|
125 |
'angle_label', '' ,... angle axis labels are ON or OFF |
---|
126 |
'angle_line_width', 0.1 ,... angle axis line width |
---|
127 |
'angle_font_size', 10 ,... angle axis font size |
---|
128 |
'angle_font_color', 'k' ,... angle axis font color |
---|
129 |
'angle_font_weight', 'normal' ,... angle axis font weight |
---|
130 |
'angle_degree_mark', 'off' ,... degree symbol placed with angle text |
---|
131 |
'ring_axis', '' ,... ring axis is ON or OFF |
---|
132 |
'ring_label', '' ,... ring axis labels are ON or OFF |
---|
133 |
'ring_font_size', 10 ,... ring axis font size |
---|
134 |
'ring_font_color', 'k' ,... ring axis font color |
---|
135 |
'ring_font_weight', 'normal' ,... ring axis font weight |
---|
136 |
'figure_position', [300 150 583 500] ,... figure position and size |
---|
137 |
'outer_ring_style', '-' ,... ring axis border style |
---|
138 |
'ring_units', '' ,... ring axis units string |
---|
139 |
'plot_area_color', [1 1 1] ,... color inside ring axes (the plot area) |
---|
140 |
'circ_border_color', '' ,... color of circular border |
---|
141 |
'circ_border_line_color', '' );% color of line defining circular border |
---|
142 |
|
---|
143 |
|
---|
144 |
|
---|
145 |
%First Argument defines what is expected as the user input to say which option is wanted |
---|
146 |
%First Flag is: 1 if there is data expected after the argurment |
---|
147 |
% 0 if no data expected but contents of third column gets copied into 4th column variable |
---|
148 |
%Second Flag is : s if string data only is expected |
---|
149 |
% v if numerical data only is expected (values) |
---|
150 |
% vs if numerical or string data can be accepted |
---|
151 |
% st if structure data expected |
---|
152 |
%Final string variable points to which variable which the corresponding data is to be assigned to |
---|
153 |
|
---|
154 |
% Argument flag flag variable to alter |
---|
155 |
args = {'SetupVariables' 1 'st' 'oc' %initial setup variables |
---|
156 |
'ThetaDirection' 1 's' 'oc.theta_direction' %theta direction (CW/CCW) |
---|
157 |
'CentreValue' 1 'vs' 'oc.centre_value' %centre value of graph |
---|
158 |
'MaxValue' 1 'vs' 'oc.max_mag' %max value of graph |
---|
159 |
'LineStyle' 1 's' 'Traces{TraceIndex*2}.line_style' %trace style |
---|
160 |
'LineWidth' 1 'v' 'Traces{TraceIndex*2}.line_width' %trace width |
---|
161 |
'LineColor' 1 'vs' 'Traces{TraceIndex*2}.line_color' %trace color |
---|
162 |
'Marker' 1 's' 'Traces{TraceIndex*2}.line_marker' %trace marker style |
---|
163 |
'ThetaStartAngle' 1 'v' 'oc.theta_start' %theta start angle (refer note below) |
---|
164 |
'AngleAxis' 1 's' 'oc.angle_axis' %angle axis is ON or OFF |
---|
165 |
'AngleStep' 1 'v' 'oc.angle_step' %angle axis step size (between axes) |
---|
166 |
'AngleAxisStyle' 1 's' 'oc.angle_style' %angle axis style |
---|
167 |
'AngleAxisColor' 1 'vs' 'oc.angle_color' %angle axis color |
---|
168 |
'AngleLineWidth' 1 'vs' 'oc.angle_line_width' %angle axis line width |
---|
169 |
'AngleLabel' 1 's' 'oc.angle_label' %angle axis label is ON or OFF |
---|
170 |
'AngleLabelStep' 1 'v' 'oc.angle_label_step' %angle axis label step size |
---|
171 |
'AngleFontSize' 1 'v' 'oc.angle_font_size' %angle axis label font size |
---|
172 |
'AngleFontColor' 1 'vs' 'oc.angle_font_color' %angle axis font color |
---|
173 |
'AngleFontWeight' 1 's' 'oc.angle_font_weight' %angle axis label font weight |
---|
174 |
'AngleDegreeMark', 1 'vs' 'oc.angle_degree_mark' %marks the degrees character with angle text |
---|
175 |
'NumRings' 1 'v' 'oc.number_of_rings' %ring axes number |
---|
176 |
'RingAxis' 1 's' 'oc.ring_axis' %ring axis is on or off |
---|
177 |
'RingAxisStyle' 1 's' 'oc.ring_style' %ring axis style |
---|
178 |
'RingAxisColor' 1 'vs' 'oc.ring_color' %ring axis color |
---|
179 |
'RingStep' 1 'v' 'oc.ring_step' %ring axis step size |
---|
180 |
'RingBorderLineWidth' 1 'v' 'oc_ring_border_line_width' %ring border line width |
---|
181 |
'RingLineWidth' 1 'vs' 'oc.ring_line_width' %ring axis line width |
---|
182 |
'RingLabel' 1 's' 'oc.ring_label' %ring axis labeling is ON or OFF |
---|
183 |
'RingFontSize' 1 'v' 'oc.ring_font_size' %ring axis label font size |
---|
184 |
'RingFontWeight' 1 's' 'oc.ring_font_weight' %ring axis label font size |
---|
185 |
'RingFontColor' 1 'vs' 'oc.ring_font_color' %ring axis font color |
---|
186 |
'AxisOuterRingStyle' 1 's' 'oc.outer_ring_style' %ring axis border (circumference) style |
---|
187 |
'RingUnits' 1 's' 'oc.ring_units' %ring axis label units |
---|
188 |
'MagMarkAngle' 1 'v' 'oc.mag_mark_angle' %ring axis label angle |
---|
189 |
'FigurePosition' 1 'vs' 'oc.figure_position' %position and size of figure on screen |
---|
190 |
'FigureBackgroundColor' 1 'vs' 'oc.background_color' %figure background color (outside plot area) |
---|
191 |
'PlotBackgroundColor' 1 'vs' 'oc.plot_area_color' %plot area background color |
---|
192 |
'PlotBorderLineColor' 1 'vs' 'oc.circ_border_line_color' %circular border line color |
---|
193 |
'PlotBorderColor' 1 'vs' 'oc.circ_border_color' %circular border color |
---|
194 |
'Axis' 1 'vs' 'axis_limits' %limits of axis |
---|
195 |
'Axes' 1 'vs' 'axis_limits' %limits of axes (as in plural spelling but same result) |
---|
196 |
'Trace' 1 'v' 'TraceIndex' %current trace number - used to edit plot parameters of the trace |
---|
197 |
'ThetaData', 1 'v' 'Traces{TraceIndex*2-1}(:,2)' %Theta data |
---|
198 |
'RhoData', 1 'v' 'Traces{TraceIndex*2-1}(:,1)' %Rho Data |
---|
199 |
'ppStyle', 1 'v' 'ppStyle' %A style of axes presentation |
---|
200 |
}; |
---|
201 |
%NOTES: |
---|
202 |
%ThetaStartAngle is relative to the direction of theta. ie, a start angle of 90 will be 180 differnt between |
---|
203 |
%clock wise and counter clock wise direction of theta. |
---|
204 |
|
---|
205 |
%Setup a space for Traces |
---|
206 |
Traces = ''; |
---|
207 |
|
---|
208 |
%set up the variable axis limits. It is a 1x2 array whose first element contains the centre value and second |
---|
209 |
%element contains the max magnitude. |
---|
210 |
axis_limits = [0 0]; |
---|
211 |
|
---|
212 |
%If ErrorFlag ever goes to 1 then will be quitting out |
---|
213 |
ErrorFlag = 0; |
---|
214 |
|
---|
215 |
%Set default value of ppStyle |
---|
216 |
%Style Types: |
---|
217 |
% 0: No Changes |
---|
218 |
% 1: Default |
---|
219 |
% 2: Grey solid axes with 'dB' as ring units and degree marks present |
---|
220 |
% |
---|
221 |
ppStyle = 0; |
---|
222 |
|
---|
223 |
|
---|
224 |
|
---|
225 |
|
---|
226 |
|
---|
227 |
|
---|
228 |
|
---|
229 |
|
---|
230 |
|
---|
231 |
|
---|
232 |
|
---|
233 |
|
---|
234 |
|
---|
235 |
|
---|
236 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
237 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
238 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
239 |
% % |
---|
240 |
% MAIN % |
---|
241 |
% % |
---|
242 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
243 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
244 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
245 |
|
---|
246 |
%First check all input arguments and ensure they are valid. Also get back a flag to say whether the new data |
---|
247 |
%is being added or not (if not, then simple figure/axes/current_trace properties are being changed |
---|
248 |
CheckInput(varargin); |
---|
249 |
if ErrorFlag, return; end |
---|
250 |
|
---|
251 |
%if NewTrace == 0 or hold is on, then load the user_data from the current figure and fill 'oc' and 'Traces' |
---|
252 |
LoadExistingData; |
---|
253 |
if ErrorFlag, return; end |
---|
254 |
|
---|
255 |
%Assign input arguments to their corresponding variables |
---|
256 |
AssignInput(varargin); %this will overwrite any varibales in oc etc that have been updated |
---|
257 |
if ErrorFlag, return; end |
---|
258 |
|
---|
259 |
AssignStyle(ppStyle); |
---|
260 |
if ErrorFlag, return; end |
---|
261 |
|
---|
262 |
CheckAxisLimits; |
---|
263 |
if ErrorFlag, return; end |
---|
264 |
|
---|
265 |
CheckPlotLimits; |
---|
266 |
if ErrorFlag, return; end |
---|
267 |
|
---|
268 |
SetupFigure; |
---|
269 |
|
---|
270 |
%Save Userdata to figure |
---|
271 |
UserData{1} = 'Bobs Polar Plot'; |
---|
272 |
UserData{2} = oc; |
---|
273 |
UserData = [UserData Traces]; |
---|
274 |
set(gcf,'UserData', UserData); %save updated trace data into figure |
---|
275 |
|
---|
276 |
PlotAxes; |
---|
277 |
|
---|
278 |
for i=1:2:length(Traces) |
---|
279 |
ThetaPlot = SetupTheta( Traces{i}(:,2) ); |
---|
280 |
DB = 0; |
---|
281 |
if(i>1) |
---|
282 |
DB = 1; |
---|
283 |
% keyboard |
---|
284 |
end |
---|
285 |
|
---|
286 |
[RPlot ThetaPlot PlotProperties] = SetupR( Traces{i}(:,1) , ThetaPlot ); |
---|
287 |
PlotTrace(ThetaPlot, RPlot, PlotProperties, Traces{i+1}); |
---|
288 |
end |
---|
289 |
|
---|
290 |
if HoldWasOn == 0 |
---|
291 |
hold off |
---|
292 |
end |
---|
293 |
|
---|
294 |
|
---|
295 |
|
---|
296 |
|
---|
297 |
|
---|
298 |
|
---|
299 |
|
---|
300 |
|
---|
301 |
|
---|
302 |
|
---|
303 |
|
---|
304 |
|
---|
305 |
|
---|
306 |
|
---|
307 |
|
---|
308 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
309 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
310 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
311 |
% % |
---|
312 |
% CHECK INPUT % |
---|
313 |
% % |
---|
314 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
315 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
316 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
317 |
|
---|
318 |
%This function will go through the input string entered into pp(). It will simply ensure |
---|
319 |
%valid ordering of commands and will assign NewTrace a value depending on if Trace Data |
---|
320 |
%is present or not in the input arguments |
---|
321 |
|
---|
322 |
function CheckInput(VariableArgIn) |
---|
323 |
|
---|
324 |
global args NewTrace ErrorFlag; |
---|
325 |
|
---|
326 |
%find the number or inputs and the number of possible arguments |
---|
327 |
num_inputs = length(VariableArgIn); |
---|
328 |
|
---|
329 |
m = 0; |
---|
330 |
NewTrace = 0; %This is set if there is data (in the form of a trace) to be added to the plot |
---|
331 |
|
---|
332 |
%now, step through all the arguments and compare them to valid arguments |
---|
333 |
while m < num_inputs %number of inputs into function (ie number of variables separated by commas) |
---|
334 |
m = m + 1; |
---|
335 |
n = 0; |
---|
336 |
|
---|
337 |
%if the first element is numeric check the second element to ensure it is also numberic and the same length |
---|
338 |
%as theta and r must be the same sizes |
---|
339 |
if m == 1 & isnumeric(VariableArgIn{m}) |
---|
340 |
%check to make sure there is a second input argument |
---|
341 |
if num_inputs < 2 |
---|
342 |
DispError('No Rho values Present'); |
---|
343 |
return |
---|
344 |
end |
---|
345 |
if isnumeric(VariableArgIn{m+1}) & max(length(VariableArgIn{m+1})) == max(length(VariableArgIn{m})) |
---|
346 |
m = 2; %move to after the RHO element which was just analysed |
---|
347 |
%now check to see if the next input is the axes limits (it will be if its a numeric value) |
---|
348 |
%this is the only case the third input can be numeric (without a property identifier) |
---|
349 |
if num_inputs > 2 |
---|
350 |
if isnumeric(VariableArgIn{m+1}) %m = 3 now |
---|
351 |
m = 3; %move to after the AXIS LIMITS variable which was just analysed |
---|
352 |
end |
---|
353 |
end |
---|
354 |
else |
---|
355 |
DispError('THETA and R must be an equal length 1xm or mx1 array or variables'); |
---|
356 |
return |
---|
357 |
end |
---|
358 |
|
---|
359 |
%if we have got here without error then there is a valid new trace being added or created |
---|
360 |
NewTrace = 1; |
---|
361 |
continue; %skip through to start of while loop again |
---|
362 |
end |
---|
363 |
|
---|
364 |
%search for the string in the args array and return the args index |
---|
365 |
index = FindArgsIndex(VariableArgIn{m}); |
---|
366 |
|
---|
367 |
%if an index was found and another agument is expected to complete it, then ensure that |
---|
368 |
%the input after it is valid (string, value of struct) |
---|
369 |
if index > 0 & args{index,2} == 1 %if another argument is expected to complete this one |
---|
370 |
if m + 1 > num_inputs %if there is no more completeing argument |
---|
371 |
DispError(['No input argument for "' VariableArgIn{m} '"']) %exit |
---|
372 |
return |
---|
373 |
end |
---|
374 |
%check 2nd flag of args to see if string or number is expected |
---|
375 |
switch args{index,3} |
---|
376 |
case 'v' %assign variable with number |
---|
377 |
if ischar(VariableArgIn{m+1}) |
---|
378 |
DispError(['The input argument for "' VariableArgIn{m} '" must be numerical']); |
---|
379 |
return |
---|
380 |
end %note the lack of break sends the case through to string check |
---|
381 |
case 's' %assign variable with string |
---|
382 |
if ischar(VariableArgIn{m+1}) == 0 |
---|
383 |
DispError(['The input argument for "' VariableArgIn{m} '" must be a string']); |
---|
384 |
return |
---|
385 |
end |
---|
386 |
case 'vs' |
---|
387 |
if (ischar(VariableArgIn{m+1}) == 0 & isnumeric(VariableArgIn{m+1}) == 0) |
---|
388 |
DispError(['The input argument for "' VariableArgIn{m} '" must be either numerical, or a string (not a cell, struct etc.)']); |
---|
389 |
return |
---|
390 |
end |
---|
391 |
case 'st' %the only structure is the 'SetupVariables' cell |
---|
392 |
if isstruct(VariableArgIn{m+1}) == 0 |
---|
393 |
DispError(['The input argument for "' VariableArgIn{m} '" must be a structure']); |
---|
394 |
return |
---|
395 |
end |
---|
396 |
end |
---|
397 |
m = m+1; %increment the m counter so that input of the argument is not checked as an argument |
---|
398 |
|
---|
399 |
%in the case that the string wasn't found in args, it might be a standard plotting string. This will only |
---|
400 |
%happen if m = 3 and a trace is being added. If thats the case then ensure then ensure the string is valid |
---|
401 |
elseif index == 0 & m == 3 & NewTrace & length(VariableArgIn{m}) <= 4 |
---|
402 |
CheckStandardPlot(VariableArgIn{m}); %this will quit out if there is a syntax error in the string |
---|
403 |
if ErrorFlag, return; end |
---|
404 |
|
---|
405 |
%Otherwise the string is not valid |
---|
406 |
else |
---|
407 |
DispError(['The argument "' VariableArgIn{m} '" is not valid. See help']); |
---|
408 |
return |
---|
409 |
end |
---|
410 |
end |
---|
411 |
|
---|
412 |
|
---|
413 |
|
---|
414 |
|
---|
415 |
|
---|
416 |
|
---|
417 |
|
---|
418 |
|
---|
419 |
|
---|
420 |
|
---|
421 |
|
---|
422 |
|
---|
423 |
|
---|
424 |
|
---|
425 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
426 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
427 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
428 |
% % |
---|
429 |
% LoadExistingData - LOAD EXISTING DATA % |
---|
430 |
% % |
---|
431 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
432 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
433 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
434 |
|
---|
435 |
%If hold is on or existing figure properties are being modified, then load the existing figures user_data |
---|
436 |
function LoadExistingData |
---|
437 |
|
---|
438 |
global Traces oc NewTrace CreateNewFigure HoldWasOn; |
---|
439 |
|
---|
440 |
%Default is to Create a new figure |
---|
441 |
CreateNewFigure = 1; |
---|
442 |
|
---|
443 |
%Default HoldWasOn flag is 0 (ie hold was not on) |
---|
444 |
HoldWasOn = 0; |
---|
445 |
|
---|
446 |
if max(findobj) ~= 0 |
---|
447 |
%if hold is on then set the HoldWasOn flag so it can be turned on after all plotting complete |
---|
448 |
|
---|
449 |
if ishold |
---|
450 |
HoldWasOn = 1; |
---|
451 |
end |
---|
452 |
|
---|
453 |
%if the current figure has hold on or we are editing an existing figure then we need to check to make sure its valid |
---|
454 |
if ishold | NewTrace==0 |
---|
455 |
user_data = get(gcf, 'UserData'); |
---|
456 |
if ~strcmp(user_data{1}, 'Bobs Polar Plot') |
---|
457 |
DispError('Current figure is not a valid polar plot figure - it must be created using the pp function'); |
---|
458 |
return |
---|
459 |
end |
---|
460 |
|
---|
461 |
%If the figure is valid, then load the oc structure from it |
---|
462 |
oc = user_data{2}; |
---|
463 |
|
---|
464 |
%Load the existing Traces |
---|
465 |
if(length(user_data)>2) |
---|
466 |
Traces = cell(1,length(user_data)-2); |
---|
467 |
for i=1:length(user_data)-2 |
---|
468 |
Traces{i} = user_data{i+2}; |
---|
469 |
end |
---|
470 |
end |
---|
471 |
|
---|
472 |
%if hold is on, or just properties are being added then we don't want to be creating a new figure later on |
---|
473 |
CreateNewFigure = 0; |
---|
474 |
end |
---|
475 |
%Otherwise if no figure is present but no new trace data exists then there is an error |
---|
476 |
elseif NewTrace == 0 |
---|
477 |
DispError('No figure to modify properties of'); |
---|
478 |
return |
---|
479 |
end |
---|
480 |
|
---|
481 |
|
---|
482 |
|
---|
483 |
|
---|
484 |
|
---|
485 |
|
---|
486 |
|
---|
487 |
|
---|
488 |
|
---|
489 |
|
---|
490 |
|
---|
491 |
|
---|
492 |
|
---|
493 |
|
---|
494 |
|
---|
495 |
|
---|
496 |
|
---|
497 |
|
---|
498 |
|
---|
499 |
|
---|
500 |
|
---|
501 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
502 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
503 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
504 |
% % |
---|
505 |
% ASIGN INPUT % |
---|
506 |
% % |
---|
507 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
508 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
509 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
510 |
|
---|
511 |
function AssignInput(VariableArgIn) |
---|
512 |
|
---|
513 |
global theta r args axis_limits NewTrace Traces tc oc ppStyle; |
---|
514 |
|
---|
515 |
num_inputs = length(VariableArgIn); |
---|
516 |
|
---|
517 |
%set default trace |
---|
518 |
TraceIndex = 1; |
---|
519 |
|
---|
520 |
m = 0; %needs to be zero for the while loop 35 lines below |
---|
521 |
|
---|
522 |
%First assign theta, r and axis_limits if a new trace is being entered |
---|
523 |
if NewTrace |
---|
524 |
|
---|
525 |
%If a trace is being added append two cells on the end of Traces (one for the r/theta values |
---|
526 |
%and the other for tc) |
---|
527 |
Traces = [Traces cell(1,2)]; |
---|
528 |
|
---|
529 |
%set the trace number an unassigned number |
---|
530 |
TraceIndex = length(Traces)/2; |
---|
531 |
|
---|
532 |
%setup the default trace properties structure; |
---|
533 |
tc.trace_index = TraceIndex; |
---|
534 |
Traces{TraceIndex*2} = tc; |
---|
535 |
|
---|
536 |
m = 1; %Look at the first element of VariableArgIn (which should be the theta data) |
---|
537 |
|
---|
538 |
theta = VariableArgIn{m}; %Get the Theta Data |
---|
539 |
|
---|
540 |
r = VariableArgIn{m+1}; %Get the Rho Data |
---|
541 |
|
---|
542 |
%set theta, rho and original theta to be column vectors if they aren't already |
---|
543 |
[rows cols] = size(theta); |
---|
544 |
if rows == 1 |
---|
545 |
theta = theta'; |
---|
546 |
end |
---|
547 |
[rows cols] = size(r); |
---|
548 |
if rows == 1 |
---|
549 |
r = r'; |
---|
550 |
end |
---|
551 |
|
---|
552 |
%assign the theta and r values to the appropriate trace |
---|
553 |
Traces{TraceIndex*2-1} = [r theta]; |
---|
554 |
|
---|
555 |
m = 2; %move to the RHO element which was just analysed |
---|
556 |
|
---|
557 |
%now check to see if the next input is the axes limits (it will be if its a numeric value) or |
---|
558 |
%the standard plot string (it will be if its a string that can't be found) |
---|
559 |
if num_inputs > 2 |
---|
560 |
%if numeric, then must be axis limits |
---|
561 |
if isnumeric(VariableArgIn{m+1}) %m = 2 now (3 lines up) |
---|
562 |
axis_limits = VariableArgIn{m+1}; |
---|
563 |
m = 3; %move to the axis limits variable which was just analysed |
---|
564 |
|
---|
565 |
%if string and non existant in args, then must be standard plotting values |
---|
566 |
elseif FindArgsIndex(VariableArgIn{m+1}) == 0 |
---|
567 |
[Color, Marker, Style] = CheckStandardPlot(VariableArgIn{m+1}); |
---|
568 |
%Assign the color, marker and style if they were defined |
---|
569 |
|
---|
570 |
if ~isempty(Color) |
---|
571 |
Traces{TraceIndex*2}.line_color = Color; |
---|
572 |
end |
---|
573 |
if ~isempty(Marker) |
---|
574 |
Traces{TraceIndex*2}.line_marker = Marker; |
---|
575 |
end |
---|
576 |
if ~isempty(Style) |
---|
577 |
Traces{TraceIndex*2}.line_style = Style; |
---|
578 |
end |
---|
579 |
m = 3; |
---|
580 |
end |
---|
581 |
end |
---|
582 |
end |
---|
583 |
|
---|
584 |
%now, step through all the remaining string arguments and compare them to valid arguments (in args) |
---|
585 |
while m < num_inputs %number of inputs into function (ie number of variables separated by commas) |
---|
586 |
m = m + 1; |
---|
587 |
|
---|
588 |
%find the index in args of the current input argument - we know the index exists as error checking |
---|
589 |
%has been done previously |
---|
590 |
index = FindArgsIndex(VariableArgIn{m}); |
---|
591 |
|
---|
592 |
%if another argument is expected to complete this one then assign it (error checking has already |
---|
593 |
%been performed) |
---|
594 |
if args{index,2} == 1 |
---|
595 |
eval([args{index,4} '= VariableArgIn{m+1};']) |
---|
596 |
m = m+1; %increment the m counter so that input of the argument is not checked as an argument |
---|
597 |
else %if no other arugument is needed assign third colum of args to variable in 4th column |
---|
598 |
eval([args{index,4} '= args{index,3}']); |
---|
599 |
end |
---|
600 |
end |
---|
601 |
|
---|
602 |
%NOTES: |
---|
603 |
% |
---|
604 |
% TaceIndex: The user must enter the argument "..., 'Trace', 3, ..." for trace parameters |
---|
605 |
% of trace 3 to be altered. In doing so, the while loop above will set TraceIndex |
---|
606 |
% to 3. Afterwards, when line style/color etc are altered the evaluation |
---|
607 |
% 'Traces{TraceIndex*2}.line_style' (see args) will be used so trace 3 will have |
---|
608 |
% its properties successfully altered. |
---|
609 |
|
---|
610 |
|
---|
611 |
|
---|
612 |
|
---|
613 |
|
---|
614 |
|
---|
615 |
|
---|
616 |
|
---|
617 |
|
---|
618 |
|
---|
619 |
|
---|
620 |
|
---|
621 |
|
---|
622 |
|
---|
623 |
|
---|
624 |
|
---|
625 |
|
---|
626 |
|
---|
627 |
|
---|
628 |
|
---|
629 |
|
---|
630 |
|
---|
631 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
632 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
633 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
634 |
% % |
---|
635 |
% FIND ARGS INDEX % |
---|
636 |
% % |
---|
637 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
638 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
639 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
640 |
|
---|
641 |
function [index] = FindArgsIndex(StringToFind) |
---|
642 |
global args; |
---|
643 |
index = 1; %start at the first row |
---|
644 |
|
---|
645 |
%search through the args struct till find index varibale in StringToFind |
---|
646 |
while ~strcmp(args{index,1},StringToFind) |
---|
647 |
index = index + 1; |
---|
648 |
|
---|
649 |
%if searched through entire args rows and couldn't find a match then break and return 0 |
---|
650 |
if index > length(args(:,1)) |
---|
651 |
index = 0; |
---|
652 |
break; |
---|
653 |
end |
---|
654 |
end |
---|
655 |
|
---|
656 |
|
---|
657 |
|
---|
658 |
|
---|
659 |
|
---|
660 |
|
---|
661 |
|
---|
662 |
|
---|
663 |
|
---|
664 |
|
---|
665 |
|
---|
666 |
|
---|
667 |
|
---|
668 |
|
---|
669 |
|
---|
670 |
|
---|
671 |
|
---|
672 |
|
---|
673 |
|
---|
674 |
|
---|
675 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
676 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
677 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
678 |
% % |
---|
679 |
% CHECK AXIS LIMITS % |
---|
680 |
% % |
---|
681 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
682 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
683 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
684 |
|
---|
685 |
function CheckAxisLimits |
---|
686 |
global oc axis_limits args |
---|
687 |
|
---|
688 |
%check to see if the axis_limits array elments are empty. If they are not, then it means they have been |
---|
689 |
%filled by the user in the arguments of the function call. Therefore, change the appropriate centre value |
---|
690 |
%and/or maximum magnitude. Because this happens after the assigning of arguments and their variables (above), |
---|
691 |
%then if the 'CentreValue' or 'MaxMag' arguments were used, then they will be overwritten by the axis_limits |
---|
692 |
if isnumeric(axis_limits) & (size(axis_limits) == [1 2] | size(axis_limits) == [2 1]) |
---|
693 |
%if both are zero then user hasn't changed axis (or if they have entered [0 0], then its invalid |
---|
694 |
%because you can't have centre value and max mag equal and therefore this pretends that they haven't |
---|
695 |
%been this stupid on purpose) |
---|
696 |
if axis_limits(1) ~= 0 | axis_limits(2) ~= 0 |
---|
697 |
%but sometimes, you just have to protect the users from themselves |
---|
698 |
if axis_limits(1) == axis_limits(2) |
---|
699 |
disp(' ');disp('Cannot make centre value and maximum mag value the same');disp(' '); |
---|
700 |
else |
---|
701 |
%if valid then assign the centre and max variables to their vew values |
---|
702 |
oc.centre_value = axis_limits(1); %set the center value to the first element |
---|
703 |
oc.max_mag = axis_limits(2); %set the max value to the second element |
---|
704 |
end |
---|
705 |
end |
---|
706 |
elseif ischar(axis_limits) & (strcmpi(axis_limits,'off') | strcmpi(axis_limits,'none')) |
---|
707 |
oc.ring_axis = 'off'; |
---|
708 |
oc.angle_axis = 'off'; |
---|
709 |
elseif ischar(axis_limits) & strcmpi(axis_limits,'on') |
---|
710 |
oc.ring_axis = 'on'; |
---|
711 |
oc.angle_axis = 'on'; |
---|
712 |
else |
---|
713 |
DispError('"Axis" must be followed by 1x2 or 2x1 numerical vector, or by "on", "off" or "none" strings'); |
---|
714 |
return |
---|
715 |
end |
---|
716 |
|
---|
717 |
|
---|
718 |
|
---|
719 |
|
---|
720 |
|
---|
721 |
|
---|
722 |
|
---|
723 |
|
---|
724 |
|
---|
725 |
|
---|
726 |
|
---|
727 |
|
---|
728 |
|
---|
729 |
|
---|
730 |
|
---|
731 |
|
---|
732 |
|
---|
733 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
734 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
735 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
736 |
% % |
---|
737 |
% SETUP FIGURE % |
---|
738 |
% % |
---|
739 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
740 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
741 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
742 |
function SetupFigure |
---|
743 |
|
---|
744 |
global CreateNewFigure oc |
---|
745 |
|
---|
746 |
%If creating a new figure (flag set in LoadExistingData) then create one |
---|
747 |
%if CreateNewFigure |
---|
748 |
% figure; |
---|
749 |
%else |
---|
750 |
clf reset; %Otherwise if hold is on, or property modification only, then reset |
---|
751 |
%end %the current figure for full redraw |
---|
752 |
|
---|
753 |
%Set the figure properties |
---|
754 |
set(gcf,'Color',oc.background_color,'Position',oc.figure_position) |
---|
755 |
|
---|
756 |
%Turn hold on for drawing of axes and traces |
---|
757 |
hold on |
---|
758 |
|
---|
759 |
|
---|
760 |
|
---|
761 |
|
---|
762 |
|
---|
763 |
|
---|
764 |
|
---|
765 |
|
---|
766 |
|
---|
767 |
|
---|
768 |
|
---|
769 |
|
---|
770 |
|
---|
771 |
|
---|
772 |
|
---|
773 |
|
---|
774 |
|
---|
775 |
|
---|
776 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
777 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
778 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
779 |
% % |
---|
780 |
% PLOT AXES % |
---|
781 |
% % |
---|
782 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
783 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
784 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
785 |
|
---|
786 |
function PlotAxes |
---|
787 |
|
---|
788 |
global oc r |
---|
789 |
|
---|
790 |
%check to see if the degrees character is supposed to be plotted or not |
---|
791 |
degrees_string = ''; |
---|
792 |
if(min(oc.angle_degree_mark == 1) == 1 | strcmp(oc.angle_degree_mark, 'on')) |
---|
793 |
degrees_string = '^{\o}'; |
---|
794 |
end |
---|
795 |
|
---|
796 |
%angle system for all corresponding axis |
---|
797 |
phi = 0:0.01:2*pi; |
---|
798 |
|
---|
799 |
%make a circle for the plot's circular border |
---|
800 |
if ~isempty(oc.circ_border_line_color) | ~isempty(oc.circ_border_color) |
---|
801 |
border_line = 1.3; |
---|
802 |
x = border_line*cos(phi); |
---|
803 |
y = border_line*sin(phi); |
---|
804 |
if ~isempty(oc.circ_border_color) |
---|
805 |
fill(x,y,oc.circ_border_color,'LineStyle','none','HandleVisibility','off'); |
---|
806 |
end |
---|
807 |
if ~isempty(oc.circ_border_line_color) |
---|
808 |
plot(x,y,'Color',oc.circ_border_line_color,'LineWidth',2,'HandleVisibility','off'); |
---|
809 |
end |
---|
810 |
axis([-1.55 1.55 -1.55 1.55]) |
---|
811 |
else |
---|
812 |
axis([-1.2 1.2 -1.2 1.2]) |
---|
813 |
end |
---|
814 |
|
---|
815 |
%Make up maximum magnitudes and minimum magnitudes |
---|
816 |
if strcmp(oc.max_mag,'max') |
---|
817 |
oc.max_mag = max(r); |
---|
818 |
end |
---|
819 |
|
---|
820 |
if strcmp(oc.centre_value, 'min') |
---|
821 |
oc.centre_value = min(r); |
---|
822 |
end |
---|
823 |
plot_range = oc.max_mag - oc.centre_value; |
---|
824 |
|
---|
825 |
%Draw the concentric circles (rings) |
---|
826 |
rings = 1; %outer ring |
---|
827 |
if oc.ring_step == 0 %if number of rings defined (default) and not ring step then... |
---|
828 |
for i = 1:1:oc.number_of_rings |
---|
829 |
rings = [rings (oc.number_of_rings-i)/oc.number_of_rings]; |
---|
830 |
end |
---|
831 |
else |
---|
832 |
if oc.ring_step > plot_range |
---|
833 |
disp('Warning: Ring step is larger than plotting range (max_mag - centre_value)'); |
---|
834 |
end |
---|
835 |
for i = 1-oc.ring_step/plot_range:-oc.ring_step/plot_range:0 %If user define ring step then... |
---|
836 |
rings = [rings i]; |
---|
837 |
end |
---|
838 |
|
---|
839 |
end |
---|
840 |
|
---|
841 |
%draw the plot fill circle only if one of the axes are on |
---|
842 |
if (~strcmpi(oc.ring_axis,'off') & ~strcmpi(oc.ring_axis,'none')) |... |
---|
843 |
(~strcmpi(oc.angle_axis, 'none') & ~strcmpi(oc.angle_axis, 'off')) |
---|
844 |
fill(cos(phi),sin(phi),oc.plot_area_color,'HandleVisibility','off') |
---|
845 |
end |
---|
846 |
|
---|
847 |
%only draw the ring axis and its labels if axis is not set of 'OFF' |
---|
848 |
if ~strcmpi(oc.ring_axis, 'off') & ~strcmpi(oc.ring_axis, 'none') |
---|
849 |
for i = 1:1:length(rings) %plot the rings |
---|
850 |
x = rings(i)*cos(phi); |
---|
851 |
y = rings(i)*sin(phi); |
---|
852 |
if(rings(i) == 1) %if on the outer ring, then make a solid line unless user specifies otherwise |
---|
853 |
plot(x,y,'Color',oc.ring_color,'LineStyle',oc.outer_ring_style,'LineWidth',oc.ring_border_line_width,... |
---|
854 |
'HandleVisibility','off'); |
---|
855 |
else |
---|
856 |
plot(x,y,'Color',oc.ring_color,'LineStyle',oc.ring_style,'LineWidth',oc.ring_line_width,... |
---|
857 |
'HandleVisibility','off'); |
---|
858 |
end |
---|
859 |
end |
---|
860 |
|
---|
861 |
%Draw on the text labeling the magnitude |
---|
862 |
angle_of_mark = oc.mag_mark_angle*pi/180; |
---|
863 |
if ~strcmpi(oc.ring_label,'off') & ~strcmpi(oc.ring_label,'none') %the strcmpi is case insensitive |
---|
864 |
for i = 1:1:length(rings) |
---|
865 |
x = (rings(i)+0.0*oc.max_mag)*cos(angle_of_mark); |
---|
866 |
y = (rings(i)+0.0*oc.max_mag)*sin(angle_of_mark); |
---|
867 |
if(rings(i) == 1) %if on the outer ring's value, then insert units if user has defined them |
---|
868 |
text(x,y,[num2str(round(rings(i)*plot_range*1000)/1000+round(oc.centre_value*1000)/1000) oc.ring_units],... |
---|
869 |
'FontSize',oc.ring_font_size, 'FontWeight',oc.ring_font_weight,... |
---|
870 |
'HorizontalAlignment','left', 'VerticalAlignment','bottom','Color',oc.ring_font_color,... |
---|
871 |
'HandleVisibility','off') |
---|
872 |
else |
---|
873 |
text(x,y,num2str(round(rings(i)*plot_range*1000)/1000+round(oc.centre_value*1000)/1000),... |
---|
874 |
'FontSize',oc.ring_font_size, 'FontWeight',oc.ring_font_weight,... |
---|
875 |
'HorizontalAlignment','left','VerticalAlignment','bottom','Color',oc.ring_font_color,... |
---|
876 |
'HandleVisibility','off') |
---|
877 |
end |
---|
878 |
end |
---|
879 |
end |
---|
880 |
end |
---|
881 |
|
---|
882 |
%Draw the angle markers |
---|
883 |
if strcmp(oc.angle_step,'') %if angle step not defined |
---|
884 |
phi = (oc.theta_start:360/no_angle_marks:oc.theta_start+359)*pi/180; %angle of marks |
---|
885 |
phit = oc.theta_start:360/no_angle_marks:oc.theta_start+359; %angle of labels |
---|
886 |
else %if angle step defined |
---|
887 |
phi = (oc.theta_start:oc.angle_step:oc.theta_start+359)*pi/180; |
---|
888 |
phit = oc.theta_start:oc.angle_step:oc.theta_start+359; |
---|
889 |
end |
---|
890 |
|
---|
891 |
%only draw the angle axis and its labels if axis is not set of 'OFF' |
---|
892 |
if ~strcmpi(oc.angle_axis, 'off') & ~strcmpi(oc.angle_axis, 'none') |
---|
893 |
for i = 1:1:length(phi) |
---|
894 |
x = 1*cos(phi(i)); |
---|
895 |
y = 1*sin(phi(i)); |
---|
896 |
plot([0 x],[0 y],'Color',oc.angle_color,'LineStyle',oc.angle_style,'LineWidth',oc.angle_line_width,... |
---|
897 |
'HandleVisibility','off') |
---|
898 |
end |
---|
899 |
|
---|
900 |
%if labels should not be put on every anlge mark then change the text anlges accordingly |
---|
901 |
if oc.angle_label_step ~= 0 |
---|
902 |
phit = oc.theta_start:oc.angle_label_step:oc.theta_start+359; |
---|
903 |
end |
---|
904 |
|
---|
905 |
if strcmp(oc.theta_direction,'cw') |
---|
906 |
phit = -phit; |
---|
907 |
end |
---|
908 |
|
---|
909 |
%Draw on text labeling the angles |
---|
910 |
if ~strcmpi(oc.angle_label,'off') & ~strcmpi(oc.angle_label,'none') |
---|
911 |
for i = 1:1:length(phit) |
---|
912 |
x = 1*1.15*cos(phit(i)*pi/180); |
---|
913 |
y = 1*1.15*sin(phit(i)*pi/180); |
---|
914 |
% text(x,y,[num2str(abs(phit(i))-oc.theta_start) degrees_string],... |
---|
915 |
text(x,y,[num2str((abs(phit(i))-oc.theta_start)/15,'%02d') ':00'],... |
---|
916 |
'FontSize',oc.angle_font_size,'FontWeight',oc.angle_font_weight,... |
---|
917 |
'HorizontalAlignment','center','VerticalAlignment','middle',... |
---|
918 |
'Color',oc.angle_font_color,'HandleVisibility','off') |
---|
919 |
end |
---|
920 |
end |
---|
921 |
end |
---|
922 |
axis off |
---|
923 |
|
---|
924 |
|
---|
925 |
|
---|
926 |
|
---|
927 |
|
---|
928 |
|
---|
929 |
|
---|
930 |
|
---|
931 |
|
---|
932 |
|
---|
933 |
|
---|
934 |
|
---|
935 |
|
---|
936 |
|
---|
937 |
|
---|
938 |
|
---|
939 |
|
---|
940 |
|
---|
941 |
|
---|
942 |
|
---|
943 |
|
---|
944 |
|
---|
945 |
|
---|
946 |
|
---|
947 |
|
---|
948 |
|
---|
949 |
|
---|
950 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
951 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
952 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
953 |
% % |
---|
954 |
% SETUP THETA % |
---|
955 |
% % |
---|
956 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
957 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
958 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
959 |
%transform the input to plot out correctly in cartesian coordinates |
---|
960 |
function theta = SetupTheta(theta) |
---|
961 |
global oc |
---|
962 |
theta = theta + oc.theta_start/180*pi; |
---|
963 |
if strcmp(oc.theta_direction,'cw') |
---|
964 |
theta = -theta; |
---|
965 |
end |
---|
966 |
|
---|
967 |
|
---|
968 |
|
---|
969 |
|
---|
970 |
|
---|
971 |
|
---|
972 |
|
---|
973 |
|
---|
974 |
|
---|
975 |
|
---|
976 |
|
---|
977 |
|
---|
978 |
|
---|
979 |
|
---|
980 |
|
---|
981 |
|
---|
982 |
|
---|
983 |
|
---|
984 |
|
---|
985 |
|
---|
986 |
|
---|
987 |
|
---|
988 |
|
---|
989 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
990 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
991 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
992 |
% % |
---|
993 |
% SETUP R % |
---|
994 |
% % |
---|
995 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
996 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
997 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
998 |
function [norm_r, theta, PlotProperties] = SetupR(r, theta) |
---|
999 |
global oc DB |
---|
1000 |
|
---|
1001 |
%make a note of the original maximum and minimum values of r |
---|
1002 |
max_r = max(r); |
---|
1003 |
min_r = min(r); |
---|
1004 |
|
---|
1005 |
plot_range = oc.max_mag - oc.centre_value; |
---|
1006 |
|
---|
1007 |
%shift r values so minimum is at 0 + centre value difference |
---|
1008 |
norm_r = r - oc.centre_value; |
---|
1009 |
norm_r = norm_r/plot_range; %normalise r values between 0 and 1 where 0 is centre |
---|
1010 |
%value and 1 is max distance from centre (plot_range) |
---|
1011 |
%check all values and any that are negative (and therefore less than the centre value) are made |
---|
1012 |
%equal to the centre value |
---|
1013 |
for i = 1:1:length(norm_r) |
---|
1014 |
if norm_r(i) < 0 |
---|
1015 |
norm_r(i) = 0; |
---|
1016 |
end |
---|
1017 |
end |
---|
1018 |
|
---|
1019 |
%These normalised r values now need to be examined and any values outiside of the |
---|
1020 |
%the maximum magnitude need to be discarded. However, if there is interpolation between |
---|
1021 |
%2 points (one inside the max and one outside) then a new point on this interpolation needs |
---|
1022 |
%to be added in so the line from the point inside the axis still extends out to the outer |
---|
1023 |
%ring. Therefore, a new array of r values which only contain plottable values and additional |
---|
1024 |
%points that are needed is made. |
---|
1025 |
|
---|
1026 |
PlotNumCounter = 0; %Number of plots (ie number of sections within the unity circle) |
---|
1027 |
InPlotFlag = 0; %if 1, this flag means that current points are in a plotting section |
---|
1028 |
PlotStartFlag = ''; %This will be an array containing the start points for the plot sections |
---|
1029 |
PlotBreakFlag = ''; %This will be an array containing the break points for the plot sections |
---|
1030 |
|
---|
1031 |
for i = 1:1:length(norm_r) |
---|
1032 |
%the first point that is on or in the unity circle is allocated as the first section's start point |
---|
1033 |
if isempty(PlotStartFlag) & norm_r(i)<=1 |
---|
1034 |
PlotStartFlag = i; |
---|
1035 |
InPlotFlag = 1; |
---|
1036 |
PlotNumCounter = 1; |
---|
1037 |
else |
---|
1038 |
%If a point is outside the unity circle and not in the void between a break point |
---|
1039 |
%and start point then allocate the break point to the point previous to this one |
---|
1040 |
if(norm_r(i) > 1 & InPlotFlag == 1) |
---|
1041 |
PlotBreakFlag = [PlotBreakFlag i-1]; |
---|
1042 |
InPlotFlag = 0; |
---|
1043 |
end |
---|
1044 |
|
---|
1045 |
%If a point is on or in the unity circle and currently is in the void between a break |
---|
1046 |
%point and start point then allocate this point as the start point of a new section |
---|
1047 |
if(norm_r(i) <= 1 & InPlotFlag == 0) |
---|
1048 |
PlotStartFlag = [PlotStartFlag i]; |
---|
1049 |
InPlotFlag = 1; |
---|
1050 |
PlotNumCounter = PlotNumCounter + 1; |
---|
1051 |
end |
---|
1052 |
end |
---|
1053 |
end |
---|
1054 |
|
---|
1055 |
%finally, if the last point was in a plotting section then have to define it as the break point |
---|
1056 |
if(InPlotFlag == 1) |
---|
1057 |
PlotBreakFlag = [PlotBreakFlag length(norm_r)]; |
---|
1058 |
end |
---|
1059 |
|
---|
1060 |
|
---|
1061 |
%go through each of the start and end points and for each go to the point next to it that is in |
---|
1062 |
%the void (between start and break points) and calculate the gradient and then add in a point between |
---|
1063 |
%the void point and the valid point that lies on this gradient AND the unity circle. This procedure is |
---|
1064 |
%therefore only needed it a plot exists and it exceeds the unity boundary (ie the only break flag doesn't |
---|
1065 |
%index the last point in the set of data) |
---|
1066 |
if(PlotNumCounter > 0) |
---|
1067 |
for i = 1:1:PlotNumCounter |
---|
1068 |
if PlotStartFlag(i) ~= 1 %only look at section starts if its not the first point |
---|
1069 |
x = norm_r.*cos(theta); %need to recalculate x and y every time incase norm_r and |
---|
1070 |
y = norm_r.*sin(theta); %theta were changed in the previous loop |
---|
1071 |
|
---|
1072 |
%if the gradient between the void and valid points is infinity (ie x1=x2) then the line equation |
---|
1073 |
%simple becomes x=b, where b is the x coordinate of both points. We also know that for our wanted |
---|
1074 |
%point to be on the unity circle we need 1=sqrt(x^2+y^2) => 1=x^2+y^2. Therefore, as x=b, we can |
---|
1075 |
%find y as: |
---|
1076 |
% y = 1-x^2 = 1-b^2 |
---|
1077 |
% |
---|
1078 |
%Now, if the void point is in the y>0 quadrants, then the crossing point must occur in the y>0 part |
---|
1079 |
%of the unity circle. Conversely, if the void point has y<0, then the cross point must occur in the |
---|
1080 |
%y<0 semicircle of the unty circle |
---|
1081 |
if x(PlotStartFlag(i))==x(PlotStartFlag(i)-1) |
---|
1082 |
Voidx = x(PlotStartFlag(i)); |
---|
1083 |
Voidy = 1-Voidx^2; |
---|
1084 |
if(y(PlotStartFlag(i)-1)<0) |
---|
1085 |
Voidy = -Voidy; |
---|
1086 |
end |
---|
1087 |
%however, if the gradient is defined, then we need to calc the gradient to find the point on the |
---|
1088 |
%unity circle |
---|
1089 |
else |
---|
1090 |
if x(PlotStartFlag(i)-1)<x(PlotStartFlag(i)) |
---|
1091 |
gradient = (y(PlotStartFlag(i)) - y(PlotStartFlag(i)-1))/(x(PlotStartFlag(i)) - x(PlotStartFlag(i)-1)); |
---|
1092 |
elseif x(PlotStartFlag(i)-1)>x(PlotStartFlag(i)) |
---|
1093 |
% x(PlotStartFlag(i)) |
---|
1094 |
% y(PlotStartFlag(i)) |
---|
1095 |
% keyboard |
---|
1096 |
% r(PlotStartFlag(i)) |
---|
1097 |
gradient = (y(PlotStartFlag(i)-1) - y(PlotStartFlag(i)))/(x(PlotStartFlag(i)-1) - x(PlotStartFlag(i))); |
---|
1098 |
end |
---|
1099 |
%C is y intercept of y=mx+c eqation for a straign line |
---|
1100 |
C = y(PlotStartFlag(i)) - gradient*x(PlotStartFlag(i)); |
---|
1101 |
m = gradient; |
---|
1102 |
|
---|
1103 |
%at the crossing point between line bewteen void and valid and unity circle we know the x,y |
---|
1104 |
%coordinates must satisfy the straight line eqn y=mx+c and 1=sqrt(x^2+y^2) => 1=x^2+y+2. |
---|
1105 |
%Rearranging this yeilds |
---|
1106 |
% 0 = (m^2+1)x^2 + (2mc)x + (c^2-1) |
---|
1107 |
% |
---|
1108 |
%the roots of this can be solved and x found. Note that there will always be one or two |
---|
1109 |
%real roots as this procedure is only being implemented when the line DOES cross the unity |
---|
1110 |
%circle (there will only be one root when the line is a tangent to the unit circle). |
---|
1111 |
Voidx = roots([m^2+1 2*m*C C^2-1]); |
---|
1112 |
Voidy = m*Voidx+C; |
---|
1113 |
%if there are two roots, check which x coordinate is between the void point and valid point |
---|
1114 |
%and then use that as the true coordinate |
---|
1115 |
x_limits = [x(PlotStartFlag(i)-1) x(PlotStartFlag(i))]; |
---|
1116 |
y_limits = [y(PlotStartFlag(i)-1) y(PlotStartFlag(i))]; |
---|
1117 |
if length(Voidx) == 2 |
---|
1118 |
if Voidx(1)>min(x_limits) & Voidx(1)<max(x_limits) & Voidy(1)>min(y_limits) & Voidy(1)<max(y_limits) |
---|
1119 |
Voidx = Voidx(1); |
---|
1120 |
Voidy = Voidy(1); |
---|
1121 |
else |
---|
1122 |
Voidx = Voidx(2); |
---|
1123 |
Voidy = Voidy(2); |
---|
1124 |
end |
---|
1125 |
end |
---|
1126 |
end |
---|
1127 |
|
---|
1128 |
%insert new point into array or points |
---|
1129 |
norm_r = [norm_r(1:PlotStartFlag(i)-1); sqrt(Voidx^2+Voidy^2); norm_r(PlotStartFlag(i):length(norm_r))]; |
---|
1130 |
|
---|
1131 |
%insert new angle into array of angles |
---|
1132 |
if(Voidx == 0) |
---|
1133 |
new_theta = pi/2*sign(Voidy); %this puts the point in the correct quadrant (CA or ST) |
---|
1134 |
else |
---|
1135 |
new_theta = atan(Voidy/Voidx); |
---|
1136 |
%if x is negative then the definition of atan needs to be added to 180 degrees |
---|
1137 |
if(Voidx < 0) |
---|
1138 |
new_theta = pi+new_theta; |
---|
1139 |
end |
---|
1140 |
end |
---|
1141 |
theta = [theta(1:PlotStartFlag(i)-1); new_theta; theta(PlotStartFlag(i):length(theta))]; |
---|
1142 |
|
---|
1143 |
%increment appropiate indecies in PlotStart and PlotBreak flags to take into accout the new points |
---|
1144 |
%(remembering you want the new points to be within the plotting segement) |
---|
1145 |
if(i < PlotNumCounter) %if not at the last PlotStartFlag |
---|
1146 |
PlotStartFlag(i+1:PlotNumCounter) = PlotStartFlag(i+1:PlotNumCounter) + 1; |
---|
1147 |
end |
---|
1148 |
PlotBreakFlag(i:PlotNumCounter) = PlotBreakFlag(i:PlotNumCounter) + 1; |
---|
1149 |
end |
---|
1150 |
|
---|
1151 |
%now do the same thing for the break flags, ie going from valid point to void |
---|
1152 |
%But only consider if the break is NOT the first element, or the break is NOT the last element |
---|
1153 |
if (PlotBreakFlag(i) ~= length(norm_r)) |
---|
1154 |
x = norm_r.*cos(theta); %need to recalc x and y incase norm_r and theta were changed in previous |
---|
1155 |
y = norm_r.*sin(theta); %if statement (for PlotStartFlag) or previous loop |
---|
1156 |
|
---|
1157 |
%refer to previous IF statement (for PlotStartFlag) for full explanation |
---|
1158 |
if x(PlotBreakFlag(i))==x(PlotBreakFlag(i)+1) |
---|
1159 |
Voidx = x(PlotBreakFlag(i)); |
---|
1160 |
Voidy = 1-Voidx^2; |
---|
1161 |
if(y(PlotBreakFlag(i)+1)<0) |
---|
1162 |
Voidy = -Voidy; |
---|
1163 |
end |
---|
1164 |
else |
---|
1165 |
if x(PlotBreakFlag(i)+1)<x(PlotBreakFlag(i)) |
---|
1166 |
gradient = (y(PlotBreakFlag(i)) - y(PlotBreakFlag(i)+1))/(x(PlotBreakFlag(i)) - x(PlotBreakFlag(i)+1)); |
---|
1167 |
elseif x(PlotBreakFlag(i)+1)>x(PlotBreakFlag(i)) |
---|
1168 |
gradient = (y(PlotBreakFlag(i)+1) - y(PlotBreakFlag(i)))/(x(PlotBreakFlag(i)+1) - x(PlotBreakFlag(i))); |
---|
1169 |
end |
---|
1170 |
%C is y intercept of y=mx+c eqation for a straign line |
---|
1171 |
C = y(PlotBreakFlag(i)) - gradient*x(PlotBreakFlag(i)); |
---|
1172 |
m = gradient; |
---|
1173 |
|
---|
1174 |
Voidx = roots([m^2+1 2*m*C C^2-1]); |
---|
1175 |
Voidy = m*Voidx+C; |
---|
1176 |
%if there are two roots, check which x coordinate is between the void point and valid point |
---|
1177 |
%and then use that as the true coordinate |
---|
1178 |
x_limits = [x(PlotBreakFlag(i)+1) x(PlotBreakFlag(i))]; |
---|
1179 |
y_limits = [y(PlotBreakFlag(i)+1) y(PlotBreakFlag(i))]; |
---|
1180 |
if length(Voidx) == 2 |
---|
1181 |
if Voidx(1)>min(x_limits) & Voidx(1)<max(x_limits) & Voidy(1)>min(y_limits) & Voidy(1)<max(y_limits) |
---|
1182 |
Voidx = Voidx(1); |
---|
1183 |
Voidy = Voidy(1); |
---|
1184 |
else |
---|
1185 |
Voidx = Voidx(2); |
---|
1186 |
Voidy = Voidy(2); |
---|
1187 |
end |
---|
1188 |
end |
---|
1189 |
end |
---|
1190 |
%insert new point into array or points |
---|
1191 |
|
---|
1192 |
norm_r = [norm_r(1:PlotBreakFlag(i)); sqrt(Voidx^2+Voidy^2); norm_r(PlotBreakFlag(i)+1:length(norm_r))]; |
---|
1193 |
|
---|
1194 |
%calculate and insert new angle into array of angles |
---|
1195 |
if(Voidx == 0) |
---|
1196 |
new_theta = pi/2*sign(Voidy); |
---|
1197 |
else |
---|
1198 |
new_theta = atan(Voidy/Voidx); |
---|
1199 |
%if x is negative then the definition of atan needs to be added to 180 degrees |
---|
1200 |
if(Voidx < 0) |
---|
1201 |
new_theta = pi+new_theta; |
---|
1202 |
end |
---|
1203 |
end |
---|
1204 |
theta = [theta(1:PlotBreakFlag(i)); new_theta; theta(PlotBreakFlag(i)+1:length(theta))]; |
---|
1205 |
|
---|
1206 |
%increment appropiate indecies in PlotBreak and PlotBreak flags to take into accout the new points |
---|
1207 |
%(remembering you want the new points to be within the plotting segement) |
---|
1208 |
if(i < PlotNumCounter) %if not at the last PlotBreakFlag |
---|
1209 |
PlotStartFlag(i+1:PlotNumCounter) = PlotStartFlag(i+1:PlotNumCounter) + 1; |
---|
1210 |
end |
---|
1211 |
PlotBreakFlag(i:PlotNumCounter) = PlotBreakFlag(i:PlotNumCounter) + 1; |
---|
1212 |
end |
---|
1213 |
end |
---|
1214 |
end |
---|
1215 |
|
---|
1216 |
PlotProperties{1} = PlotNumCounter; |
---|
1217 |
PlotProperties{2} = PlotStartFlag; |
---|
1218 |
PlotProperties{3} = PlotBreakFlag; |
---|
1219 |
|
---|
1220 |
|
---|
1221 |
|
---|
1222 |
|
---|
1223 |
|
---|
1224 |
|
---|
1225 |
|
---|
1226 |
|
---|
1227 |
|
---|
1228 |
|
---|
1229 |
|
---|
1230 |
|
---|
1231 |
|
---|
1232 |
|
---|
1233 |
|
---|
1234 |
|
---|
1235 |
|
---|
1236 |
|
---|
1237 |
|
---|
1238 |
|
---|
1239 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1240 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1241 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1242 |
% % |
---|
1243 |
% PLOT TRACE % |
---|
1244 |
% % |
---|
1245 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1246 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1247 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1248 |
function PlotTrace(theta, norm_r, PlotProperties, TraceProps) |
---|
1249 |
|
---|
1250 |
PlotNumCounter = PlotProperties{1}; |
---|
1251 |
PlotStartFlag = PlotProperties{2}; |
---|
1252 |
PlotBreakFlag = PlotProperties{3}; |
---|
1253 |
|
---|
1254 |
x = norm_r.*cos(theta); |
---|
1255 |
y = norm_r.*sin(theta); |
---|
1256 |
|
---|
1257 |
handle_visibility = 'on'; %first segment trace is to have a handle that can be access by prompt |
---|
1258 |
|
---|
1259 |
%(eg - to use to make the legend) |
---|
1260 |
%if there are any plot sections to plot then go ahead and plot |
---|
1261 |
if(PlotNumCounter > 0) |
---|
1262 |
for i = 1:1:PlotNumCounter %for each plot section redefine x and y between the start and break flags |
---|
1263 |
x = norm_r(PlotStartFlag(i):PlotBreakFlag(i)).*cos(theta(PlotStartFlag(i):PlotBreakFlag(i))); |
---|
1264 |
y = norm_r(PlotStartFlag(i):PlotBreakFlag(i)).*sin(theta(PlotStartFlag(i):PlotBreakFlag(i))); |
---|
1265 |
%plot the thing - FINALLY |
---|
1266 |
|
---|
1267 |
line_handle = plot(x,y,'LineWidth', TraceProps.line_width, 'LineStyle',TraceProps.line_style,'Color',TraceProps.line_color,... |
---|
1268 |
'Marker',TraceProps.line_marker, 'HandleVisibility',handle_visibility); |
---|
1269 |
handle_visibility = 'off'; %once the first trace segment is plotted, want the remaining handles hidden so |
---|
1270 |
end %the legend doesn't display them, but moves straight onto the next trace |
---|
1271 |
end |
---|
1272 |
|
---|
1273 |
|
---|
1274 |
|
---|
1275 |
|
---|
1276 |
|
---|
1277 |
|
---|
1278 |
|
---|
1279 |
|
---|
1280 |
|
---|
1281 |
|
---|
1282 |
|
---|
1283 |
|
---|
1284 |
|
---|
1285 |
|
---|
1286 |
|
---|
1287 |
|
---|
1288 |
|
---|
1289 |
|
---|
1290 |
|
---|
1291 |
|
---|
1292 |
|
---|
1293 |
|
---|
1294 |
|
---|
1295 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1296 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1297 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1298 |
% % |
---|
1299 |
% CHECK PLOT LIMITS % |
---|
1300 |
% % |
---|
1301 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1302 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1303 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1304 |
function CheckPlotLimits |
---|
1305 |
|
---|
1306 |
global oc Traces |
---|
1307 |
|
---|
1308 |
%Make up maximum magnitudes and minimum magnitudes |
---|
1309 |
if ~isnumeric(oc.max_mag) |
---|
1310 |
if strcmp(lower(oc.max_mag),'max') |
---|
1311 |
TraceMax = ''; |
---|
1312 |
for i = 1:2:length(Traces) |
---|
1313 |
TraceMax = [TraceMax max(Traces{i}(:,1))]; |
---|
1314 |
end |
---|
1315 |
oc.max_mag = max(TraceMax); |
---|
1316 |
else |
---|
1317 |
DispError('"MaxValue" must be a value or "max"'); |
---|
1318 |
return |
---|
1319 |
end |
---|
1320 |
end |
---|
1321 |
|
---|
1322 |
if ~isnumeric(oc.centre_value) |
---|
1323 |
if strcmp(lower(oc.centre_value), 'min') |
---|
1324 |
TraceMin = ''; |
---|
1325 |
for i = 1:2:length(Traces) |
---|
1326 |
TraceMin = [TraceMin min(Traces{i}(:,1))]; |
---|
1327 |
end |
---|
1328 |
oc.centre_value = min(TraceMin); |
---|
1329 |
else |
---|
1330 |
DispError('"CentreValue" must be a value or "min"'); |
---|
1331 |
return |
---|
1332 |
end |
---|
1333 |
end |
---|
1334 |
|
---|
1335 |
%make sure input is not bogus |
---|
1336 |
if oc.max_mag < oc.centre_value |
---|
1337 |
DispError('Centre value is larger than maximum input value'); |
---|
1338 |
return |
---|
1339 |
end |
---|
1340 |
|
---|
1341 |
if oc.max_mag == oc.centre_value |
---|
1342 |
DispError('Centre value is same as maximum input value - define CentreValue if all r values are same - see help'); |
---|
1343 |
return |
---|
1344 |
end |
---|
1345 |
|
---|
1346 |
|
---|
1347 |
|
---|
1348 |
|
---|
1349 |
|
---|
1350 |
|
---|
1351 |
|
---|
1352 |
|
---|
1353 |
|
---|
1354 |
|
---|
1355 |
|
---|
1356 |
|
---|
1357 |
|
---|
1358 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1359 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1360 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1361 |
% % |
---|
1362 |
% CHECK STANDARD PLOT % |
---|
1363 |
% % |
---|
1364 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1365 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1366 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1367 |
%This function will check a string that is a shortcut plotting string incorperating the marker, style and color. |
---|
1368 |
%It will return seperate color, marker and style strings if they are found in the combined string. If the |
---|
1369 |
%combined string has a syntax error then the function will exit the m file and return an error referring the |
---|
1370 |
%user to the HELP PLOT help command. |
---|
1371 |
function [Color, Marker, Style] = CheckStandardPlot(PlotString) |
---|
1372 |
|
---|
1373 |
LineColorFlag = 0; |
---|
1374 |
LineMarkerFlag = 0; |
---|
1375 |
LineStyleFlag = 0; |
---|
1376 |
|
---|
1377 |
Color = ''; |
---|
1378 |
Marker = ''; |
---|
1379 |
Style = ''; |
---|
1380 |
|
---|
1381 |
%check the standard_plot variable. If it is not emplty, that means the user has selected the PLOT |
---|
1382 |
%functions shortcut arguments to make a plot. Therefore, convert these arguments to the appropriate |
---|
1383 |
%line color and style. Note, that this will overwrite future uses of LineColor and LineStyle in the |
---|
1384 |
%arguments |
---|
1385 |
|
---|
1386 |
if length(PlotString) > 4 | isempty(PlotString) %color, marker, style |
---|
1387 |
DispError(['Incorrect plot parameters: ''' PlotString '''. Type HELP PLOT to see correct usage']); |
---|
1388 |
return |
---|
1389 |
end |
---|
1390 |
i = 1; |
---|
1391 |
while i <= length(PlotString) |
---|
1392 |
c = PlotString(i); %temp character variable |
---|
1393 |
%check the color |
---|
1394 |
if (c == 'y' | c == 'm' | c == 'c' | c == 'r' | c == 'g' | c == 'b' | c == 'w' | c == 'k') & LineColorFlag == 0 |
---|
1395 |
LineColorFlag = 1; |
---|
1396 |
Color = c; |
---|
1397 |
|
---|
1398 |
%check the marker style |
---|
1399 |
elseif (c == '.' | c == 'o' | c == 'x' | c == '+' | c == '*' | c == 's' | c == 'd' | ... |
---|
1400 |
c == 'v' | c == '^' | c == '<' | c == '>' | c == 'p' | c == 'h') & LineMarkerFlag == 0 |
---|
1401 |
LineMarkerFlag = 1; |
---|
1402 |
Marker = c; |
---|
1403 |
|
---|
1404 |
%check the line style |
---|
1405 |
elseif (c == '-' | c == ':') & LineStyleFlag == 0 %| c == '-.' | c == '--' %THIS NEEDS FIXING |
---|
1406 |
LineStyleFlag = 1; |
---|
1407 |
Style = c; |
---|
1408 |
if(c == '-' & i < length(PlotString) ) |
---|
1409 |
if PlotString(i+1) == '.' | PlotString(i+1) == '-' |
---|
1410 |
Style = [Style PlotString(i+1)]; |
---|
1411 |
i = i + 1; |
---|
1412 |
end |
---|
1413 |
end |
---|
1414 |
%if neither color nor marker nor style then error |
---|
1415 |
else |
---|
1416 |
DispError(['Incorrect plot parameters: ''' PlotString '''. Type HELP PLOT to see correct usage']); |
---|
1417 |
return |
---|
1418 |
end |
---|
1419 |
i = i+1; |
---|
1420 |
end |
---|
1421 |
|
---|
1422 |
|
---|
1423 |
|
---|
1424 |
|
---|
1425 |
|
---|
1426 |
|
---|
1427 |
|
---|
1428 |
|
---|
1429 |
|
---|
1430 |
|
---|
1431 |
|
---|
1432 |
|
---|
1433 |
|
---|
1434 |
|
---|
1435 |
|
---|
1436 |
|
---|
1437 |
|
---|
1438 |
|
---|
1439 |
|
---|
1440 |
|
---|
1441 |
|
---|
1442 |
|
---|
1443 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1444 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1445 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1446 |
% % |
---|
1447 |
% DISP ERROR % |
---|
1448 |
% % |
---|
1449 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1450 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1451 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1452 |
function DispError(ErrorString) |
---|
1453 |
|
---|
1454 |
global ErrorFlag |
---|
1455 |
|
---|
1456 |
ErrorFlag = 1; |
---|
1457 |
disp(sprintf('\nPP ERROR: %s\n Type "help pp" for information\n\n', ErrorString)); |
---|
1458 |
|
---|
1459 |
|
---|
1460 |
|
---|
1461 |
|
---|
1462 |
|
---|
1463 |
|
---|
1464 |
|
---|
1465 |
|
---|
1466 |
|
---|
1467 |
|
---|
1468 |
|
---|
1469 |
|
---|
1470 |
|
---|
1471 |
|
---|
1472 |
|
---|
1473 |
|
---|
1474 |
|
---|
1475 |
|
---|
1476 |
|
---|
1477 |
|
---|
1478 |
|
---|
1479 |
|
---|
1480 |
|
---|
1481 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1482 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1483 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1484 |
% % |
---|
1485 |
% DISP ERROR % |
---|
1486 |
% % |
---|
1487 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1488 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1489 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1490 |
function AssignStyle(ppStyle) |
---|
1491 |
|
---|
1492 |
global oc ErrorFlag |
---|
1493 |
|
---|
1494 |
switch ppStyle |
---|
1495 |
case 0 |
---|
1496 |
return |
---|
1497 |
|
---|
1498 |
%%%%%%%%%% DEFAULT STYLE %%%%%%%%%%% |
---|
1499 |
case 1 |
---|
1500 |
oc.angle_color = [0 0 0]; |
---|
1501 |
oc.ring_color = [0 0 0]; |
---|
1502 |
oc.angle_style = ':'; |
---|
1503 |
oc.ring_style = ':'; |
---|
1504 |
oc.angle_line_width = 0.1; |
---|
1505 |
oc.ring_line_width = 0.1; |
---|
1506 |
oc.ring_units = ''; |
---|
1507 |
oc.angle_degree_mark = 'off'; |
---|
1508 |
|
---|
1509 |
%%%%%%%%% SOLID AXIS in DB Style %%%%%%%% |
---|
1510 |
case 2 |
---|
1511 |
oc.angle_color = [0.5 0.5 0.5]; |
---|
1512 |
oc.ring_color = [0.5 0.5 0.5]; |
---|
1513 |
oc.angle_style = '-'; |
---|
1514 |
oc.ring_style = '-'; |
---|
1515 |
oc.angle_line_width = 0.1; |
---|
1516 |
oc.ring_line_width = 0.1; |
---|
1517 |
oc.ring_units = 'dB'; |
---|
1518 |
oc.angle_degree_mark = 'on'; |
---|
1519 |
|
---|
1520 |
%%%%%%% UNDEFINED STYLE %%%%%%% |
---|
1521 |
otherwise |
---|
1522 |
ErrorFlag = 1; |
---|
1523 |
DispError('ppStyle number not Valid.'); |
---|
1524 |
end |
---|
1525 |
|
---|
1526 |
return |
---|
1527 |
|
---|
1528 |
|
---|
1529 |
|
---|
1530 |
|
---|
1531 |
|
---|
1532 |
|
---|
1533 |
|
---|
1534 |
|
---|
1535 |
|
---|
1536 |
|
---|
1537 |
|
---|
1538 |
|
---|
1539 |
|
---|
1540 |
|
---|
1541 |
|
---|
1542 |
|
---|
1543 |
|
---|
1544 |
|
---|
1545 |
|
---|
1546 |
|
---|
1547 |
|
---|
1548 |
|
---|
1549 |
|
---|
1550 |
|
---|
1551 |
|
---|
1552 |
%## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ## |
---|
1553 |
%# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # |
---|
1554 |
% # |
---|
1555 |
% Variable Information and Explanation # |
---|
1556 |
% # |
---|
1557 |
%# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # |
---|
1558 |
%## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ## |
---|
1559 |
|
---|
1560 |
%----------------------------------------------------------------------------------------- |
---|
1561 |
% |
---|
1562 |
% tc: (trace cell) |
---|
1563 |
% Trace properties structure |
---|
1564 |
% |
---|
1565 |
%----------------------------------------------------------------------------------------- |
---|
1566 |
% |
---|
1567 |
% oc: (options cell) |
---|
1568 |
% Plot/Figure/Axes properties structure |
---|
1569 |
% |
---|
1570 |
%----------------------------------------------------------------------------------------- |
---|
1571 |
% |
---|
1572 |
% args: |
---|
1573 |
% Cell matrix containing possible property strings the user can enter and the actions to |
---|
1574 |
% take when the user enters them |
---|
1575 |
% |
---|
1576 |
% eg: A row in args might be: |
---|
1577 |
% |
---|
1578 |
% 'NumRings' 1 'v' oc.number_of_rings |
---|
1579 |
% |
---|
1580 |
% | | | | |
---|
1581 |
% Property Name FLAG indicating Data type variable to store |
---|
1582 |
% data follows expected data to |
---|
1583 |
% property |
---|
1584 |
% |
---|
1585 |
% NB: if FLAG is 0, then whatever is in the third column gets stored in the 4th column variable |
---|
1586 |
% |
---|
1587 |
%----------------------------------------------------------------------------------------- |
---|
1588 |
% |
---|
1589 |
% UserData: |
---|
1590 |
% 1 x n array of cells: (n = Num Traces + 2) |
---|
1591 |
% {1} - "Bob's Polar Plot" string for plot identification |
---|
1592 |
% {2} - oc (figure properties) |
---|
1593 |
% {3} - i x 2 matrix of trace data (columns of Rho and Theta) (i = length(Theta)) |
---|
1594 |
% {4} - tc (trace properties of trace in {3}) |
---|
1595 |
% {5} - k x 2 matrix of trace data (columns of Rho` and Theta`) (k = length(Theta`)) |
---|
1596 |
% {6} - tc` (trace properties or trace in {5}) |
---|
1597 |
% : |
---|
1598 |
% : |
---|
1599 |
% |
---|
1600 |
%----------------------------------------------------------------------------------------- |
---|
1601 |
% |
---|
1602 |
% Traces: |
---|
1603 |
% 1 x n-2 array of cells: |
---|
1604 |
% {1} - same as UserData{3} |
---|
1605 |
% {2} - same as UserData{4} |
---|
1606 |
% {3} - same as UserData{5} |
---|
1607 |
% {4} - same as UserData{6} |
---|
1608 |
% : |
---|
1609 |
% : |
---|
1610 |
% |
---|
1611 |
%----------------------------------------------------------------------------------------- |
---|