Skip to content

Commit f2a128f

Browse files
fix issue #253. More robust way to deal with quiver matlab function
1 parent 06237f7 commit f2a128f

File tree

1 file changed

+40
-9
lines changed

1 file changed

+40
-9
lines changed

plotly/plotlyfig_aux/handlegraphics/updateQuiver.m

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,26 +51,55 @@
5151
col = 255*quiver_data.Color;
5252
obj.data{quiverIndex}.line.color = ['rgb(' num2str(col(1)) ',' num2str(col(2)) ',' num2str(col(3)) ')'];
5353

54+
%-quiver line color-%
55+
obj.data{quiverIndex}.line.width = quiver_data.LineWidth;
56+
5457
%------------------------------------------------------------------------%
5558

5659
% check for x/y vectors
5760
if isvector(quiver_data.XData)
5861
[quiver_data.XData, quiver_data.YData] = meshgrid(quiver_data.XData,quiver_data.YData);
5962
end
6063

64+
%-get scale factor-%
65+
if strcmpi(quiver_data.AutoScale, 'on')
66+
xdata = quiver_data.XData;
67+
udata = quiver_data.UData;
68+
69+
nsteps = 45;
70+
steps = linspace(1e-3, 1, nsteps);
71+
steps = steps(end:-1:1);
72+
73+
for n = 1:nsteps
74+
scalefactor = steps(n);
75+
76+
x = xdata(:, 2:end, :);
77+
u = xdata(:, 1:end-1,:) + scalefactor * udata(:, 1:end-1,:);
78+
xflag = x>u;
79+
80+
if all(xflag(:))
81+
break
82+
end
83+
end
84+
else
85+
scalefactor = 1;
86+
end
87+
88+
%------------------------------------------------------------------------%
89+
6190
%-format data-%
62-
xdata = reshape(quiver_data.XData,1,size(quiver_data.XData,1)*size(quiver_data.XData,1));
63-
ydata = reshape(quiver_data.YData,1,size(quiver_data.YData,1)*size(quiver_data.YData,1));
64-
udata = reshape(quiver_data.UData,1,size(quiver_data.UData,1)*size(quiver_data.UData,1));
65-
vdata = reshape(quiver_data.VData,1,size(quiver_data.VData,1)*size(quiver_data.VData,1));
91+
xdata = quiver_data.XData(:);
92+
ydata = quiver_data.YData(:);
93+
udata = quiver_data.UData(:)*scalefactor;
94+
vdata = quiver_data.VData(:)*scalefactor;
6695

6796
%------------------------------------------------------------------------%
6897

6998
%-quiver x-%
7099
m = 1;
71100
for n = 1:length(xdata)
72101
obj.data{quiverIndex}.x(m) = xdata(n);
73-
obj.data{quiverIndex}.x(m+1) = xdata(n) + 0.1*udata(n);
102+
obj.data{quiverIndex}.x(m+1) = xdata(n) + udata(n);
74103
obj.data{quiverIndex}.x(m+2) = nan;
75104
m = m + 3;
76105
end
@@ -81,22 +110,24 @@
81110
m = 1;
82111
for n = 1:length(ydata)
83112
obj.data{quiverIndex}.y(m) = ydata(n);
84-
obj.data{quiverIndex}.y(m+1) = ydata(n) + 0.1*vdata(n);
113+
obj.data{quiverIndex}.y(m+1) = ydata(n) + vdata(n);
85114
obj.data{quiverIndex}.y(m+2) = nan;
86115
m = m + 3;
87116
end
88117

89118
%-------------------------------------------------------------------------%
90119

91120
%-quiver barbs-%
92-
if isHG2()
121+
if isHG2() && strcmp(quiver_data.ShowArrowHead, 'on')
122+
93123
% 'MaxHeadSize' scalar, matlab clips to 0.2 in r2014b
94124
maxheadsize = quiver_data.MaxHeadSize;
95125
% barb angular width, not supported by matlab
96126
head_width = deg2rad(17.5);
127+
97128
for n = 1:length(xdata)
98129
% length of arrow
99-
l = norm([0.1*udata(n), 0.1*vdata(n)]);
130+
l = norm([udata(n), vdata(n)]);
100131

101132
% angle of arrow
102133
phi = atan2(vdata(n),udata(n));
@@ -113,7 +144,7 @@
113144
barb_transformation = affine2d([...
114145
[cos(phi), sin(phi), 0]; ...
115146
[-sin(phi), cos(phi), 0]; ...
116-
[xdata(n) + 0.1*udata(n), ydata(n) + 0.1*vdata(n), 1];
147+
[xdata(n) + udata(n), ydata(n) + vdata(n), 1];
117148
]);
118149

119150
% place barb at end of arrow

0 commit comments

Comments
 (0)