How can I rotate a vector by a certain amount along a specific plane?

I have three points in inertial space which is enough to specify a plane. I have a vector that lies in this plane, and would like to rotate this vector so that it becomes perpendicular with its original self, through a rotation about the plane. For example:
my points:
a=[1 .3 .5];
b=[0 0 0];
c=[4 5 6];
%plane passes through points a, b, and c, a is the vector to rotate
EDIT
I mean to say a rotation on the plane (rotating with the pivot being the origin 0,0,0)

 Accepted Answer

To find the vector that is in the same plane as the points c, a, and b, which is orthogonal to a we must:
1) first find the vector that is orthogonal to the plane CAB that passes through point b.
2) Rotate a about this vector 90 degrees.
To do this we can use the procedure described by @Bjorn Gustavsson(vector g is the plane that is orthogonal to plane c,a, and b)
Then, using the rodrigues equation (Rodrigues' rotation formula - Wikipedia), we plug in a for v, and k for g with theta being pi/2 and finally we obtain our correct vector.

More Answers (1)

Simply take another vector that lies in your plane, here c (you should understand why we can use c straight away). Then form an array that's in the plane but perpendicular to a:
d = c-dot(c,a)*a;
Then you get a vector that's perpendicular to a:
g = cross(a,d);
Here you'll have to plug in a normalization in order to not scale a. That was for rotating a out of the plane. For the rotation around the normal-vector of the plane you're close to done after the calculation of d - just normalize it to give it the same length as a.
HTH

8 Comments

My mistake, I mean to say a rotation on the plane (rotating with the pivot being the origin 0,0,0) not about the plane.
Ok, so then use that part of my solution.
Where do I normalize a? Before computing g or after? Then how do I rotate a with d?
Attached is a visualization of what my c,a, and g vectors look like.
a is actually a velocity vector, for the point c. I am trying to find the vector perpendicular to this velocity vector that lies in the plane that passes through all the points ABC. Clearly in the figure, the vector g, is perpendicular to c, but it lies outside of this plane.
OK, fixed a typo. The vector d lies in the plane you want and is perpendicultar to a - provided the array c does not happen to be parallel or anti-parallel with a (which is statistically improbable, but you should most likely check for that). This is easy to see if you sketch on paper - you'll just imagine being lucky enough that your plane lies perfectly aligned with the paper. Since this array is perpendicular to a you only need to scale it to have the same length as a, if you have a direction-preference you might also multipy the vector with -1.
d = c-dot(c,a)*a/norm(a)^2; % perp to a
d = d*norm(a)/norm(d); % scaled to same length
HTH
Thanks for the response. This seems to give me a d that is perpendicular to a but does not lie in the same plane as c and a. I've edited the plot with the new d to represent which vector I want (the black line). This vector is both perpendicular to a and lies in the same plane that passes through the points b,c,a.
EDIT: the vectors with the bidirectional arrows indicate that they all lie in the same plane.
EDIT2: I mean to say the opposite, d in this case lies in the same plane but the angle between a and d is not 90 deg.
Thanks for the help, have a look at the answer- I may have complicated things a little bit but you definitely helped me get to where I needed.
OK, now I think I've fixed the typos properly. The correct equation should be:
d = c-dot(c,a/norm(a))*a/norm(a); % subtract the projection of c in the direction of a to get a vector perp to a
d = d*norm(a)/norm(d); % scaled to same length of a

Sign in to comment.

Categories

Find more on Read, Write, and Modify Image in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!