如何在 Matlab 中绘制 3D 平面?

问题描述 投票:0回答:4

我想使用从 3 个点计算得出的向量来绘制一个平面,其中:

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

plane1 = cross(pointA-pointB, pointA-pointC)

如何以 3D 形式绘制“plane1”?

matlab plot
4个回答
32
投票

这是使用

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


16
投票

您已经计算了法向量。现在您应该决定

x
z
中平面的限制是什么,并创建一个矩形面片。

解释:每个平面都可以通过其法线向量

(A,B,C)
和另一个系数
D
来表征。平面方程为
AX+BY+CZ+D=0
。点之间的两个差异之间的叉积,
cross(P3-P1,P2-P1)
允许找到
(A,B,C)
。为了找到
D
,只需将任意点代入上述方程即可:

   D = -Ax-By-Cz;

一旦有了平面方程,您就可以取该平面上的 4 个点,并在它们之间绘制面片。

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);

2
投票

这是我的想法:

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

您将用作:

pointA = [0; 0; 0]; % <- Use column vectors instead of the row vectors from the question
pointB = [-10; -20; 10];
pointC = [10; 20; 10];
normal = cross(pointA-pointB, pointA-pointC);
dist = dot(normal, pointA)

[x, y, z] = plane_surf(normal, dist, 30);
surf(x, y, z);

在所讨论的平面上绘制边长为 60 的正方形:


0
投票

我想补充 Andrey Rubshtein 给出的答案,他的代码除了 B=0 之外运行得很好。这是他的代码的编辑版本

下面的代码在 A 不为 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);

以下代码在 C 不为 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);
© www.soinside.com 2019 - 2024. All rights reserved.