22

次の 3 点から計算したベクトルを使用して平面をプロットしたいと思います。

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

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

「plane1」を 3D でプロットするにはどうすればよいですか?

4

4 に答える 4

31

を使用して平面をプロットする簡単な方法を次に示します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)

ここに画像の説明を入力

于 2012-11-20T00:40:53.187 に答える
16

すでに法線ベクトルを計算しています。ここで、平面の境界を決定し、長方形のパッチを作成する必要がxあります。z

説明: 各平面は、その法線ベクトル(A,B,C)と別の係数によって特徴付けることができますD。平面の方程式は ですAX+BY+CZ+D=0。ポイント間の 2 つの差の間の外積により、cross(P3-P1,P2-P1)を見つけることができます(A,B,C)。を見つけるDには、上記の式に任意の点を入れるだけです。

   D = -Ax-By-Cz;

平面の方程式を取得したら、この平面上にある 4 つの点を取り、それらの間にパッチを描くことができます。

ここに画像の説明を入力

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);
于 2012-11-20T12:15:40.093 に答える
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);
于 2016-03-28T14:16:02.460 に答える