2012-11-19 110 views
15

Tôi muốn vẽ một chiếc máy bay sử dụng một vector mà tôi tính toán từ 3 điểm nơi:Làm thế nào tôi có thể vẽ một mặt phẳng 3D trong Matlab?

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

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

Làm thế nào để vẽ 'plane1' trong không gian 3D?

+0

tôi tin rằng có một Trang web SE cho MATLAB. –

+0

không, lỗi của tôi -> http://area51.stackexchange.com/proposals/38040/matlab –

+0

Bạn rất có thể sẽ cần phải tạo ra một loạt các điểm trong mặt phẳng, và sau đó vẽ các điểm bằng cách sử dụng 'surf' hoặc một số chức năng tương tự ... – Isaac

Trả lời

26

Dưới đây là một cách dễ dàng để vẽ máy bay sử dụng 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

'fill3' take' X, Y, Z' làm đầu vào chứ không phải 3 điểm. Hãy nhìn vào mặt phẳng bạn vẽ, nó không đi qua '(0,0,0)'. Bạn đã vẽ một mặt phẳng đi qua '(0, -10,10)', '(0, -20,20)' và '(0,10,10)' –

+0

Theo tài liệu Matlab (dòng thứ 2 cho fill3) " fill3 (X, Y, Z, C) điền vào các đa giác ba chiều. X, Y và Z ba số xác định các đỉnh đa giác ".Tôi đã thực hiện một sai lầm mặc dù trong cách tôi nhập các điểm để 'fill3' (sai kích thước được sử dụng), và điều này bây giờ đã được sửa chữa. cảm ơn vì đã chú ý. Tôi vẫn nghĩ rằng một lớp lót đẹp hơn nhiều dòng ... – bla

+0

Đó là ok, bạn đã nhận được upvote của tôi, tôi chỉ muốn bạn sửa lỗi :) –

13

Bạn đã tính toán vector bình thường. Bây giờ bạn nên quyết định giới hạn của mặt phẳng của bạn là gì trong xz và tạo một miếng vá hình chữ nhật.

Giải thích: Mỗi mặt phẳng có thể được đặc trưng bởi vector bình thường (A,B,C) và hệ số khác D. Phương trình của mặt phẳng là AX+BY+CZ+D=0. Sản phẩm chéo giữa hai điểm khác biệt giữa các điểm, cross(P3-P1,P2-P1) cho phép tìm kiếm (A,B,C). Để tìm D, chỉ cần đặt bất kỳ điểm vào phương trình nêu trên:

D = -Ax-By-Cz; 

Một khi bạn có phương trình của mặt phẳng, bạn có thể mất 4 điểm nằm trên mặt phẳng này, và rút ra các bản vá giữa chúng.

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

Điều này không hoạt động nếu B là 0 – Eric

+0

@Eric, true, nó phải có các trường hợp khác cho số 0 hoặc gần với hệ số zeroes. –

+0

Xem câu trả lời của tôi cho giải pháp khác – Eric

1

Đây là những gì tôi đã đưa ra:

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 

nào bạn sẽ sử dụng như:

normal = cross(pointA-pointB, pointA-pointC); 
dist = dot(normal, pointA) 

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

Những âm mưu một hình vuông có độ dài cạnh 60 trên máy bay trong câu hỏi

0

Tôi muốn thêm vào câu trả lời được đưa ra bởi Andrey Rubshtein, mã của ông hoạt động hoàn toàn tốt ngoại trừ tại B = 0. Đây là phiên bản chỉnh sửa mã của ông

Dưới Mã hoạt động khi A không là 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); 

Dưới Mã hoạt động khi C không phải là 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

tại sao bạn sử dụng lại đơn đặt hàng? @ krishna-chaitanya –

Các vấn đề liên quan