如何绘制超平面穿过一个点的3D散点图?

时间:2019-05-12 10:50:01

标签: matlab plot data-visualization polygon scatter-plot

我的意思是将以下两张图片组合在一起:

enter image description here

enter image description here

我需要超平面通过第3行中的点。我想出了一些代码,但是它根本不显示任何平面。

Data = [3.95, 13.83, 4.12; 2.77, 15.34, 5.85; 4.41, 14.66, 5.548 ]
x= Data(:,1); 
y= Data(:,2); 
z= Data(:,3);

pointA = [4.4, 14.7, 5.5];
pointB = [4.4, 14.7, 5.5];
pointC =  [4.4, 14.7, 5.5];
pointD = [4.4, 14.7, 5.5];


normal = cross(pointA-pointB, pointA-pointC)
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);
hold on 
plot3(x,x,z, '.', 'markersize', 30);

有什么想法我可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

在这里,尝试一下:

function q56099751
data = [3.95, 13.83, 4.12
        2.77, 15.34, 5.85
        4.41, 14.66, 5.548 ];

x = data(:,1); 
y = data(:,2); 
z = data(:,3); 

% Scatter:
figure(); scatter3(x,y,z,'filled'); hold on;

% Planes:
extents = zeros(3,2);
[extents(1,1), extents(1,2)] = bounds(x);
[extents(2,1), extents(2,2)] = bounds(y);
[extents(3,1), extents(3,2)] = bounds(z);
% extents = extents .* [0.9 1.1]; % See what happens when you uncomment this

for ind1 = 1:numel(x)
  planesThroughPoint(x(ind1), y(ind1), z(ind1), extents , [1 1 0]);
end

function planesThroughPoint(ptX, ptY, ptZ, extents, whichPlane)
if whichPlane(1)
% XY Plane
XYZ = [extents(1,1) extents(2,1) ptZ
       extents(1,2) extents(2,1) ptZ
       extents(1,2) extents(2,2) ptZ
       extents(1,1) extents(2,2) ptZ];
patch( XYZ(:,1), XYZ(:,2), XYZ(:,3), 'r', 'FaceAlpha', 0.2);
end

if whichPlane(2)
% XZ Plane
XYZ = [extents(1,1) ptY extents(3,1)
       extents(1,2) ptY extents(3,1)
       extents(1,2) ptY extents(3,2)
       extents(1,1) ptY extents(3,2)];
patch( XYZ(:,1), XYZ(:,2), XYZ(:,3), 'g', 'FaceAlpha', 0.2);
end

if whichPlane(3)
% YZ Plane
XYZ = [ptX extents(2,1) extents(3,1)
       ptX extents(2,2) extents(3,1)
       ptX extents(2,2) extents(3,2)
       ptX extents(2,1) extents(3,2)];
patch( XYZ(:,1), XYZ(:,2), XYZ(:,3), 'b', 'FaceAlpha', 0.2);
end

此代码可以产生的一些示例(取决于您如何配置):

XY + XZ

XY + YZ

XY + XZ + YZ, additional extents

如果您希望飞机只经过一个点,请不要使用循环,而应将正确的XYZ坐标提供给planesThroughPoint

相关问题