Circle plotting on different Planes

52 views (last 30 days)
Mazhar
Mazhar on 10 Sep 2013
Hey,
I am trying to plot a series of 2D circle in a 3D plot, which are all on slightly different planes (orientated at different angles).
The information I have is;
Centers of the circles;
X = [2 4 5 7];
Y = [0 2 1 0];
Z = [1 3 5 7];
The radii for the circles are the same at 0.5 units.
When I plot these circles I want to see them orientated so that the normal from each circle is pointing in the direction of the next circle. In other words, the plane the circle is drawn on will be perpendicular to the line joining the centers.
the final picture would look like a small section of a pipe.
How could I achieve this?
All help is greatly appreciated.

Accepted Answer

Attila
Attila on 10 Sep 2013
Edited: Attila on 10 Sep 2013
Hi,
so your problem is more like math-related right?
If you already have the coordinates of the unoriented circle points, you should multiply them with the result of this, like
Rotated = Rx * Ry * Rz * original
(first circle with the first 3 matrices, etc):
clear all, close all, clc
X = [2 4 5 7];
Y = [0 2 1 0];
Z = [1 3 5 7];
r = 0.5
Coords = [X;Y;Z]
Coords_inc = Coords;
Coords_inc(:,3) = Coords(:,4) - Coords(:,3);
Coords_inc(:,2) = Coords(:,3) - Coords(:,2);
Coords_inc(:,1) = Coords(:,2) - Coords(:,1)
x = 1;
y = 2;
z = 3;
hold on
color = ['r' 'g' 'b' 'k'];
theta = -atan(Coords_inc(y,:)./Coords_inc(z,:)); % angle around x
phi = atan(Coords_inc(x,:)./Coords_inc(z,:));% angle 2 (y)
psi = atan(Coords_inc(y,:)./Coords_inc(x,:));% angle 3 (z)
for i=1:4
Rx = [1 0 0; 0 cos(theta(i)) -sin(theta(i)); 0 sin(theta(i)) cos(theta(i))]
Ry = [cos(phi(i)) 0 sin(phi(i)); 0 1 0; -sin(phi(i)) 0 cos(phi(i))]
Rz = [cos(psi(i)) -sin(psi(i)) 0; sin(psi(i)) cos(psi(i)) 0; 0 0 1]
t = 0:0.1:2*pi
x = cos(t)
y = sin(t)
z = zeros(1,length(t))
tol = [X(i); Y(i); Z(i)]
base = [x;y;z]
rotated = Rx*Ry*Rz*base
plot3(rotated(1,:)+X(i),rotated(2,:)+Y(i),rotated(3,:)+Z(i), color(i))
axis equal
end
This code snippet calculates the required orientations and then builds the required rotation matrices.
  7 Comments
Mazhar
Mazhar on 11 Sep 2013
Got it to work :D
Thanks for your help!

Sign in to comment.

More Answers (2)

Matt J
Matt J on 10 Sep 2013
You could start by plotting a prototype circle in the xy plane. Then roto-translate them in 3D using a transformation
R*points + t
where R is a 3x3 rotation matrix and t is a translation vector. This FEX file might help with that
Finally, use scatter3() to plot the transformed points.
  4 Comments
Mazhar
Mazhar on 10 Sep 2013
Also, If my circle does not have a set radius, but I have several radii data for each point of the data. How can I add in a loop to be able to plot such a circle (or shape, as it might not be completely circular)

Sign in to comment.


Grzegorz Knor
Grzegorz Knor on 10 Sep 2013
Edited: Grzegorz Knor on 10 Sep 2013
Try this code:
X = [2 4 5 7];
Y = [0 2 1 0];
Z = [1 3 5 7];
r = 0.5;
[x,y,z] = cylinder(r*ones(size(X)),100);
hold on
for k=length(X):-1:1
x(k,:) = x(k,:)+X(k);
y(k,:) = y(k,:)+Y(k);
z(k,:) = z(k,:)+Z(k);
h(k) = plot3(x(k,:),y(k,:),z(k,:),'r-');
direction = rand(1,3);
alpha = randi(90);
rotate(h(k),direction,alpha)
end
hold off
view(3)
axis equal
I've used random rotation directions and angles. Just calculate the proper values and replace in the code above.
  3 Comments
Mazhar
Mazhar on 10 Sep 2013
Almost, just the other way round.
The first circle should be horizontal (flat) and the corresponding circle should be perpendicular to the line joining its center and the one before.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!