BillBokey给了我一个很好的答案: Find intersection between two data sets
[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')
接下来,我试图从A中提取与B相交的数据点,反之亦然。以下代码似乎不起作用。
Aint=Tmp(ids1,:);
Bint=Tmp(ids2,:);
我觉得它并不那么困难,但我一直在尝试解决方案无济于事。非常感谢帮助。
答案 0 :(得分:1)
很高兴看到我的最后一个答案帮助了你!
您正在寻找属于两个数据集的交叉点的A
(分别位于B
)中的点,这意味着您将拥有再次使用ids1&ids2
。
您知道Tmp
由2个区块构成,Tmp
的上半部分size(A,1)
行包含属于A
的点,并且Tmp
行的size(B,1)
行的下半部分包含属于B
的点
鉴于以下信息:
IntersectIdsInA=logical([ids1(1:size(A,1))&ids2(1:size(A,1));zeros(size(B,1),1)]);
IntersectIdsInB=logical([zeros(size(A,1),1);ids1(size(A,1)+1:end)&ids2(size(A,1)+1:end)]);
Aint=Tmp(IntersectIdsInA,:);
Bint=Tmp(IntersectIdsInB,:);
plot3(Aint(:,1),Aint(:,2),Aint(:,3),'pb','markersize',14);
plot3(Bint(:,1),Bint(:,2),Bint(:,3),'pg','markersize',14);
编辑:旁注
完全清理:
ids1
(resp ids2
)是一个包含1
的逻辑数组,其中Tmp
中的一个点位于{{1}的三角剖分中的一个四面体内(分别为A
)。这意味着B
会对ids1
的重合以及A
形成的卷中包含的B
中的点进行索引。与A
相同的推理。
因此,为了获得属于交叉点的ids2
中的点,您还可以在B
中删除属于ids1
的点,反之亦然:< / p>
A