【问题标题】:How to plot a 3D scatter with hyperplanes going through a point?如何绘制通过一个点的超平面的 3D 散点图?
【发布时间】:2019-05-12 10:50:00
【问题描述】:

我的意思是下面两张图片的组合:

我需要超平面通过第 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);

知道如何解决这个问题吗?

【问题讨论】:

  • 如果你想要 "vertical" 和 "horizo​​ntal" 平面,你不需要找到平面的法线(法线已经笛卡尔坐标系的主要单位向量...)。同样在您的示例中,您的 pointAPointD 都是相同的,当您计算您的 normal 时,您期望什么?

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


【解决方案1】:

在这里,试试这个:

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

这个代码可以产生什么的几个例子(取决于你如何配置它):

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 2018-06-24
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2021-05-16
    相关资源
    最近更新 更多