<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/46925</link>
    <title>MATLAB Central Newsreader - How to draw &quot;double head arrow&quot;?</title>
    <description>Feed for thread: How to draw &quot;double head arrow&quot;?</description>
    <language>en-us</language>
    <copyright>&amp;copy;1994-2012 by MathWorks, Inc.</copyright>
    <webmaster>webmaster@mathworks.com</webmaster>
    <generator>MATLAB Central Newsreader</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <ttl>60</ttl>
    <image>
      <title>MathWorks</title>
      <url>http://www.mathworks.com/images/membrane_icon.gif</url>
    </image>
    <item>
      <pubDate>Fri, 21 Mar 2003 02:53:16 -0500</pubDate>
      <title>How to draw &quot;double head arrow&quot;?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/46925#119124</link>
      <author>Chia C Chong</author>
      <description>Hi there!&lt;br&gt;
&lt;br&gt;
I wish to draw a double head arrow (i.e. &amp;lt;------&amp;gt; ) in Matlab to show a&lt;br&gt;
section of the graph. But it seems to me, Matlab only allows arrow with a&lt;br&gt;
single head (i.e. ------&amp;gt;). So, my question is what should I do so that I&lt;br&gt;
can draw a double head arrow?&lt;br&gt;
&lt;br&gt;
Thanks.&lt;br&gt;
&lt;br&gt;
CCC</description>
    </item>
    <item>
      <pubDate>Fri, 21 Mar 2003 04:06:27 -0500</pubDate>
      <title>Re: How to draw &quot;double head arrow&quot;?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/46925#119126</link>
      <author>Dan Hensley</author>
      <description>On Fri, 21 Mar 2003 02:53:16 +0000, Chia C Chong wrote:&lt;br&gt;
&lt;br&gt;
&amp;gt; Hi there!&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I wish to draw a double head arrow (i.e. &amp;lt;------&amp;gt; ) in Matlab to show a&lt;br&gt;
&amp;gt; section of the graph. But it seems to me, Matlab only allows arrow with a&lt;br&gt;
&amp;gt; single head (i.e. ------&amp;gt;). So, my question is what should I do so that I&lt;br&gt;
&amp;gt; can draw a double head arrow?&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Thanks.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; CCC&lt;br&gt;
&lt;br&gt;
Why not draw one on top of the other, pointing in opposite directions?&lt;br&gt;
&lt;br&gt;
Dan</description>
    </item>
    <item>
      <pubDate>Fri, 21 Mar 2003 13:07:12 -0500</pubDate>
      <title>Re: How to draw &quot;double head arrow&quot;?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/46925#119165</link>
      <author>Chia C Chong</author>
      <description>So, is it means that there is actually no single function that allows me to&lt;br&gt;
draa double-arrow in Matlab??&lt;br&gt;
&lt;br&gt;
CCC&lt;br&gt;
&lt;br&gt;
&quot;Dan Hensley&quot; &amp;lt;danDOThensley@attbi.com&amp;gt; wrote in message&lt;br&gt;
news:pan.2003.03.21.04.06.26.258442@attbi.com...&lt;br&gt;
&amp;gt; On Fri, 21 Mar 2003 02:53:16 +0000, Chia C Chong wrote:&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; Hi there!&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; I wish to draw a double head arrow (i.e. &amp;lt;------&amp;gt; ) in Matlab to show a&lt;br&gt;
&amp;gt; &amp;gt; section of the graph. But it seems to me, Matlab only allows arrow with&lt;br&gt;
a&lt;br&gt;
&amp;gt; &amp;gt; single head (i.e. ------&amp;gt;). So, my question is what should I do so that&lt;br&gt;
I&lt;br&gt;
&amp;gt; &amp;gt; can draw a double head arrow?&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; Thanks.&lt;br&gt;
&amp;gt; &amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; CCC&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; Why not draw one on top of the other, pointing in opposite directions?&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; Dan</description>
    </item>
    <item>
      <pubDate>Fri, 21 Mar 2003 08:38:52 -0500</pubDate>
      <title>Re: How to draw &amp;quot;double head arrow&amp;quot;?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/46925#119175</link>
      <author>us</author>
      <description>you may want to look at a nice &amp;lt;spotlight&amp;gt; by former (?)&lt;br&gt;
