How to draw vectors (physical 2D/3D vectors) in MATLAB?
I want to know the simplest way to plot vectors in MATLAB. For example:
a = [2 3 5]; b = [1 1 0]; c = a + b;
I want to visualize this vector addition as head-to-tail/parallelogram method. How do I plot these vectors with an arrow-head?
Answers
a = [2 3 5]; b = [1 1 0]; c = a+b; starts = zeros(3,3); ends = [a;b;c]; quiver3(starts(:,1), starts(:,2), starts(:,3), ends(:,1), ends(:,2), ends(:,3)) axis equal
I agree with Aamir that the submission arrow.m from Erik Johnson on the MathWorks File Exchange is a very nice option. You can use it to illustrate the different methods of vector addition like so:
Tip-to-tail method:
o = [0 0 0]; %# Origin a = [2 3 5]; %# Vector 1 b = [1 1 0]; %# Vector 2 c = a+b; %# Resultant arrowStarts = [o; a; o]; %# Starting points for arrows arrowEnds = [a; c; c]; %# Ending points for arrows arrow(arrowStarts,arrowEnds); %# Plot arrows
Parallelogram method:
o = [0 0 0]; %# Origin a = [2 3 5]; %# Vector 1 b = [1 1 0]; %# Vector 2 c = a+b; %# Resultant arrowStarts = [o; o; o]; %# Starting points for arrows arrowEnds = [a; b; c]; %# Ending points for arrows arrow(arrowStarts,arrowEnds); %# Plot arrows hold on; lineX = [a(1) b(1); c(1) c(1)]; %# X data for lines lineY = [a(2) b(2); c(2) c(2)]; %# Y data for lines lineZ = [a(3) b(3); c(3) c(3)]; %# Z data for lines line(lineX,lineY,lineZ,'Color','k','LineStyle',':'); %# Plot lines
I found this arrow(start, end) function on MATLAB Central which is perfect for this purpose of drawing vectors with true magnitude and direction.
I did it this way,
2D
% vectors I want to plot as rows (XSTART, YSTART) (XDIR, YDIR) rays = [ 1 2 1 0 ; 3 3 0 1 ; 0 1 2 0 ; 2 0 0 2 ; ] ; % quiver plot quiver( rays( :,1 ), rays( :,2 ), rays( :,3 ), rays( :,4 ) );
3D
% vectors I want to plot as rows (XSTART, YSTART, ZSTART) (XDIR, YDIR, ZDIR) rays = [ 1 2 0 1 0 0; 3 3 2 0 1 -1 ; 0 1 -1 2 0 8; 2 0 0 0 2 1; ] ; % quiver plot quiver3( rays( :,1 ), rays( :,2 ), rays( :,3 ), rays( :,4 ), rays( :,5 ), rays( :,6 ) );
Based on the quiver and quiver3 documentation
I'm not sure of a way to do this in 3D, but in 2D you can use the compass command.
% draw simple vector from pt a to pt b % wtr : with respect to scale=0;%for drawin vectors with true scale a = [10 20 30];% wrt origine O(0,0,0) b = [10 10 20];% wrt origine O(0,0,0) starts=a;% a now is the origine of my vector to draw (from a to b) so we made a translation from point O to point a = to vector a c = b-a;% c is the new coordinates of b wrt origine a ends=c;% plot3(a(1),a(2),a(3),'*b') hold on plot3(b(1),b(2),b(3),'*g') quiver3(starts(:,1), starts(:,2), starts(:,3), ends(:,1), ends(:,2), ends(:,3),scale);% Use scale = 0 to plot the vectors without the automatic scaling. % axis equal hold off