Найти пересечение между двумя наборами данных

я генерирую два массива, подобных этому:

[x,y,z] = sphere;
A=[x,y,z]
B=[x+0.5,y+0.5,z+0.5]

второй массив смещен к первому.

Я хотел бы найти пространство пересечения обоих этих массивов A и B.

в этом случае я использовал функцию сферы, но это можно сделать для любых двух массивов данных, не обязательно сферических. Есть ли способ сделать это?

Я включаю изображение для того, что я ищу. Я хочу найти перекресток между эти две области. Но эти значения не обязательно будут такими же, как вы видите.

Если у меня есть уравнение для пределов каждого из пространств, это облегчит задачу?

enter image description here

1 ответов


я заявил в комментариях, что можно использовать convhull и inpolygon чтобы решить эту проблему, только inpolygon похоже, не применяется к 3D-полигонам. Мы будем использовать delaunayTriangulation и pointLocation для того, чтобы добраться до результата

полный код :

[x,y,z] = sphere;
A=[x(:),y(:),z(:)];
B=[x(:)+0.5,y(:)+0.5,z(:)+0.5];

tess1=delaunayTriangulation(A); % delaunay Triangulation of points set A
tess2=delaunayTriangulation(B); % delaunay Triangulation of points set B

Tmp=[A;B];

% Point location searches for the triangles in the given delaunay     
% triangulation that contain the points specified in Tmp, here Tmp is 
% the reunion of sets A and B and we check for both triangulations
ids1=~isnan(pointLocation(tess1,Tmp));
ids2=~isnan(pointLocation(tess2,Tmp));

% ids1&ids2 is a logical array indicating which points
% in Tmp are in the intersection
IntersectPoints=Tmp(ids1&ids2,:);


plot3(A(:,1),A(:,2),A(:,3),'+b'); hold on
plot3(B(:,1),B(:,2),B(:,3),'+g');
plot3(IntersectPoints(:,1),IntersectPoints(:,2),IntersectPoints(:,3),'*r')

выход :

enter image description here

EDIT-2D пример:

[x,y,z] = sphere;
A=[x(:),y(:)];
B=[x(:)+0.5,y(:)+0.5];

tess1=delaunayTriangulation(A); % delaunay Triangulation of points set A
tess2=delaunayTriangulation(B); % delaunay Triangulation of points set B

Tmp=[A;B];

% Point location searches for the triangles in the given delaunay     
% triangulation that contain the points specified in Tmp, here Tmp is 
% the reunion of sets A and B and we check for both triangulations
ids1=~isnan(pointLocation(tess1,Tmp));
ids2=~isnan(pointLocation(tess2,Tmp));

% ids1&ids2 is a logical array indicating which points
% in Tmp are in the intersection
IntersectPoints=Tmp(ids1&ids2,:);


plot(A(:,1),A(:,2),'+b'); hold on
plot(B(:,1),B(:,2),'+g');
plot(IntersectPoints(:,1),IntersectPoints(:,2),'*r');

выход :

enter image description here

Edit 2:

если вы хотите, чтобы ваш код автоматически адаптировался к 2D или 3D массивам, вам просто нужно изменить вызовы сюжета. Просто напишите if оператор, который будет проверять количество столбцов в A и B