TMW/CSSMer &amp;lt;nabeel&amp;gt; (wehre is he?) at&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;lt;&lt;a href=&quot;http://www.mathworks.com/matlabcentral/spotlight/arrows.shtml&quot;&gt;http://www.mathworks.com/matlabcentral/spotlight/arrows.shtml&lt;/a&gt;&amp;gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
us&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Chia C Chong wrote:&lt;br&gt;
&amp;gt; I wish to draw a double head arrow (i.e. &amp;lt;------&amp;gt; ) in Matlab&lt;br&gt;
to show a&lt;br&gt;
&amp;gt; section of the graph. But it seems to me, Matlab only allows arrow&lt;br&gt;
with a&lt;br&gt;
&amp;gt; single head (i.e. ------&amp;gt;).</description>
    </item>
    <item>
      <pubDate>Fri, 21 Mar 2003 08:42:17 -0500</pubDate>
      <title>Re: How to draw &quot;double head arrow&quot;?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/46925#119176</link>
      <author>us</author>
      <description>us wrote:&lt;br&gt;
&amp;gt; you may want to look at a nice &amp;lt;spotlight&amp;gt; by former (?)&lt;br&gt;
&amp;gt; TMW/CSSMer &amp;lt;nabeel&amp;gt; (wehre is he?)&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
i'm terribly sorry! i just realized that the &amp;lt;spotlight&amp;gt; was&lt;br&gt;
created by &amp;lt;ned gulley&amp;gt;.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
us</description>
    </item>
    <item>
      <pubDate>Fri, 21 Mar 2003 10:30:57 -0500</pubDate>
      <title>Re: How to draw &quot;double head arrow&quot;?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/46925#119206</link>
      <author>AJ \&quot;no z\&quot; Johnson</author>
      <description>&quot;Chia C Chong&quot; &amp;lt;Chia.Chong@ee.ed.ac.uk&amp;gt; wrote in message&lt;br&gt;
