How can I plot a 3D-plane in Matlab?

前端 未结 4 1880
你的背包
你的背包 2020-12-01 09:41

I would like to plot a plane using a vector that I calculated from 3 points where:

pointA = [0,0,0];
pointB = [-10,-20,10];
pointC = [10,20,10];

plane1 = cr         


        
相关标签:
4条回答
  • 2020-12-01 09:54

    I want to add to the answer given by Andrey Rubshtein, his code works perfectly well except at B=0. Here is the edited version of his code

    Below Code works when A is not 0

    normal = cross(pointA-pointB, pointA-pointC); 
    x = [pointA(1) pointB(1) pointC(1)];  
    y = [pointA(2) pointB(2) pointC(2)];
    z = [pointA(3) pointB(3) pointC(3)];  
    A = normal(1); B = normal(2); C = normal(3);
    D = -dot(normal,pointA);
    zLim = [min(z) max(z)];
    yLim = [min(y) max(y)];
    [Y,Z] = meshgrid(yLim,zLim);
    X = (C * Z + B * Y + D)/ (-A);
    reOrder = [1 2  4 3];
    figure();patch(X(reOrder),Y(reOrder),Z(reOrder),'r');
    grid on;
    alpha(0.3);
    

    Below Code works when C is not 0

    normal = cross(pointA-pointB, pointA-pointC); 
    x = [pointA(1) pointB(1) pointC(1)];  
    y = [pointA(2) pointB(2) pointC(2)];
    z = [pointA(3) pointB(3) pointC(3)];  
    A = normal(1); B = normal(2); C = normal(3);
    D = -dot(normal,pointA);
    xLim = [min(x) max(x)];
    yLim = [min(y) max(y)];
    [Y,X] = meshgrid(yLim,xLim);
    Z = (A * X + B * Y + D)/ (-C);
    reOrder = [1 2  4 3];
    figure();patch(X(reOrder),Y(reOrder),Z(reOrder),'r');
    grid on;
    alpha(0.3);
    
    0 讨论(0)
  • 2020-12-01 10:02

    Here's what I came up with:

    function [x, y, z] = plane_surf(normal, dist, size)
    
    normal = normal / norm(normal);
    center = normal * dist;
    
    tangents = null(normal') * size;
    
    res(1,1,:) = center + tangents * [-1;-1]; 
    res(1,2,:) = center + tangents * [-1;1]; 
    res(2,2,:) = center + tangents * [1;1]; 
    res(2,1,:) = center + tangents * [1;-1];
    
    x = squeeze(res(:,:,1));
    y = squeeze(res(:,:,2));
    z = squeeze(res(:,:,3));
    
    end
    

    Which you would use as:

    normal = cross(pointA-pointB, pointA-pointC);
    dist = dot(normal, pointA)
    
    [x, y, z] = plane_surf(normal, dist, 30);
    surf(x, y, z);
    

    Which plots a square of side length 60 on the plane in question

    0 讨论(0)
  • 2020-12-01 10:03

    Here's an easy way to plot the plane using fill3:

    points=[pointA' pointB' pointC']; % using the data given in the question
    fill3(points(1,:),points(2,:),points(3,:),'r')
    grid on
    alpha(0.3)
    

    enter image description here

    0 讨论(0)
  • 2020-12-01 10:14

    You have already calculated the normal vector. Now you should decide what are the limits of your plane in x and z and create a rectangular patch.

    An explanation : Each plane can be characterized by its normal vector (A,B,C) and another coefficient D. The equation of the plane is AX+BY+CZ+D=0. Cross product between two differences between points, cross(P3-P1,P2-P1) allows finding (A,B,C). In order to find D, simply put any point into the equation mentioned above:

       D = -Ax-By-Cz;
    

    Once you have the equation of the plane, you can take 4 points that lie on this plane, and draw the patch between them.

    enter image description here

    normal = cross(pointA-pointB, pointA-pointC); %# Calculate plane normal
    %# Transform points to x,y,z
    x = [pointA(1) pointB(1) pointC(1)];  
    y = [pointA(2) pointB(2) pointC(2)];
    z = [pointA(3) pointB(3) pointC(3)];
    
    %Find all coefficients of plane equation    
    A = normal(1); B = normal(2); C = normal(3);
    D = -dot(normal,pointA);
    %Decide on a suitable showing range
    xLim = [min(x) max(x)];
    zLim = [min(z) max(z)];
    [X,Z] = meshgrid(xLim,zLim);
    Y = (A * X + C * Z + D)/ (-B);
    reOrder = [1 2  4 3];
    figure();patch(X(reOrder),Y(reOrder),Z(reOrder),'b');
    grid on;
    alpha(0.3);
    
    0 讨论(0)
提交回复
热议问题