Search code examples
matlabmatlab-figurelinear-algebra

Plane outside the expected area


Idea

Im trying to plot a plane delimited by two vectors, using cross in matlab

Code

NM= [1 3; 2 4]                                 //matrix  
figure
hold on;
z = zeros(size(NM, 1), 1);                    //to use quiver3
quiver3(z, z, z, NM(:,1), NM(:,2), z, 0);     //vectors plotted
grid on
view(45, 45);
s=sum(NM);
p = 10*(rand(3,1) - 0.5);                     //  generation of points
O1=[NM(1,:) 0]                                // new vectors of length 3 ,
O2=[NM(2,:) 0]                                // to be used by cross
v3 = cross(O1,O2)                             //cross product to find the norm
[ x , y ] = meshgrid( p(1)+(-5:5) , p(2)+(-5:5) );   // points inside the plane
z = p(3) - (v3(1)*(x-p(1)) + v3(2)*(y-p(2)))/v3(3);  // plane equation
surf(x,y,z)                                   //the plane itself

The output is enter image description here

Issue
The plane must be delimited by the vectors or the vectors must be inside the plane not outside.


Solution

  • The vectors do not appear inside the plane because you are choosing (0,0,0) as the starting point of the vectors while you are making the plane pass by the randomly chosen point p.

    You either make the plane pass by (0,0,0) or use p as the starting point for the vectors when plotted with quiver3().

    Here is a solution where I have chosen the second option:

    vplane = [1 3 0; 2 4 0]';                                                   % (column) vectors defining the plane
    vnormal = cross(vplane(:,1), vplane(:,2));                                  % normal defining the orientation of the plane
    
    figure; hold on; grid on; view(45, 45);
    rng(1313)                                                                   % seed for reproducible output
    p = 10*(rand(3,1) - 0.5);                                                   % a point defining the position of the plane we want to plot with the given normal vector
    P = repmat(p, 1, 2);                                                        % matrix with the given point repeated for easier use of quiver3()
    quiver3(P(1,:), P(2,:), P(3,:), vplane(1,:), vplane(2,:), vplane(3,:), 0);  % arrows representing the vectors defining the plane
    [x,y] = meshgrid( p(1)+(-5:5), p(2)+(-5:5) );                               % set of equally spaced points inside the plane
    z = p(3) - (vnormal(1)*(x-p(1)) + vnormal(2)*(y-p(2))) / vnormal(3);        % plane equation
    surf(x,y,z)                                                                 % plot the plane
    

    and the result is the following: enter image description here