Как построить трехмерный разброс с гиперплоскостями, проходящими через точку? - PullRequest
1 голос
/ 12 мая 2019

Я имею в виду что-то вроде следующих двух картинок вместе взятых:

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 голосов
/ 23 мая 2019

Вот, попробуйте это:

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.

...