news:b5dur7$8qi$1@scotsman.ed.ac.uk...&lt;br&gt;
&amp;gt; Hi there!&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; I wish to draw a double head arrow (i.e. &amp;lt;------&amp;gt; ) in Matlab to show a&lt;br&gt;
&amp;gt; section of the graph. But it seems to me, Matlab only allows arrow with a&lt;br&gt;
&amp;gt; single head (i.e. ------&amp;gt;). So, my question is what should I do so that I&lt;br&gt;
&amp;gt; can draw a double head arrow?&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; Thanks.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; CCC&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt;&lt;br&gt;
&lt;br&gt;
Here is _yet another_ arrow function.&lt;br&gt;
The big drawback of all arrow fucntions I've tried is that changing the axis&lt;br&gt;
scale distorts the arrow.&lt;br&gt;
This arrow function (below) allows all arrows in all functions to be redrawn&lt;br&gt;
to be correctly displayed after one or more axis scales have changed, simply&lt;br&gt;
by typing &quot;arrow&quot;.&lt;br&gt;
FWIW,&lt;br&gt;
Aj&lt;br&gt;
&lt;br&gt;
------------- begin arrow.m -------------&lt;br&gt;
function hh=arrow5(varargin)&lt;br&gt;
%ARROW Draw an arrow.&lt;br&gt;
%   ARROW(tail,head) draw an arrow between the tail (x,y) and head (x,y)&lt;br&gt;
%&lt;br&gt;
%&lt;br&gt;
ARROW(tail,head,'Property1',PropertyValue1,'Property2',PropertyValue2,...)&lt;br&gt;
%   draw an arrow, and sets the values of the specified properties of the&lt;br&gt;
arrow.&lt;br&gt;
%&lt;br&gt;
%   ARROW('Property1',PropertyValue1,'Property2',PropertyValue2,...)&lt;br&gt;
%   draw an arrow, and set the values of the specified properties of the&lt;br&gt;
arrow.&lt;br&gt;
%   The 'head' and 'tail' properties must be specified.&lt;br&gt;
%&lt;br&gt;
%   ARROW(H,'Property1',PropertyValue1,'Property2',PropertyValue2,...)&lt;br&gt;
%   sets the values of the specified properties of an existing arrow.&lt;br&gt;
%&lt;br&gt;
%   H = ARROW(...) returns the handle to the line object used as the arrow.&lt;br&gt;
%&lt;br&gt;
%   ARROW  redraws all arrows (rescaling if required). This may affect the&lt;br&gt;
%   the values of gca and gcf.&lt;br&gt;
%&lt;br&gt;
%   Additional properties supported are:&lt;br&gt;
%     'size'   length of the arrow head, in inches (default 0.125)&lt;br&gt;
%     'direction'   direction of the arrow, 'forward', 'backward', or&lt;br&gt;
'double'&lt;br&gt;
%     'angle'  angle of the arrowhead&lt;br&gt;
%     'tail'   define [x,y] of tail of arrow&lt;br&gt;
%     'head'   define [x,y] of head of arrow&lt;br&gt;
%&lt;br&gt;
%   NOTES: The arrowhead is scaled to be drawn correctly when printed. It&lt;br&gt;
may&lt;br&gt;
%     appear skewed in the figure window. Also, any of the following may&lt;br&gt;
cause&lt;br&gt;
%     existing arrows to be rendered improperly:&lt;br&gt;
%       - the axes 'position' is changed&lt;br&gt;
%       - the axes 'xlim' or 'ylim' is changed&lt;br&gt;
%       - the figure 'PaperPosition' is changed&lt;br&gt;
%     In general, it is recommended that arrows be drawn last.&lt;br&gt;
%     Use ARROW with no arguments to redraw all arrows&lt;br&gt;
&lt;br&gt;
h = [];&lt;br&gt;
head = [];&lt;br&gt;
tail = [];&lt;br&gt;
&lt;br&gt;
if nargin == 0&lt;br&gt;
&amp;nbsp;&amp;nbsp;redraw_all_arrows; % sub-fuction speified below&lt;br&gt;
&amp;nbsp;&amp;nbsp;return&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
if mod(nargin,2) == 0&lt;br&gt;
&amp;nbsp;&amp;nbsp;% Even number of arguments&lt;br&gt;
&amp;nbsp;&amp;nbsp;if isreal(varargin{1}) &amp; isreal(varargin{2})&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;head = varargin{1};&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tail = varargin{2};&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;varargin(1:2) = [];&lt;br&gt;
&amp;nbsp;&amp;nbsp;end&lt;br&gt;
else&lt;br&gt;
&amp;nbsp;&amp;nbsp;% Odd number of arguments&lt;br&gt;
&amp;nbsp;&amp;nbsp;if isreal(varargin{1})&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% First arg is is: hopefully handle(s) to existing arrow(s)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;h = varargin{1};&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tag = get(h,'tag');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ~strcmp(tag,'arrow')&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error('Handle must an existing arrow')&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;varargin(1) = [];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;varargin = [get(h,'userdata'),varargin];&lt;br&gt;
&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error('Incorrect number of input arguments')&lt;br&gt;
&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
keeplist = [];&lt;br&gt;
discardlist = [];&lt;br&gt;
headsize = 0.125;&lt;br&gt;
ang = 15; % Angle of arrow&lt;br&gt;
direction = 'forward';&lt;br&gt;
for i=1:2:length(varargin)&lt;br&gt;
&amp;nbsp;&amp;nbsp;if ~isstr(varargin{i})&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error('Invalid property name');&lt;br&gt;
&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch lower(varargin{i})&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 'direction', direction = varargin{i+1};&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 'size', headsize = varargin{i+1};&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 'angle', ang = varargin{i+1};&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 'head', head = varargin{i+1};&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 'tail', tail = varargin{i+1};&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;otherwise, keeplist = [keeplist,i,i+1];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
varargin = varargin(keeplist);&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
x1 = head(1);&lt;br&gt;
x2 = tail(1);&lt;br&gt;
y1 = head(2);&lt;br&gt;
y2 = tail(2);&lt;br&gt;
%  x=[head(1),tail(1)]&lt;br&gt;
%  y=[head(2),tail(2)]&lt;br&gt;
if length(h) == 0&lt;br&gt;
&amp;nbsp;&amp;nbsp;h = plot([x1 x2],[y1 y2]); % Plot the basic arrow line&lt;br&gt;
&amp;nbsp;&amp;nbsp;a = gca; % Parent axes handle&lt;br&gt;
&amp;nbsp;&amp;nbsp;f = gcf; % Parent figure handle&lt;br&gt;
else&lt;br&gt;
&amp;nbsp;&amp;nbsp;a = get(h,'parent');&lt;br&gt;
&amp;nbsp;&amp;nbsp;f = get(a,'parent');&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
xlim = get(a,'xlim');&lt;br&gt;
ylim = get(a,'ylim');&lt;br&gt;
xd = diff(xlim);&lt;br&gt;
yd = diff(ylim);&lt;br&gt;
&lt;br&gt;
ppos_inch = get(f,'PaperPosition'); % Figure position on paper, in inches&lt;br&gt;
(left, bottom, width, height)&lt;br&gt;
apos_norm = get(a,'Position'); % Axes position on figure, normalized&lt;br&gt;
apos_inch = [&lt;br&gt;
&amp;nbsp;&amp;nbsp;ppos_inch(1)+apos_norm(1)*ppos_inch(3),&lt;br&gt;
&amp;nbsp;&amp;nbsp;ppos_inch(2)+apos_norm(2)*ppos_inch(4),&lt;br&gt;
&amp;nbsp;&amp;nbsp;apos_norm(3)*ppos_inch(3),&lt;br&gt;
&amp;nbsp;&amp;nbsp;apos_norm(4)*ppos_inch(4)];&lt;br&gt;
xscale = xd/apos_inch(3);&lt;br&gt;
yscale = yd/apos_inch(4);&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
len = sqrt(sum((head-tail).^2)); % Length of arrow&lt;br&gt;
&lt;br&gt;
baseline = (tail-head)./len; % unit vector long baseline&lt;br&gt;
baseline = baseline(1)/xscale+j*baseline(2)/yscale;&lt;br&gt;
baseline = baseline ./ abs(baseline);&lt;br&gt;
orient = headsize.*exp(j*ang*pi/180);&lt;br&gt;
&lt;br&gt;
p1=orient.*baseline;&lt;br&gt;
p2=conj(orient).*baseline;&lt;br&gt;
&lt;br&gt;
xp1=real(p1)*xscale;&lt;br&gt;
yp1=imag(p1)*yscale;&lt;br&gt;
xp2=real(p2)*xscale;&lt;br&gt;
yp2=imag(p2)*yscale;&lt;br&gt;
&lt;br&gt;
if strcmp(direction, 'backward') | strcmp(direction, 'double')&lt;br&gt;
&amp;nbsp;&amp;nbsp;x = [x1,x1+xp1,x1,x1+xp2,x1];&lt;br&gt;
&amp;nbsp;&amp;nbsp;y = [y1,y1+yp1,y1,y1+yp2,y1];&lt;br&gt;
else&lt;br&gt;
&amp;nbsp;&amp;nbsp;x=[x1];&lt;br&gt;
&amp;nbsp;&amp;nbsp;y=[y1];&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
if strcmp(direction, 'forward') | strcmp(direction, 'double')&lt;br&gt;
&amp;nbsp;&amp;nbsp;x = [x, x2,x2-xp1,x2,x2-xp2,x2];&lt;br&gt;
&amp;nbsp;&amp;nbsp;y = [y, y2,y2-yp1,y2,y2-yp2,y2];&lt;br&gt;
else&lt;br&gt;
&amp;nbsp;&amp;nbsp;x = [x, x2];&lt;br&gt;
&amp;nbsp;&amp;nbsp;y = [y, y2];&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
userdata = {'tail', tail, 'head', head, 'direction', direction, 'size',&lt;br&gt;
headsize, 'angle', ang};&lt;br&gt;
set(h,'tag','arrow','userdata',userdata,'xdata',x','ydata',y,varargin{:});&lt;br&gt;
&lt;br&gt;
if nargout &amp;gt; 0&lt;br&gt;
&amp;nbsp;&amp;nbsp;hh = h;&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
return&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&lt;br&gt;
function redraw_all_arrows(varargin)&lt;br&gt;
&lt;br&gt;
for f=get(0,'children')' % Loop over all figures&lt;br&gt;
&amp;nbsp;&amp;nbsp;for a=get(f,'children')' % Loop over all axes&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;h_list = get(a,'children');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for h=h_list' % Loop over all types&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type = get(h,'Type');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if isstr(Type) &amp; strcmp(Type,'line')&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if strcmp(get(h,'Tag'),'arrow') &amp; length(get(h,'userdata')) &amp;gt; 6&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args = [{h},varargin];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arrow(args{:}); % Redraw arrow&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
----------- end arrow ------------</description>
    </item>
  </channel>
</rss>

