How to plot circle with direction?

I wish to plot a circle with direction of its motion.An exmaple is attached below.Path_Ideal.jpg
I wish to get around 5-10 arrows per circle (that can be chnaged as per our need).
Below attached matlab.mat file is the data file.
The code goes like:
subplot(2,2,[1 3])
h1 = plot(x, y, '-','Color','b','LineWidth',2);
Now I dont know how to put 5-10 arrows showing direction.
Can anyone help?

Answers (1)

Bruno Luong
Bruno Luong on 10 Sep 2019
Edited: Bruno Luong on 10 Sep 2019
2D version. adapt to your need
% circle parameter
r = 5;
cx = 0;
cy = 0;
cfun = @(tt) [cx+r*cos(tt); cy+r*sin(tt)];
xy = cfun(linspace(0,2*pi,361));
close all
hold on
plot(xy(1,:),xy(2,:),'b');
% arrows parameters
m = 10; % number of arrows
h = 0.1*r; % height
w = 0.1*r; % width
dir = -1; % 1 anticlock, -1 clock
a = [-w/2 0 w/2;
-dir*h 0 -dir*h];
for k=1:m
tt = 2*pi*k/m;
R = [cos(tt) -sin(tt);
sin(tt) cos(tt)];
xy = cfun(tt)+ R*a;
plot(xy(1,:),xy(2,:),'b');
end
axis equal

5 Comments

3D version:
% circle parameters
r = 5;
cxyz = [0; 0; 0]; % center
N = randn(3,1); % normal to circle plane
N = N(:)/norm(N);
Q = null(N');
cfun = @(tt) cxyz + r*Q*[cos(tt); sin(tt)];
close all
hold on
xyz = cfun(linspace(0,2*pi,361));
plot3(xyz(1,:),xyz(2,:),xyz(3,:),'b');
% 3D arrows parameters
m = 10; % number of arrows
h = 0.12*r; % height
w = 0.08*r; % width
dir = -1; % 1 anticlock, -1 clock
p = 16; % #circular discretization of the arrow
phi = linspace(0,2*pi,p+1);
Va = [(w/2)*cos(phi);
(-dir*h)+zeros(size(phi));
(w/2)*sin(phi)];
Va(:,end+1) = [0; 0; 0];
F = [ 1:p;
2:p+1;
(p+2)+zeros(1,p)].';
F2 = 1:p+1;
Q = [Q, N];
for k=1:m
tt = 2*pi*k/m;
R = [cos(tt) -sin(tt) 0;
sin(tt) cos(tt) 0;
0 0 1];
Vk = cfun(tt)+ Q*R*Va;
patch('Faces', F, 'Vertices', Vk', 'FaceColor', 'b', 'EdgeColor', 'none');
patch('Faces', F2, 'Vertices', Vk', 'FaceColor', 'b', 'EdgeColor', 'none');
end
axis equal
view(3);
Megha
Megha on 11 Sep 2019
Edited: Megha on 11 Sep 2019
@Bruno Luong: you have definately put a lot of efforts and that I really appriciate.
Surely, this would be useful to me for my future reference.
Could you please help me out with the data that I have attached with this?
Or how to put arrows to the figure like goven below:1.jpg
Bruno Luong
Bruno Luong on 11 Sep 2019
Edited: Bruno Luong on 11 Sep 2019
No sorry, I won't process your data.
I let you adapt the code and plot exactly the way you like. If you have specific question feel free to ask.
I have tried the following code, but arrows are too close to each other, in this case, to see the dirction of motion of circle.
rMag = 0.5;
lenTime = length(x);
% Indices of tails of arrows
vSelect0 = 1:(lenTime-1);
% Indices of tails of arrows
vSelect1 = vSelect0 + 1;
% X coordinates of tails of arrows
vXQ0 = x(vSelect0, 1); % x last removed
% Y coordinates of tails of arrows
vYQ0 = y(vSelect0, 1); % y last removed
% X coordinates of heads of arrows
vXQ1 = x(vSelect1, 1); % x first removed
% Y coordinates of heads of arrows
vYQ1 = y(vSelect1, 1); % y first remove
% vector difference between heads & tails
vPx = (vXQ1 - vXQ0) * rMag;
vPy = (vYQ1 - vYQ0) * rMag;
% add arrows
h2 = quiver (vXQ0,vYQ0, vPx, vPy, 0, 'b'); grid on; hold off
axis equal
I'w suggest to set
X = 10; % this is step size - each 10th point will have a vector
vSelect0 = 1:X:(lenTime-1);

Sign in to comment.

Asked:

on 10 Sep 2019

Commented:

on 20 Jan 2021

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!