如何绘制超平面通过一个点的 3D 散点图?
How to plot a 3D scatter with hyperplanes going through a point?
我的意思是像下面两张图片的组合:
我需要超平面通过第 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);
知道如何解决这个问题吗?
在这里,试试这个:
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
。
我的意思是像下面两张图片的组合:
我需要超平面通过第 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);
知道如何解决这个问题吗?
在这里,试试这个:
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
。