1 |
function hh = myquiver(arg1,arg2,arg3,arg4,arg5,arg6) |
2 |
%MYQUIVER Quiver (or velocity) plot. |
3 |
% MYQUIVER(X,Y,U,V) plots the velocity vectors with components |
4 |
% (u,v) at the points (x,y). The matrices X,Y,U,V must all be |
5 |
% the same size and contain the cooresponding position and |
6 |
% velocity components (X and Y can also be vectors to specify a |
7 |
% uniform grid). MYQUIVER automatically scales the velocity |
8 |
% vectors to fit within the grid. |
9 |
% |
10 |
% MYQUIVER(U,V) plots the velocity vectors at equally spaced |
11 |
% points in the x-y plane. |
12 |
% |
13 |
% MYQUIVER(X,Y,S) or MYQUIVER(X,Y,U,V,S,...) automatically scales |
14 |
% the velocity vectors to fit within the grid and then multiplies |
15 |
% them by S. Use S=0 to plot the velocity vectors without the |
16 |
% automatic scaling. |
17 |
% |
18 |
% MYQUIVER(...,STYLE) uses the plot linestyle specified by the string |
19 |
% STYLE for the velocity vectors. See PLOT for other linestyles. |
20 |
% |
21 |
% H = MYQUIVER(...) returns a vector of line handles. |
22 |
% |
23 |
% Example: |
24 |
% [x,y] = meshgrid(-2:.2:2,-1:.15:1); |
25 |
% z = x .* exp(-x.^2 - y.^2); [px,py] = gradient(z,.2,.15); |
26 |
% contour(x,y,z), hold on |
27 |
% myquiver(x,y,px,py), hold off, axis image |
28 |
% |
29 |
% See also: FEATHER, PLOT, QUIVER |
30 |
|
31 |
% Clay M. Thompson 3-3-94 |
32 |
% Copyright (c) 1994 by The MathWorks, Inc. |
33 |
% $Revision: 1.1.2.1 $ |
34 |
|
35 |
% modified D Menemenlis 28 mar 95 |
36 |
% modified from QUIVER for more consistent scaling |
37 |
% search for "modified" in text for details |
38 |
|
39 |
error(nargchk(2,6,nargin)); |
40 |
|
41 |
% Arrow head parameters |
42 |
alpha = 0.33; % Size of arrow head relative to the length of the vector |
43 |
beta = 0.33; % Width of the base of the arrow head relative to the length |
44 |
autoscale = 1; % Autoscale if ~= 0 then scale by this. |
45 |
|
46 |
% Check numeric input arguments |
47 |
if nargin<4 |
48 |
[msg,x,y,u,v] = xyzchk(arg1,arg2); |
49 |
elseif nargin==4 |
50 |
if isstr(arg4) |
51 |
[msg,x,y,u,v] = xyzchk(arg1,arg2); |
52 |
else |
53 |
[msg,x,y,u,v] = xyzchk(arg1,arg2,arg3,arg4); |
54 |
end |
55 |
else |
56 |
[msg,x,y,u,v] = xyzchk(arg1,arg2,arg3,arg4); |
57 |
end |
58 |
if ~isempty(msg), error(msg); end |
59 |
|
60 |
if nargin==2, % myquiver(u,v) |
61 |
lo = get(gca,'LineStyleOrder'); sym = lo(1,:); |
62 |
elseif nargin==3, % myquiver(u,v,s) or myquiver(u,v,'style') |
63 |
if isstr(arg3), |
64 |
sym = arg3; |
65 |
else |
66 |
autoscale = arg3; |
67 |
lo = get(gca,'LineStyleOrder'); sym = lo(1,:); |
68 |
end |
69 |
elseif nargin==4, % myquiver(x,y,u,v) or myquiver(x,y,s,'style') |
70 |
if isstr(arg4), |
71 |
autoscale = arg3; |
72 |
sym = arg4; |
73 |
else |
74 |
lo = get(gca,'LineStyleOrder'); sym = lo(1,:); |
75 |
end |
76 |
elseif nargin==5, % myquiver(x,y,u,v,s) or myquiver(x,y,u,v,'style') |
77 |
if isstr(arg5), |
78 |
sym = arg5; |
79 |
else |
80 |
autoscale = arg5; |
81 |
lo = get(gca,'LineStyleOrder'); sym = lo(1,:); |
82 |
end |
83 |
elseif nargin==6, % myquiver(x,y,u,v,s,style) |
84 |
autoscale = arg5; |
85 |
sym = arg6; |
86 |
end |
87 |
|
88 |
if autoscale, |
89 |
% Base autoscale value on average spacing in the x and y |
90 |
% directions. Estimate number of points in each direction as |
91 |
% either the size of the input arrays or the effective square |
92 |
% spacing if x and y are vectors. |
93 |
if min(size(x))==1, n=sqrt(prod(size(x))); m=n; else [m,n]=size(x); end |
94 |
|
95 |
% modified D Menemenlis 28 mar 95 |
96 |
% replaced "n" and "m" by "(n-1)" and "(m-1)" for more consistent scaling as |
97 |
% size of domain is increased |
98 |
delx = diff([min(x(find(~isnan(x)))) max(x(find(~isnan(x))))])/(n-1); |
99 |
dely = diff([min(y(find(~isnan(y)))) max(y(find(~isnan(y))))])/(m-1); |
100 |
|
101 |
len = sqrt((u/delx).^2 + (v/dely).^2); |
102 |
autoscale = autoscale*0.9 / max(len(find(~isnan(len)))); |
103 |
u = u*autoscale; v = v*autoscale; |
104 |
end |
105 |
|
106 |
ax = newplot; |
107 |
next = lower(get(ax,'NextPlot')); |
108 |
hold_state = ishold; |
109 |
|
110 |
% Make velocity vectors |
111 |
x = x(:).'; y = y(:).'; |
112 |
u = u(:).'; v = v(:).'; |
113 |
|
114 |
% modified D Menemenlis 28 mar 95 |
115 |
% added "+0*u" and "+0*v" to remove dots on plot for nans |
116 |
|
117 |
uu = [x+0*u;x+u;NaN*ones(size(u))]; |
118 |
vv = [y+0*v;y+v;NaN*ones(size(u))]; |
119 |
|
120 |
h = plot(uu(:),vv(:),sym); |
121 |
|
122 |
% Make arrow heads and plot them |
123 |
hu = [x+u-alpha*(u+beta*(v+eps));x+u; ... |
124 |
x+u-alpha*(u-beta*(v+eps));NaN*ones(size(u))]; |
125 |
hv = [y+v-alpha*(v-beta*(u+eps));y+v; ... |
126 |
y+v-alpha*(v+beta*(u+eps));NaN*ones(size(v))]; |
127 |
hold on |
128 |
h = [h;plot(hu(:),hv(:),sym)]; |
129 |
|
130 |
if ~hold_state, hold off, view(2); set(ax,'NextPlot',next); end |
131 |
|
132 |
if nargout>0, hh = h; end |